Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * Projet Process - interprétation de la commande interne
- * history dans un shell simple
- * Autheur : Scoupreman Jonathan
- * Date : Avril 2012
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <string.h>
- #define MAX_HISTORY 50
- // fonction d'affichage du tableau d'historique
- void displayHistory(char ** array, int size);
- int main(){
- size_t t; // variable d'allocation mémoire
- int i,n,j;
- char * ligne, * histLine; // ligne : la ligne lue, histLine : la ligne sauvée dans l'historique
- char * history[MAX_HISTORY]; // tableau (historique) des lignes lues
- char * tokens[100]; // tokens de chaque lignes
- ligne = (char*) malloc(300); // allocation mémoire
- histLine = (char*) malloc(300); // pour les lignes
- j=0;
- printf("$ ");
- fgets(ligne, 256, stdin);
- while(strcmp(ligne, "exit\n")){
- i=0;
- strcpy(histLine, ligne); // copie de la ligne lue pour l'ajouter à l'historique
- tokens[i] = strtok(ligne, " \n");
- while(tokens[i] != NULL)
- tokens[++i] = strtok(NULL, " \n");
- if(j == MAX_HISTORY){ // si on a atteind la taille max de l'historique
- free(history[0]); // on décalle tout l'historique afin d'ajouter la dernière
- j--; // commande lue dans le shell
- for(n=0; n<j; n++){ // parcour de l'historique
- history[n] = history[n+1]; // et décallage de chaque pointeur
- }
- }
- t = strlen(histLine); // calcul de la taille de la ligne
- history[j] = (char*)malloc(t); // allocation mémoire dans l'historique
- strcpy(history[j], ligne); // copie de la ligne dans l'historique
- if(strcmp(tokens[0], "history") == 0){ // si on lance la commande history
- displayHistory(history, j+1); // affichage de l'historique
- }else{ // sinon on effectue la routine normale
- if(fork()==0){
- execvp(tokens[0], tokens);
- printf("Commande invalide\n");
- exit(1);
- }
- }
- wait(0);
- printf("$ ");
- fgets(ligne, 256, stdin);
- if(j < MAX_HISTORY) // si la taille max de l'historique est pas atteind
- j++; // on continue à ajouter dans décallage
- }
- exit(0);
- }
- void displayHistory(char ** array, int size){
- int i,j;
- for(i=0; i<size; i++){ // parcour du tableau
- printf("%d %s\n", i+1, array[i]); // et affichage de chaque ligne
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement