|  | @@ -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;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 |