Quellcode durchsuchen

:sparkles: Ajout gestion d'erreur

Loquicom vor 6 Jahren
Ursprung
Commit
32c18cc774
5 geänderte Dateien mit 46 neuen und 9 gelöschten Zeilen
  1. 0 1
      constante.h
  2. 8 1
      error.c
  3. 13 0
      error.h
  4. 5 7
      mysh.c
  5. 20 0
      parser.c

+ 0 - 1
constante.h

@@ -9,7 +9,6 @@
 #define CONSTANTE_H
 
 /* --- General --- */
-#define ERR -1
 #define SHELL_ERR -1
 #define SHELL_FAIL 0
 #define SHELL_OK 1

+ 8 - 1
error.c

@@ -13,5 +13,12 @@
 int serrorno = 0;
 char* serrorlib[] = {
     "Reussite",
-    "Error loul"
+    "Ligne de commande mal terminée",
+    "& inattendue",
+    "Impossible d'ouvrir/créer le fichier pour la redirection",
+    "Type de redirection incorrect",
+    "Redirection Incorrect",
+    "Command incorrect",
+    "Analyse wildcard impossible",
+    "Echec ajout wildcard dans argv"
 };

+ 13 - 0
error.h

@@ -11,6 +11,19 @@
 /* --- Macro --- */
 #define serror(str) fprintf(stderr, str" : %s\n", serrorlib[serrorno])
 
+/* --- Constantes Generales --- */
+#define ERR -1
+
+/* --- Constantes Erreurs --- */
+#define SEBADEND 1
+#define SEBADET 2
+#define SEOPENF 3
+#define SEREDIRTYPE 4
+#define SEBADREDIR 5
+#define SEBADCMD 6
+#define SEWC 7
+#define SEADDWC 8
+
 /* --- Extern --- */
 extern int serrorno;
 extern char* serrorlib[];

+ 5 - 7
mysh.c

@@ -38,12 +38,7 @@ void show_current_dir(const char* before, const char* after) {
 
 /* --- Main --- */
 int main(int argc, char* argv[]) {
-    
-    int serrorno = 1;
-    serror("Non");
-    
-    exit(0);
-    
+
     CommandTab ct;
     char str[500];
     int a;
@@ -54,7 +49,10 @@ int main(int argc, char* argv[]) {
     printf("%s\n", str);
     //Separe les commandes
     a = parse_line(&ct, str);
-    printf("Result : %d\n\n", a);
+    if(a == SHELL_ERR){
+        serror("Erreur lors du parse de la ligne");
+        exit(EXIT_FAILURE);
+    }
     //Parse les commandes
     a = parse_all_command(&ct);
     printf("Result : %d\n\n", a);

+ 20 - 0
parser.c

@@ -16,6 +16,9 @@
 #include "wildcard.h"
 #include "parser.h"
 
+/* --- Extern --- */
+extern int serrorno;
+
 /* --- Fonctions privées --- */
 /**
  * Indique le nombre de commande dans une ligne
@@ -35,12 +38,14 @@ int nb_commands(char* line){
         else if(*line == '|'){
             //Verif que ce n'est pas le dernier carac
             if(*(line + 1) == '\0'){
+                serrorno = SEBADEND;
                 return SHELL_ERR;
             }
             //Si un || on avance de 1 en plus
             else if(*(line + 1) == '|'){
                 //Si à la fin de la chaine
                 if(*(line + 2) == '\0'){
+                    serrorno = SEBADEND;
                     return SHELL_ERR;
                 }
                 line++;
@@ -56,6 +61,7 @@ int nb_commands(char* line){
             }
             //Sinon il doit y avoir un vide pour etre le & du bck ou un > avant
             else if(*(line + 1) != '\0' && *(line - 1) != '>'){
+                serrorno = SEBADET;
                 return SHELL_ERR;
             }
         }
@@ -141,6 +147,7 @@ int set_io(Command* c, char* filename, int redir){
     file = open(filename, O_CREAT | O_RDWR, S_IRWXU);
     if(file == ERR){
         perror("Erreur lors de l'ouverture du fichier pour la redirection : ");
+        serrorno = SEOPENF;
         return SHELL_ERR;
     }
     //Analyse dans quel descripteur il doit etre mis
@@ -207,6 +214,7 @@ int set_io(Command* c, char* filename, int redir){
             }
             break;
         default :
+            serrorno = SEREDIRTYPE;
             return SHELL_ERR;
     }
     //Si on arrive ici tous est ok
@@ -230,6 +238,7 @@ int set_redirection(Command* c){
             if(*buffer == '<'){
                 //Si il n'y a rien apres
                 if(!(*(buffer + 1))){
+                    serrorno = SEBADREDIR;
                     return SHELL_ERR;
                 }
                 buffer++;
@@ -240,6 +249,7 @@ int set_redirection(Command* c){
             else if (*buffer == '>'){
                 //Si il n'y a rien apres
                 if(!(*(buffer + 1))){
+                    serrorno = SEBADREDIR;
                     return SHELL_ERR;
                 } else {
                     buffer++;
@@ -247,6 +257,7 @@ int set_redirection(Command* c){
                     if(*buffer == '>'){
                         //Si il n'y a rien apres
                         if(!(*(buffer + 1))){
+                            serrorno = SEBADREDIR;
                             return SHELL_ERR;
                         } else {
                             buffer++;
@@ -254,6 +265,7 @@ int set_redirection(Command* c){
                             if(*buffer == '&'){
                                 //Si il n'y a rien apres
                                 if(!(*(buffer + 1))){
+                                    serrorno = SEBADREDIR;
                                     return SHELL_ERR;
                                 }
                                 buffer++;
@@ -269,6 +281,7 @@ int set_redirection(Command* c){
                     else if(*buffer == '&'){
                         //Si il n'y a rien apres
                         if(!(*(buffer + 1))){
+                            serrorno = SEBADREDIR;
                             return SHELL_ERR;
                         }
                         redir = SHELLRE_ALL;
@@ -286,6 +299,7 @@ int set_redirection(Command* c){
                 buffer++;
                 //Si il n'y a rien apres
                 if(!(*(buffer + 1))){
+                    serrorno = SEBADREDIR;
                     return SHELL_ERR;
                 } else {
                     buffer++;
@@ -294,6 +308,7 @@ int set_redirection(Command* c){
                         buffer++;
                         //Si il n'y a rien apres
                         if(!(*(buffer + 1))){
+                            serrorno = SEBADREDIR;
                             return SHELL_ERR;
                         }
                         redir = SHELLR_ERR;
@@ -324,6 +339,7 @@ int set_redirection(Command* c){
                 return finCmd + 1;
             }
             //Sinon on est dans un redirection non terminée
+            serrorno = SEBADCMD;
             return SHELL_ERR;
         }
         //Regarde si le nom du fichier est entre ""
@@ -346,6 +362,7 @@ int set_redirection(Command* c){
         }
         //Si fin de la commande et guillemet alors erreur
         if(!(*buffer) && guillemet){
+            serrorno = SEBADCMD;
             return SHELL_ERR;
         }
         //Retire guillement si besoin
@@ -395,6 +412,7 @@ int split_command(Command* c, char* cmd){
             if(*cmd == '"'){
                 //Verif que ce n'est pas la fin
                 if(!(*(cmd + 1))){
+                    serrorno = SEBADCMD;
                     return SHELL_ERR;
                 }
                 cmd++;
@@ -523,11 +541,13 @@ int parse_command(Command* c){
             nbWildcard = wildcard(c->argv[i], nbWildcard, wildcardTab);
             //Verif retour
             if(nbWildcard == ERR){
+                serrorno = SEWC;
                 return SHELL_ERR;
             }
             //Ajoute les wildcard dans argv (le +1 est la pour garder le NULL à la fin)
             c->argv = insert_array(i, c->argv, c->argc + 1, wildcardTab, nbWildcard, &res);
             if(res == ERR){
+                serrorno = SEADDWC;
                 return SHELL_ERR;
             }
             c->argc = res - 1;  //On ne compte pas le NULL final