Advertisement
Guest User

Untitled

a guest
Apr 16th, 2012
30
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.35 KB | None | 0 0
  1. /**
  2.  * Projet Process - interprétation de la commande interne
  3.  * history dans un shell simple
  4.  * Autheur : Scoupreman Jonathan
  5.  * Date : Avril 2012
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <unistd.h>
  11. #include <string.h>
  12.  
  13. #define MAX_HISTORY 50
  14.  
  15. // fonction d'affichage du tableau d'historique
  16. void displayHistory(char ** array, int size);
  17.  
  18. int main(){
  19.     size_t t;                                       // variable d'allocation mémoire
  20.     int i,n,j;
  21.     char * ligne, * histLine;                       // ligne : la ligne lue, histLine : la ligne sauvée dans l'historique
  22.     char * history[MAX_HISTORY];                    // tableau (historique) des lignes lues
  23.     char * tokens[100];                             // tokens de chaque lignes
  24.    
  25.     ligne = (char*) malloc(300);                    // allocation mémoire
  26.     histLine = (char*) malloc(300);                 // pour les lignes
  27.     j=0;
  28.    
  29.     printf("$ ");
  30.     fgets(ligne, 256, stdin);
  31.    
  32.     while(strcmp(ligne, "exit\n")){
  33.         i=0;
  34.         strcpy(histLine, ligne);                    // copie de la ligne lue pour l'ajouter à l'historique
  35.         tokens[i] = strtok(ligne, " \n");
  36.        
  37.         while(tokens[i] != NULL)
  38.             tokens[++i] = strtok(NULL, " \n");
  39.            
  40.         if(j == MAX_HISTORY){                       // si on a atteind la taille max de l'historique
  41.             free(history[0]);                       // on décalle tout l'historique afin d'ajouter la dernière
  42.             j--;                                    // commande lue dans le shell
  43.             for(n=0; n<j; n++){                     // parcour de l'historique
  44.                 history[n] = history[n+1];          // et décallage de chaque pointeur
  45.             }
  46.         }
  47.        
  48.         t = strlen(histLine);                       // calcul de la taille de la ligne
  49.         history[j] = (char*)malloc(t);              // allocation mémoire dans l'historique
  50.         strcpy(history[j], ligne);                  // copie de la ligne dans l'historique
  51.        
  52.         if(strcmp(tokens[0], "history") == 0){      // si on lance la commande history
  53.             displayHistory(history, j+1);           // affichage de l'historique
  54.         }else{                                      // sinon on effectue la routine normale
  55.             if(fork()==0){
  56.                 execvp(tokens[0], tokens);
  57.                 printf("Commande invalide\n");
  58.                 exit(1);
  59.             }
  60.         }
  61.         wait(0);
  62.         printf("$ ");
  63.         fgets(ligne, 256, stdin);
  64.        
  65.         if(j < MAX_HISTORY)                         // si la taille max de l'historique est pas atteind
  66.             j++;                                    // on continue à ajouter dans décallage
  67.     }
  68.     exit(0);
  69. }
  70.  
  71. void displayHistory(char ** array, int size){
  72.     int i,j;
  73.    
  74.     for(i=0; i<size; i++){                          // parcour du tableau
  75.         printf("%d %s\n", i+1, array[i]);               // et affichage de chaque ligne
  76.     }
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement