diff --git a/docs/compte_rendus/compte_rendu_final.md b/docs/compte_rendus/compte_rendu_final.md index 6a1e78e..69e50aa 100644 --- a/docs/compte_rendus/compte_rendu_final.md +++ b/docs/compte_rendus/compte_rendu_final.md @@ -43,6 +43,8 @@ Ce rapport a pour but de montrer l'avancement du projet, notamment concernant la ## 2.1 Fonctionnement général du shell +### 2.1.1 Son rôle + Le projet se décompose en deux modules : * Le SGF qui permet d'intéragir avec le disque @@ -58,6 +60,30 @@ Le travail du Shell se décompose en plusieurs étapes : * Formater l'entrée utilisateur * Exécuter la commande associée à l'entrée utilisateur (en faisant appel à des primitives du SGF) +### 2.1.2 Le mécanisme de pipe + +Voici un exemple de commande utilisant un pipe +```bash +commande1 | commande2 +``` +Un pipe a pour utilité de passer les informations en sortie de la `commande1` en entrée à la `commande2`. + +![Schéma simplifié des canaux d'un processus](../img/process.png) + +Dans notre shell nous faisons en sorte grâce au mécanisme de pipe anonyme en C d'écraser la sortie standard (STDOUT) du processus fils de `commande1` par la référence d'écriture du pipe et d'écraser l'entrée standard (STDIN) du processus fils de `commande2` par la référence de lecture du pipe. + +Comme ça la première commande pense afficher son résultat sur sa sortie standard alors qu'en réalité elle écrit sur le pipe anonyme créé au préalable. + +Pareillement pour la seconde commande qui elle pense lire sur son entrée standard mais lis en fait ce qu'à écrit le premier processus. En quelques sortes, la première commande passe le relais à la seconde. + +### 2.1.3 Le mécanisme de redirection + +Le mécanisme de redirection consiste à rediriger la sortie d'une commande ou d'un ensemble de commande vers un fichier. + +Pour cela on utilise les opérateurs `>` et `>>`. + +* L'opérateur `>` redirige la sortie standard (STDOUT) de la dernière commande vers un fichier en écrasant les données déjà écrite dedans +* L'opérateur `>>` redirige la sortie standard (STDOUT) de la dernière commande vers un fichier sans écraser les données déjà écrite dedans ## 2.2 Fonctionnement général du SGF diff --git a/docs/compte_rendus/compte_rendu_final.pdf b/docs/compte_rendus/compte_rendu_final.pdf index 348cba3..5890ccd 100644 Binary files a/docs/compte_rendus/compte_rendu_final.pdf and b/docs/compte_rendus/compte_rendu_final.pdf differ diff --git a/docs/img/process.png b/docs/img/process.png new file mode 100644 index 0000000..a802b18 Binary files /dev/null and b/docs/img/process.png differ diff --git a/src/disk.c b/src/disk.c index bc135c2..6c708dd 100644 --- a/src/disk.c +++ b/src/disk.c @@ -593,69 +593,6 @@ int do_cat(disk *disk, char *path_to_file) { return 1; } -int *find_all_occ_of_pattern(char *pattern, char *txt) { - int nbr_occ = 0; - int *idx_occs = NULL; - int pat_len = strlen(pattern); - int txt_len = strlen(txt); - if (pat_len == 0) - return NULL; - for (int i = 0; i <= txt_len - pat_len; i++) { - if (strncmp(&txt[i], pattern, pat_len) == 0) { - nbr_occ++; - idx_occs = realloc(idx_occs, (nbr_occ + 1) * sizeof(int)); - if (idx_occs == NULL) - exit(EXIT_FAILURE); - idx_occs[nbr_occ - 1] = i; - idx_occs[nbr_occ] = -1; - } - } - return idx_occs; -} - -int do_grep(char *pattern) { - char buffer[1024]; - if (pattern == NULL) { - dprintf(STDERR_FILENO, "grep: pattern missing\n"); - return -1; - } - ssize_t n; - while ((n = read(STDIN_FILENO, buffer, sizeof(buffer) - 1)) > 0) { - buffer[n] = '\0'; - - int *occs = find_all_occ_of_pattern(pattern, buffer); - - if (occs == NULL || occs[0] == -1) { - continue; - } - - int nbr_occ = 0; - for (nbr_occ = 0; occs[nbr_occ] != -1; nbr_occ++) - ; - - int new_size = n + (nbr_occ * (strlen(COLOR_RED) + strlen(ESCAPE_COLOR))); - char *colored_line = malloc(new_size + 1); - - int last_pos = 0; - colored_line[0] = '\0'; - - for (int i = 0; occs[i] != -1; i++) { - int pos = occs[i]; - strncat(colored_line, buffer + last_pos, pos - last_pos); - strcat(colored_line, COLOR_RED); - strncat(colored_line, buffer + pos, strlen(pattern)); - strcat(colored_line, ESCAPE_COLOR); - - last_pos = pos + strlen(pattern); - } - strcat(colored_line, buffer + last_pos); - write(STDOUT_FILENO, colored_line, strlen(colored_line)); - free(occs); - free(colored_line); - } - return 1; -} - int redirect_out(disk *d, int mode, char *file, int in) { char *parent_path; char *dirname; diff --git a/src/exec.c b/src/exec.c index e9ba52a..500877e 100644 --- a/src/exec.c +++ b/src/exec.c @@ -103,8 +103,6 @@ int exec_cmd_job(disk *d, char **args) { persist_on_disk(d); } else if (strcmp("cat", args[0]) == 0) { do_cat(d, args[1]); - } else if (strcmp("grep", args[0]) == 0) { - do_grep(args[1]); } else if (strcmp("echo", args[0]) == 0) { do_echo(&args[1]); } else {