add: compte rendu final
This commit is contained in:
parent
3a5b0b86b7
commit
c304cda7f5
@ -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`.
|
||||
|
||||

|
||||
|
||||
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
|
||||
|
||||
|
||||
Binary file not shown.
BIN
docs/img/process.png
Normal file
BIN
docs/img/process.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.2 KiB |
63
src/disk.c
63
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;
|
||||
|
||||
@ -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 {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user