Ver código fonte

Debut variable

Loquicom 6 anos atrás
pai
commit
2805825a2b
3 arquivos alterados com 158 adições e 1 exclusões
  1. 1 1
      makefile
  2. 129 0
      variable.c
  3. 28 0
      variable.h

+ 1 - 1
makefile

@@ -3,7 +3,7 @@
 #
 
 EXEC = mysh
-OBJETS = error.o str.o parser.o wildcard.o command.o execute.o sem.o shm.o subdiv.o ipc.o expreg.o
+OBJETS = error.o str.o parser.o wildcard.o command.o execute.o sem.o shm.o subdiv.o ipc.o expreg.o variable.o
 NOM_PROJET = mini-shell
 
 #

+ 129 - 0
variable.c

@@ -0,0 +1,129 @@
+/* 
+ * File:   variable.c
+ * Author: Arthur Brandao
+ *
+ * Created on 21 décembre 2018
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "str.h"
+#include "expreg.h"
+#include "variable.h"
+
+/* --- Fonctions publiques --- */
+char* parse_var(char* s, subdiv* sd, char* mem) {
+    expreg er;
+    int length, deb, fin, fin2 = 0, compteur = 0, index = 0;
+    boolean first = true;
+    char* str, * newstr;
+    //Cherche le nombre de clefs dans la chaine
+    length = strlen(s);
+    ini_expreg(&er, s, "(\\$[[:alnum:]_]+)");
+    while ((str = get_match_expreg(&er, &deb, &fin)) != NULL) {
+        //1er tour
+        if (first) {
+            //Si il y a du texte avant 
+            if (deb != 0) {
+                compteur++;
+            }
+            compteur++;
+            //Garde en memoire la pos de fin
+            fin2 = fin;
+            first = false;
+        }            
+        //Autre tours
+        else {
+            //Si il y a eu du texte entre les deux correspondances
+            if (deb != fin2) {
+                compteur++;
+            }
+            compteur++;
+            //Garde en memoire la pos de fin
+            fin2 = fin;
+        }
+        free(str);
+    }
+    //Si on n'est pas à la fin
+    if (fin2 != length) {
+        compteur++;
+    }
+    clean_expreg(&er);
+    //Création tableau
+    char** tab = malloc(sizeof(char*) * compteur);
+    //Sécoupe la chaine
+    first = true;
+    ini_expreg(&er, s, "(\\$[[:alnum:]_]+)");
+    while ((str = get_match_expreg(&er, &deb, &fin)) != NULL) {
+        //1er tour
+        if (first) {
+            //Si il y a du texte avant 
+            if (deb != 0) {
+                tab[index] = malloc(sizeof(char) * (deb + 1));
+                memset(tab[index], 0, deb + 1);
+                strncpy(tab[index], s, deb);
+                index++;
+            }
+            tab[index] = malloc(sizeof(char) * (fin - deb + 1));
+            memset(tab[index], 0, fin - deb + 1);
+            strncpy(tab[index], s + deb, fin - deb);
+            index++;
+            //Garde en memoire la pos de fin
+            fin2 = fin;
+            first = false;
+        }            
+        //Autre tours
+        else {
+            //Si il y a eu du texte entre les deux correspondances
+            if (deb != fin2) {
+                tab[index] = malloc(sizeof(char) * (deb - fin2 + 1));
+                memset(tab[index], 0, deb - fin2 + 1);
+                strncpy(tab[index], s + fin2, deb - fin2);
+                index++;
+            }
+            tab[index] = malloc(sizeof(char) * (fin - deb + 1));
+            memset(tab[index], 0, fin - deb + 1);
+            strncpy(tab[index], s + deb, fin - deb);
+            index++;
+            //Garde en memoire la pos de fin
+            fin2 = fin;
+        }
+        free(str);
+    }
+    //Si on n'est pas à la fin
+    if (fin2 != length) {
+        tab[index] = malloc(sizeof(char) * (length - fin2 + 1));
+        memset(tab[index], 0, length - fin2 + 1);
+        strncpy(tab[index], s + fin2, length - fin2);
+        index++;
+    }
+    clean_expreg(&er);
+    //Remplace les clef par leurs valeurs
+    for(int i = 0; i < compteur; i++){
+        if(tab[i][0] == '$'){
+            char* val = get_data_subdiv(sd, mem, tab[i] + 1);
+            if(val != NULL){
+                free(tab[i]);
+                tab[i] = val;
+            }
+        }
+    }
+    //Reconstruit la chaine
+    length = 0;
+    for(int i = 0; i < compteur; i++){
+        length += strlen(tab[i]);
+    }
+    newstr = malloc(sizeof(char) * (length + 1));
+    memset(newstr, 0, length + 1);
+    index = 0;
+    for(int i = 0; i < compteur; i++){
+        length = strlen(tab[i]);
+        for(int j = 0; j < length; j++){
+            newstr[index] = tab[i][j];
+            index++;
+        }
+        free(tab[i]);
+    }
+    free(tab);
+    return newstr;
+}

+ 28 - 0
variable.h

@@ -0,0 +1,28 @@
+/* 
+ * File:   variable.h
+ * Author: Arthur Brandao
+ *
+ * Gestion des variables locales
+ * 
+ * Created on 21 décembre 2018
+ */
+
+#ifndef VARIABLE_H
+#define VARIABLE_H
+
+/* --- Include --- */
+#include "constante.h"
+#include "subdiv.h"
+
+/* --- Fonctions --- */
+/**
+ * Remplace les variables par leur valeur dans une chaine
+ * @param char* La chaine à traiter
+ * @param subdiv* Le gestionnaire de memoir epar subdivision ou sont stocker les valeur
+ * @param char* La mémoire ou sont les valeurs
+ * @return La chaine avec les valeurs replacées
+ */
+char* parse_var(char*, subdiv*, char*);
+
+#endif /* VARIABLE_H */
+