|
@@ -146,6 +146,141 @@ int parse_line(CommandTab* ct, char* line){
|
|
|
}
|
|
|
|
|
|
int parse_command(Command* c){
|
|
|
+ boolean guillemet = false;
|
|
|
+ char* deb, * file, * buffer = c->cmd + 1;
|
|
|
+ int redir = 0, compteur;
|
|
|
+ //Parcours chaine
|
|
|
+ while(*buffer){
|
|
|
+ //Repere redirection
|
|
|
+ while(*buffer){
|
|
|
+ //Entrée
|
|
|
+ if(*buffer == '<'){
|
|
|
+ //Si il n'y a rien apres
|
|
|
+ if(!(*(buffer + 1))){
|
|
|
+ return SHELL_ERR;
|
|
|
+ }
|
|
|
+ buffer++;
|
|
|
+ redir = SHELLR_IN;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ //Sortie
|
|
|
+ else if (*buffer == '>'){
|
|
|
+ //Si il n'y a rien apres
|
|
|
+ if(!(*(buffer + 1))){
|
|
|
+ return SHELL_ERR;
|
|
|
+ } else {
|
|
|
+ buffer++;
|
|
|
+ //Si >>
|
|
|
+ if(*buffer == '>'){
|
|
|
+ //Si il n'y a rien apres
|
|
|
+ if(!(*(buffer + 1))){
|
|
|
+ return SHELL_ERR;
|
|
|
+ } else {
|
|
|
+ buffer++;
|
|
|
+ //Si >>&
|
|
|
+ if(*buffer == '&'){
|
|
|
+ //Si il n'y a rien apres
|
|
|
+ if(!(*(buffer + 1))){
|
|
|
+ return SHELL_ERR;
|
|
|
+ }
|
|
|
+ buffer++;
|
|
|
+ redir = SHELLRE_ALL;
|
|
|
+ }
|
|
|
+ //Sinon toujours >>
|
|
|
+ else {
|
|
|
+ redir = SHELLR_OUT;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // Si >&
|
|
|
+ else if(*buffer == '&'){
|
|
|
+ //Si il n'y a rien apres
|
|
|
+ if(!(*(buffer + 1))){
|
|
|
+ return SHELL_ERR;
|
|
|
+ }
|
|
|
+ redir = SHELLRE_ALL;
|
|
|
+ buffer++;
|
|
|
+ }
|
|
|
+ //Sinon >
|
|
|
+ else {
|
|
|
+ redir = SHELLRE_OUT;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ //Sortie erreur
|
|
|
+ else if (*buffer == '2' && *(buffer - 1) == ' ' && *(buffer + 1) && *(buffer + 1) == '>'){
|
|
|
+ buffer++;
|
|
|
+ //Si il n'y a rien apres
|
|
|
+ if(!(*(buffer + 1))){
|
|
|
+ return SHELL_ERR;
|
|
|
+ } else {
|
|
|
+ buffer++;
|
|
|
+ //Si 2>>
|
|
|
+ if(*buffer == '>'){
|
|
|
+ buffer++;
|
|
|
+ //Si il n'y a rien apres
|
|
|
+ if(!(*(buffer + 1))){
|
|
|
+ return SHELL_ERR;
|
|
|
+ }
|
|
|
+ redir = SHELLR_ERR;
|
|
|
+ }
|
|
|
+ //Sinon 2>
|
|
|
+ else {
|
|
|
+ redir = SHELLRE_ERR;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ buffer++;
|
|
|
+ }
|
|
|
+ //On passe les espaces
|
|
|
+ while(*buffer == ' '){
|
|
|
+ buffer++;
|
|
|
+ }
|
|
|
+ //Si on est à la fin de la chaine
|
|
|
+ if(*buffer == '\0'){
|
|
|
+ return SHELL_ERR;
|
|
|
+ }
|
|
|
+ //Regarde si le nom du fichier est entre ""
|
|
|
+ guillemet = *buffer == '"';
|
|
|
+ //Sauvegarde debut nom fichier
|
|
|
+ deb = buffer;
|
|
|
+ compteur = 0;
|
|
|
+ //Lecture nom du fichier
|
|
|
+ while(*buffer){
|
|
|
+ //Incremente
|
|
|
+ compteur++;
|
|
|
+ buffer++;
|
|
|
+ //Test arret
|
|
|
+ if(guillemet && *buffer == '"'){
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ else if(!guillemet && (*buffer == '<' || *buffer == '>' || (*buffer == ' ' && *(buffer - 1) != '\\'))){
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //Si fin de la commande et guillemet alors erreur
|
|
|
+ if(!(*buffer) && guillemet){
|
|
|
+ return SHELL_ERR;
|
|
|
+ }
|
|
|
+ //Retire guillement si besoin
|
|
|
+ if(guillemet){
|
|
|
+ deb++;
|
|
|
+ compteur--;
|
|
|
+ buffer++;
|
|
|
+ }
|
|
|
+ //Allocation file et copie nom fichier
|
|
|
+ file = malloc(sizeof(char) * compteur);
|
|
|
+ strncpy(file, deb, compteur);
|
|
|
+ printf("%s %d %d\n", file, redir, guillemet);
|
|
|
+ free(file);
|
|
|
+ //Passe les espaces
|
|
|
+ while(*buffer == ' '){
|
|
|
+ buffer++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
return 1;
|
|
|
}
|
|
|
|