浏览代码

Ajout cmd set et unset

Loquicom 6 年之前
父节点
当前提交
d430d3fe9c
共有 8 个文件被更改,包括 140 次插入9 次删除
  1. 66 1
      command.c
  2. 4 0
      command.h
  3. 5 0
      ipc.h
  4. 5 3
      makefile
  5. 1 1
      mysh.h
  6. 7 4
      parser.c
  7. 31 0
      variable.c
  8. 21 0
      variable.h

+ 66 - 1
command.c

@@ -14,8 +14,9 @@
 #include "parser.h"
 #include "mysh.h"
 #include "execute.h"
-#include "command.h"
 #include "ipc.h"
+#include "variable.h"
+#include "command.h"
 
 /* --- Extern --- */
 extern Error error;
@@ -28,6 +29,8 @@ char* cmdlist[] = {
     "status",
     "setenv",
     "unsetenv",
+    "set",
+    "unset",
     NULL
 };
 boolean exitsh = false;
@@ -138,7 +141,17 @@ int launch_internal_command(Command* cmd) {
     else if (strncmp(cmd->name, cmdlist[4], length) == 0) {
         result = unset_env(cmd->argc, cmd->argv);
         return result;
+    }
+    //set
+    else if (strncmp(cmd->name, cmdlist[5], length) == 0) {
+        result = set_local(cmd->argc, cmd->argv);
+        return result;
     }        
+    //unset
+    else if (strncmp(cmd->name, cmdlist[6], length) == 0) {
+        result = unset_local(cmd->argc, cmd->argv);
+        return result;
+    }   
     //Aucune commande
     else {
         return SHELL_FAIL;
@@ -233,6 +246,7 @@ int set_env(int argc, char** argv) {
         free(key);
         return EXIT_FAILURE;
     }
+    free(key);
     return EXIT_SUCCESS;
 }
 
@@ -258,4 +272,55 @@ int unset_env(int argc, char** argv) {
         return EXIT_FAILURE;
     }
     return EXIT_SUCCESS;
+}
+
+int set_local(int argc, char** argv){
+    char* str;
+    int length, pos = 0;
+    //Verif les arguments
+    if (argc < 2) {
+        error.print("too few arguments : 1 required, 0 given\n");
+        return EXIT_FAILURE;
+    }
+    if (argc > 2) {
+        error.print("too many arguments : 1 required, %d given\n", argc - 1);
+        return EXIT_FAILURE;
+    }
+    str = argv[1];
+    length = strlen(str);
+    //Verif que chaine est correcte
+    for (int i = 0; i < length; i++) {
+        if (str[i] == '=') {
+            break;
+        }
+        pos++;
+    }
+    if (pos >= length - 1) {
+        error.print("Argument invalide : clef=valeur attendu, %s donnée\n", str);
+        return EXIT_FAILURE;
+    }
+    //Ajoute la chaine en shm
+    if (!add_local_data(str)) {
+        error.print("Erreur interne impossible d'ajouter la variable\n");
+        return EXIT_FAILURE;
+    }
+    return EXIT_SUCCESS;
+}
+
+int unset_local(int argc, char** argv){
+    //Verif les arguments
+    if (argc < 2) {
+        error.print("too few arguments : 1 required, 0 given\n");
+        return EXIT_FAILURE;
+    }
+    if (argc > 2) {
+        error.print("too many arguments : 1 required, %d given\n", argc - 1);
+        return EXIT_FAILURE;
+    }
+    //Supprime de la shm
+    if (!remove_local_data(argv[1])) {
+        error.print("Erreur interne impossible de supprimer la variable\n");
+        return EXIT_FAILURE;
+    }
+    return EXIT_SUCCESS;
 }

+ 4 - 0
command.h

@@ -67,5 +67,9 @@ int set_env(int, char**);
 
 int unset_env(int, char**);
 
+int set_local(int, char**);
+
+int unset_local(int, char**);
+
 #endif /* COMMAND_H */
 

+ 5 - 0
ipc.h

@@ -49,6 +49,11 @@ char* parse_shm_var(char*);
  */
 boolean add_shm_data(char*);
 
+/**
+ * Supprime une donnée dans le segment de mémoire
+ * @param char* La clef
+ * @return Reussite
+ */
 boolean remove_shm_data(char*);
 
 #endif /* IPC_H */

+ 5 - 3
makefile

@@ -100,15 +100,17 @@ archive: clean
 # DEPENDANCES
 error.o: error.c str.h error.h
 str.o: str.c str.h
-parser.o: parser.c error.h str.h wildcard.h constante.h parser.h
+parser.o: parser.c error.h str.h wildcard.h constante.h ipc.h sem.h shm.h \
+ subdiv.h variable.h parser.h
 wildcard.o: wildcard.c error.h wildcard.h constante.h
 command.o: command.c error.h str.h parser.h constante.h mysh.h execute.h \
- command.h
+ ipc.h sem.h shm.h subdiv.h variable.h command.h
 execute.o: execute.c error.h execute.h constante.h
 sem.o: sem.c error.h sem.h constante.h
 shm.o: shm.c error.h shm.h constante.h
 subdiv.o: subdiv.c subdiv.h constante.h
-ipc.o: ipc.c ipc.h constante.h sem.h shm.h subdiv.h
+ipc.o: ipc.c ipc.h constante.h sem.h shm.h subdiv.h variable.h
 expreg.o: expreg.c expreg.h constante.h
+variable.o: variable.c str.h expreg.h constante.h variable.h subdiv.h
 mysh.o: mysh.c error.h str.h parser.h constante.h command.h execute.h \
  ipc.h sem.h shm.h subdiv.h mysh.h

+ 1 - 1
mysh.h

@@ -23,7 +23,7 @@ void show_current_dir(const char*, const char*);
 /**
  * Execute l'ensemble des commandes d'une ligne
  * @param CommandTab La ligne de commande parser
- * @return 
+ * @return Result
  */
 int run(CommandTab, int*);
 

+ 7 - 4
parser.c

@@ -15,8 +15,9 @@
 #include "error.h"
 #include "str.h"
 #include "wildcard.h"
-#include "parser.h"
 #include "ipc.h"
+#include "variable.h"
+#include "parser.h"
 
 /* --- Extern --- */
 extern int serrno;
@@ -567,9 +568,11 @@ int parse_command(Command* c){
     //Split la commande
     split_command(c, cmd);
     //Remplace variables
-    /*for(int i = 0; i < c->argc; i++){
-        
-    }*/
+    for(int i = 0; i < c->argc; i++){
+        str = parse_local_var(c->argv[i]);
+        free(c->argv[i]);
+        c->argv[i] = str;
+    }
     for(int i = 0; i < c->argc; i++){
         str = parse_shm_var(c->argv[i]);
         free(c->argv[i]);

+ 31 - 0
variable.c

@@ -11,6 +11,11 @@
 #include "expreg.h"
 #include "variable.h"
 
+/* --- Extern --- */
+subdiv localsd;
+char localmem[MEM_SIZE];
+boolean ini = false;
+
 /* --- Fonctions publiques --- */
 char* parse_var(char* s, subdiv* sd, char* mem) {
     expreg er;
@@ -126,4 +131,30 @@ char* parse_var(char* s, subdiv* sd, char* mem) {
     }
     free(tab);
     return newstr;
+}
+
+char* parse_local_var(char* str){
+    if(!ini){
+        int length = strlen(str) + 1;
+        char* newstr = malloc(sizeof(char) * length);
+        memset(newstr, 0, length);
+        strncpy(newstr, str, length - 1);
+        return newstr;
+    }
+    return parse_var(str, &localsd, localmem);
+}
+
+boolean add_local_data(char* data){
+    if(!ini){
+        ini_subdiv(&localsd);
+        ini = true;
+    }
+    return add_fdata_subdiv(&localsd, localmem, data);
+}
+
+boolean remove_local_data(char* key){
+    if(!ini){
+        return false;
+    }
+    return remove_data_subdiv(&localsd, localmem, key);
 }

+ 21 - 0
variable.h

@@ -24,5 +24,26 @@
  */
 char* parse_var(char*, subdiv*, char*);
 
+/**
+ * Remplace les variables d'une chaine par leurs valeurs
+ * @param char* La chaine à analyser
+ * @return La chaine avec les variables remplacées par leur valeurs
+ */
+char* parse_local_var(char*);
+
+/**
+ * Ajoute une données dans la mémoire locale
+ * @param char* Les données à ajouter
+ * @return Reussite
+ */
+boolean add_local_data(char*);
+
+/**
+ * Supprime une donnée dans la mémoire locale
+ * @param char* La clef
+ * @return Reussite
+ */
+boolean remove_local_data(char*);
+
 #endif /* VARIABLE_H */