Advertisement
Guest User

code

a guest
Oct 26th, 2013
259
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.89 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/types.h>
  5. #include <sys/wait.h>
  6. #include <string.h>
  7. #include <fcntl.h>
  8. #include "Erreur.h"
  9.  
  10. //change extension
  11. char * ChangerExtension(char * s, char * Extension)
  12. {
  13.   if( s == NULL )
  14.     return 0;
  15.   int change = 0;
  16.   int len = strlen(s);
  17.   int lenE = strlen(Extension);
  18.   char * buf = malloc(len + lenE);
  19.   if( buf == NULL )
  20.     Erreur("Erreur lors d'allocation mémoire",1);
  21.   int i;
  22.  
  23.   for( i =len -1; i>1;i--)
  24.   {
  25.     if( s[i] == '.')
  26.     {
  27.       change = 1;
  28.       buf = strncpy(buf,s,i+1);
  29.       if ( Extension == NULL )
  30.     s[i] = '\0';
  31.       else
  32.       {
  33.     int j=0;
  34.     for(i=i+1;i<len + lenE;i++)
  35.     {
  36.       buf[i] = Extension[j];
  37.       j++;
  38.     }
  39.       }
  40.       break; //on sort de la boucle
  41.     }
  42.   }
  43.   if( !change ) //L'extension n'a pas été changé car le nom passé en pramètre est sans extension
  44.   {
  45.     buf = realloc(buf,len+lenE+1); //on augmente le buffer pour contenir le caractère '.'
  46.     if( buf == NULL )
  47.       return NULL;
  48.     buf = strncpy(buf,s,len);
  49.     buf[len] = '.';
  50.     int j=0;
  51.     int i;
  52.     for(i=len+1;i<len + lenE+1;i++)
  53.     {
  54.        buf[i] = Extension[j];
  55.        j++;
  56.     }
  57.   }
  58.  return buf;
  59. }
  60.  
  61. int getFileName(pid_t * pids,pid_t pid, int taille)
  62. {
  63.   int i;
  64.   for(i=0;i<taille;i++)
  65.     if(pids[i] == pid) return i;
  66. }
  67.  
  68.  
  69. int compiler (char * fichiers[], int nb)
  70. {
  71.   int i;
  72.   pid_t * child_pid = malloc(nb * sizeof(pid_t));
  73.   if(child_pid == NULL)
  74.     Erreur("Erreur lors de l'allocation mémoire : ",1);
  75.   pid_t fils;
  76.   pid_t fd = getpid();
  77.   int cr;
  78.   int fic;
  79.   int erreur = 0;
  80.   for(i=0;i<nb;i++)
  81.   {
  82.     fd = fork();
  83.     switch(fd)
  84.     {
  85.       case -1 : Erreur("Erreur lors de création des fils : ",1);
  86.       case 0  :
  87.         fic = open(ChangerExtension(fichiers[i],"err"), O_WRONLY|O_CREAT, 0666);
  88.         dup2(fic, 2);
  89.         close(fic);
  90.     printf("gcc -c -Wall %s\n",fichiers[i]);  execlp("gcc","gcc","-c","-Wall",fichiers[i],NULL); exit(1);
  91.       default :
  92.     child_pid[i] = fd;
  93.     break;
  94.      
  95.     }
  96.   }
  97.   char * filename ;
  98.   while((fils = wait(&cr)) != -1)
  99.   {
  100.     i = getFileName(child_pid,fils,nb);
  101.     filename = ChangerExtension(fichiers[i],"err");
  102.     if(WIFEXITED(cr))
  103.     {
  104.       if(WEXITSTATUS(cr) != 0)
  105.       {
  106.     erreur = 1;
  107.     printf("Des erreurs de compilation ont été détectées dans le fichier %s, les erreurs se trouvent dans %s.\n",fichiers[i],filename);
  108.       }
  109.       else
  110.       {
  111.     remove(filename);
  112.       }
  113.     }
  114.   }
  115.   for(i=0;i<nb;i++)
  116.   {
  117.     fichiers[i] = ChangerExtension(fichiers[i],"o");
  118.   }
  119.   if( !erreur )
  120.   {
  121.     execvp("gcc",fichiers);
  122.   }
  123.    
  124.  
  125. }
  126.  
  127. void modify(char ** argv,int argc)
  128. {
  129.   int i;
  130.   for(i=1;i<argc;i++)
  131.   {
  132.     argv[i-1] = argv[i];
  133.   }
  134.   argv[argc-1] = NULL;
  135. }
  136.  
  137.  
  138.  
  139.  
  140.  
  141.  
  142. int main (int argc, char * argv[] )
  143. {
  144.   modify(argv,argc);
  145.   compiler(argv,argc-1);
  146.   return 0;
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement