浏览代码

:construction: Parse redirection

Loquicom 6 年之前
父节点
当前提交
ff4335616e
共有 3 个文件被更改,包括 145 次插入0 次删除
  1. 9 0
      constante.h
  2. 135 0
      parser.c
  3. 1 0
      parser.h

+ 9 - 0
constante.h

@@ -25,6 +25,15 @@
 #define SHELL_ELSE 3 //La commande suivante s'execute si l'actuel échou
 #define SHELL_PIPE 4 //Envoi des données de sorties vers la commande suivante
 
+/* --- Redirection (Shell Redirect [Erase]) --- */
+#define SHELLR_IN 0 // <
+#define SHELLR_OUT 1 // >>
+#define SHELLRE_OUT 2 // >
+#define SHELLR_ERR 3 // 2>>
+#define SHELLRE_ERR 4 // 2>
+#define SHELLR_ALL 5 // >>&
+#define SHELLRE_ALL 6 // >&
+
 /* --- Boolean --- */
 #define boolean int
 #define true 1

+ 135 - 0
parser.c

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

+ 1 - 0
parser.h

@@ -21,6 +21,7 @@ typedef struct{
     int input; //Descripteur de fichier d'entré
     int output; //Descripteur de fichier de sortie
     int error; //Descripteur de fihier d'erreur
+    boolean erase[2]; //Si on efface le fichier
     boolean bck; //En fond ou non
     int next; //Lien avec la prochaine commande
 }Command;