%option noyywrap
%{
#include <iostream.h>
#include "os.h"
OS jorgix;
#define YY_BREAK  \
		{ \
		cout<<jorgix.S.arreglo[jorgix.S.actual].nombre; \
		if (jorgix.usuario_actual==0) \
			cout<<" # > "; \
		else 	cout<<" $ > "; \
		break; \
		}
%}

USUARIO [a-zA-Z0-9]{1,19}
PASSWORD [a-zA-Z0-9]{1,19}
GRUPO   [a-zA-Z0-9]{1,19} 
DIR [a-zA-Z0-9]{1,8}
ARCHIVO [a-zA-Z0-9]{1,8}("."[a-zA-Z0-9]{1,3})?
HOME ("/"{DIR})+
AUT [0-7][0-7][0-7]
PATH "/"({DIR}"/")*{DIR}
FSYS [a-zA-Z0-9]{1,8}
TFSYS [0-9]{1,3}

ERROR .*
COMANDOS "comandos"
LOGIN	"login"
MANLOGIN "login".*
EXIT	"exit"
MANEXIT "exit".*
WHO	"who"
MANWHO  "who".*
NEWUSER "newuser -u "{USUARIO}" -p "{PASSWORD}
NGROUP  " -g "{GRUPO}
NHOME   " -h "{HOME}
MANNEWUSER "newuser".*
RMUSER  "rmuser "{USUARIO}
MANRMUSER "rmuser".*
NEWGROUP "newgroup "{GRUPO}
MANNEWGROUP "newgroup".* 
RMGROUP  "rmgroup "{GRUPO}
MANRMGROUP "rmgroup".*
ADDGROUP "addgroup "{USUARIO}" "{GRUPO}
MANADDGROUP "addgroup".*
DELGROUP "delgroup "{USUARIO}" "{GRUPO}
MANDELGROUP "delgroup".*
MKDIR "mkdir "{DIR}
MKDIRM "mkdir -m "{DIR}
MANMKDIR "mkdir".*
MKFILE "mkfile "{ARCHIVO}
MANMKFILE "mkfile".*
LS "ls"
MANLS "ls".*
CD "cd "(".."|{DIR})
MANCD "cd".*
CHOWN "chown "{ARCHIVO}" "{USUARIO}
MANCHOWN "chown".*
CHMOD "chmod "{AUT}" "{ARCHIVO}
MANCHMOD "chmod".*
CHGROUP "chgroup "{GRUPO}
CHGROUPD "chgroup"
MANCHGROUP "chgroup".*
PASSWD "passwd "{USUARIO}
PASSWDD "passwd"
MANPASSWD "passwd".*
PWD "pwd"
MANPWD "pwd".*
HIDE "hide "{ARCHIVO}
MANHIDE "hide".*
SHOW "show "{ARCHIVO}
MANSHOW "show".*
CP "cp "{ARCHIVO}" "{PATH}
MANCP "cp".*
RMFILE "rmfile "{ARCHIVO}
MANRMFILE "rmfile".*
RMDIR "rmdir "{DIR}
MANRMDIR "rmdir".*
MKSYS "mksys "{FSYS}" "{TFSYS}
MANMKSYS "mksys".*
MOUNT "mount "{FSYS}
MANMOUNT "mount".*
UMOUNT "umount "{FSYS}
MANUMOUNT "umount".*
LN "ln "("/"{DIR})*"/"{ARCHIVO}
MANLN "ln".*
RMLN "rmln "{ARCHIVO}
MANRMLN "rmln".*
CAT "vi "{ARCHIVO}
MANCAT "vi".*
VI "cat "{ARCHIVO}
MANVI "cat".*
RENAME "rename "{ARCHIVO}" "{ARCHIVO}
MANRENAME "rename".*
%%

{LOGIN} {
	jorgix.login();
	}

{MANLOGIN} {
	cout<<"Comando login:\nSirve para ingresar al sistema";
  	cout<<"\nUtilizacion: login"<<endl;	
	}

{EXIT}	{
	if (jorgix.exit()==1)
		return 1;
	}
{MANEXIT} {
	cout<<"Comando exit:\nSirve para salir del sistema";
  	cout<<"\nUtilizacion: exit"<<endl;	
	}

{WHO}	{
	jorgix.who();
	}
{MANWHO} {
	cout<<"Comando who:\nDespliega en pantalla los usuarios conectados";
  	cout<<"\nUtilizacion: who"<<endl;
	}
{NEWUSER}{NGROUP}{NHOME} {
	char comando[8];
	char iu[3];
	char u[20];
	char ip[3];
	char p[20];
	char ig[3];
	char g[20];
	char ih[3];
	char h[256];
	sscanf(yytext,"%s%s%s%s%s%s%s%s%s",comando,iu,u,ip,p,ig,g,ih,h); 
	jorgix.newuser(u,p,g,h);
 	  		}
{NEWUSER}{NGROUP} {
	char comando[8];
	char iu[3];
	char u[20];
	char ip[3];
	char p[20];
	char ig[3];
	char g[20];
	char h[256]="/home/";
	sscanf(yytext,"%s%s%s%s%s%s%s",comando,iu,u,ip,p,ig,g); 
	strcat(h,u);
	jorgix.newuser(u,p,g,h);
 		}
{NEWUSER}{NHOME} {
	char comando[8];
	char iu[3];
	char u[20];
	char ip[3];
	char p[20];
	char g[20]="root";
	char ih[3];
	char h[256];
	sscanf(yytext,"%s%s%s%s%s%s%s",comando,iu,u,ip,p,ih,h); 
	jorgix.newuser(u,p,g,h);
 		}
{NEWUSER} {
	char comando[8];
	char iu[3];
	char u[20];
	char ip[3];
	char p[20];
	char g[20]="root";
	char h[256]="/home/";
	sscanf(yytext,"%s%s%s%s%s",comando,iu,u,ip,p); 
	strcat(h,u);
	jorgix.newuser(u,p,g,h);
 	 }
{MANNEWUSER} {
		cout<<"Comando newuser:\nSirve para agregar usuarios\n";
		cout<<"Utilizacion: newuser -u usuario -p password ";
		cout<<"[-g grupo] [-h homedir]"<<endl;
		}

{RMUSER}  {
		char comando[7];
		char nombre[20];
		sscanf(yytext,"%s%s",comando,nombre);
		jorgix.rmuser(nombre);
	  } 

{MANRMUSER} {
	cout<<"Comando rmuser:\nSirve para eliminar usuarios del sistema";
	cout<<"\nUtilizacion: rmuser usuario"<<endl;
	}

{NEWGROUP} {
	char comando[9];
	char g[20];
	sscanf(yytext,"%s%s",comando,g);
	jorgix.newgroup(g);
	}

{MANNEWGROUP} {
	cout<<"Comando newgroup:\nSirve para agregar un grupo al sistema";
	cout<<"\nUtilizacion: newgroup grupo"<<endl;
	}
	

{RMGROUP} {
	char comando[8];
	char g[20];
	sscanf(yytext,"%s%s",comando,g);
	jorgix.rmgroup(g);
	}	
{MANRMGROUP} {
	cout<<"Comando rmgroup:\nSirve para eliminar un grupo del sistema";
	cout<<"\nUtilizacion: rmgroup grupo"<<endl;
	}

{ADDGROUP} {
	char comando[9];
	char u[20];
	char g[20];
	sscanf(yytext,"%s%s%s",comando,u,g);
	jorgix.addgroup(u,g);
	}

{MANADDGROUP} {
	cout<<"Comando addgroup:\nSirve para agregar usuarios a un grupo del";
	cout<<" sistema"; 	
	cout<<"\nUtilizacion: addgroup usuario grupo"<<endl;
	}

{DELGROUP} {
	char comando[9];
	char u[20];
	char g[20];
	sscanf(yytext,"%s%s%s",comando,u,g);
	jorgix.delgroup(u,g);
	}

{MANDELGROUP} {
	cout<<"Comando delgroup:\nSirve para eliminar usuarios de un grupo";
 	cout<<" del sistema"; 	
	cout<<"\nUtilizacion: delgroup usuario grupo"<<endl;
	}

{MKDIR} {
	char comando[6];
	char dir[13];
	sscanf(yytext,"%s%s",comando,dir);
	jorgix.mkdir(dir);
	}

{MKDIRM} {
	char comando[6];
	char id[3];
	char dir[13];
	sscanf(yytext,"%s%s%s",comando,id,dir);
	jorgix.mkdirm(dir);
	}

{MANMKDIR} {
	cout<<"Comando mkdir:\n Sirve para crear directorios o puntos de montaje";
	cout<<"\n Utilizacion: mkdir [-m] directorio"<<endl;
	}


{MKFILE} {
	char comando[7];
	char archivo[13];
	sscanf(yytext,"%s%s",comando,archivo);
	jorgix.mkfile(archivo);
	}

{MANMKFILE} {
	cout<<"Comando mkfile:\n Sirve para crear archivos";
	cout<<"\n Utilizacion: mkfile archivo"<<endl;
	}


{CD} {
	char comando[3];
	char dir[13];
	sscanf(yytext,"%s%s",comando,dir);
	jorgix.cd(dir);
	}

{MANCD} {
	cout<<"Comando cd:\n Sirve para cambiar de directorio";
	cout<<"\n Utilizacion: cd directorio|.."<<endl;
	}
{LS} {jorgix.ls();}

{MANLS} {
	cout<<"Comando ls:\n Sirve listar el contenido de un directorio";
	cout<<"\n Utilizacion: ls"<<endl;
	}

{CHOWN} {
	char comando[6];
	char archivo[13];
	char usuario[20];
	sscanf(yytext,"%s%s%s",comando,archivo,usuario);
	jorgix.chown(archivo,usuario);
	}

{MANCHOWN} {
	cout<<"Comando chown:\n Sirve para cambiar de dueno un archivo, liga o directorio";
	cout<<"\n Utilizacion: chown archivo usuario"<<endl;
	}

{CHMOD} {
	char comando[6];
	char aut[4];
	char archivo[13];
	sscanf(yytext,"%s%s%s",comando,aut,archivo);
	jorgix.chmod(aut,archivo);
	}

{MANCHMOD} {
	cout<<"Comando chmod:\n Sirve para cambiar los permisos de un archivo, liga o directorio";
	cout<<"\n Utilizacion: chmod ### archivo"<<endl;
	}

{CHGROUP} {
        char comando[8];
	char grupo[20];
	sscanf(yytext,"%s%s",comando,grupo);
	jorgix.chgroup(grupo);
	}
{CHGROUPD} {jorgix.chgroup("");}

{MANCHGROUP} {
	cout<<"Comando chgroup:\n Sirve para cambiar de grupo";
	cout<<"\n Utilizacion: chgroup [grupo]"<<endl;
	}

{PASSWD} {
        char comando[7];
	char usuario[20];
	sscanf(yytext,"%s%s",comando,usuario);
	jorgix.passwd(usuario);
	}
{PASSWDD} {jorgix.passwd("");}

{MANPASSWD} {
        cout<<"Comando passwd:\n Sirve para cambiar el password de un usuario";
	cout<<"\n Utilizacion: passwd [usuario]"<<endl;
	}
{PWD} {jorgix.pwd();}
{MANPWD} {
	cout<<"Comando pwd:\n Sirve para listar el path actual";
	cout<<"\n Utilizacion: pwd"<<endl;
	}
{HIDE} {
	char comando[5];
	char archivo[13];
	sscanf(yytext,"%s%s",comando,archivo);
	jorgix.hide(archivo);
	}

{MANHIDE} {
	cout<<"Comando hide:\n Sirve para esconder archivos, ligas o directorios";
	cout<<"\n Utilizacion: hide archivo"<<endl;
	}
{SHOW} {
	char comando[5];
	char archivo[13];
	sscanf(yytext,"%s%s",comando,archivo);
	jorgix.show(archivo);
	}
{MANSHOW} {
	cout<<"Comando show:\n Sirve para mostrar archivos, ligas o directorios";
	cout<<"\n Utilizacion: show archivo"<<endl;
	}

{CP} {
	char comando[3];
	char origen[13];
	char destino[256];
	sscanf(yytext,"%s%s%s",comando,origen,destino);
	jorgix.cp(origen,destino);
	}

{MANCP} {
	cout<<"Comando cp:\n Sirve para copiar archivos o directorios a otro directorio";
	cout<<"\n Utilizacion: cp archivo path_destino"<<endl;
	}


{RMFILE} {
	char comando[7];
	char archivo[13];
	sscanf(yytext,"%s%s",comando,archivo);
	jorgix.rmfile(archivo);
	}

{MANRMFILE} {
	cout<<"Comando rmfile:\n Sirve para borrar archivos";
	cout<<"\n Utilizacion: rmfile archivo"<<endl;
	}

{RMDIR} {
	char comando[6];
	char directorio[13];
	sscanf(yytext,"%s%s",comando,directorio);
	jorgix.rmdir(directorio);
	}

{MANRMDIR} {
	cout<<"Comando rmdir:\n Sirve para borrar directorios";
	cout<<"\n Utilizacion: rmdir directorio"<<endl;
	}


{MKSYS} {
	char comando[6];
	char fsys[13];
	char t[4];
	sscanf(yytext,"%s%s%s",comando,fsys,t);
	jorgix.mksys(fsys,atoi(t));
	}

{MANMKSYS} {
	cout<<"Comando mksys:\n Sirve para crear filesystems";
	cout<<"\n Utilizacion: mksys filesystem tamano"<<endl;
	}

{MOUNT} {
	char comando[6];
	char fsys[13];
	sscanf(yytext,"%s%s",comando,fsys);
	jorgix.mount(fsys);
	}

{MANMOUNT} {
	cout<<"Comando mount:\n Sirve para montar filesystems en el directorio actual";
	cout<<"\n Utilizacion: mount filesystem"<<endl;
	}


{UMOUNT} {
	char comando[7];
	char fsys[13];
	sscanf(yytext,"%s%s",comando,fsys);
	jorgix.umount(fsys);
	}

{MANUMOUNT} {
	cout<<"Comando umount:\n Sirve para desmontar filesystems de el directorio actual";
	cout<<"\n Utilizacion: umount filesystem"<<endl;
	}
{LN} {
	char comando[3];
	char archivo[256];
	sscanf(yytext,"%s%s",comando,archivo);
	jorgix.ln(archivo);
	}

{MANLN} {
	cout<<"Comando ln:\n Sirve para crear ligas a un archivo";
	cout<<"\n Utilizacion: ln path_archivo"<<endl;
	}
{RMLN} {
	char comando[5];
	char archivo[13];
	sscanf(yytext,"%s%s",comando,archivo);
	jorgix.rmln(archivo);
	}

{MANRMLN} {
	cout<<"Comando rmln:\n Sirve para eliminar una liga";
	cout<<"\n Utilizacion: rmln liga"<<endl;
	}

{CAT} {
	char comando[4];
	char archivo[13];
	sscanf(yytext,"%s%s",comando,archivo);
	jorgix.cat(archivo);
	}

{MANCAT} {
	cout<<"Comando vi:\n Sirve para agregar texto a un archivo";
	cout<<"\n Utilizacion: vi archivo"<<endl;
	}

	

{VI} {
	char comando[3];
	char archivo[13];
	sscanf(yytext,"%s%s",comando,archivo);
	jorgix.vi(archivo);
	}

{MANVI}  {
	cout<<"Comando cat:\n Sirve para visualizar el contenido de un archivo";
	cout<<"\n Utilizacion: cat archivo"<<endl;
	}

{RENAME} {
	char comando[7];
	char viejo[13];
	char nuevo[13];
	sscanf(yytext,"%s%s%s",comando,viejo,nuevo);
	jorgix.rename(viejo,nuevo);
	}

{MANRENAME} {
	cout<<"Comando rename:\n Sirve para renombrar un archivo o directorio";
	cout<<"\n Utilizacion: rename viejo nuevo"<<endl;
	}


{COMANDOS} {
	cout<<"Comandos del sistema jorgix:\n";
	cout<<"login exit who pwd newuser rmuser newgroup rmgroup addgroup delgroup\n";
	cout<<"mkdir mkfile ln rmdir rmfile rmln cp mksys mount umount passwd chgroup\n";
	cout<<"show hide cat vi rename\n";
	cout<<"\nSi desea mas informacion sobre algun comando unicamente teclee\n";
	cout<<"el nombre del comando"<<endl;
	}

{ERROR} {
	cout<<"Error: comando desconocido, favor teclee comandos para saber\n";
	cout<<"los comandos del sistema jorgix"<<endl;
	}

%%

main()
{
	cout<<"Entrando a jorgix version 1.0........."<<endl;
	cout<<"\tBienvenido a jorgix"<<endl<<endl;
	if (jorgix.login())
		yylex();
	cout<<endl<<endl;
	cout<<"Saliendo de jorgix......................."<<endl;
}
