Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #include <string.h>
- #include <fcntl.h>
- #include "Erreur.h"
- //change extension
- char * ChangerExtension(char * s, char * Extension)
- {
- if( s == NULL )
- return 0;
- int change = 0;
- int len = strlen(s);
- int lenE = strlen(Extension);
- char * buf = malloc(len + lenE);
- if( buf == NULL )
- Erreur("Erreur lors d'allocation mémoire",1);
- int i;
- for( i =len -1; i>1;i--)
- {
- if( s[i] == '.')
- {
- change = 1;
- buf = strncpy(buf,s,i+1);
- if ( Extension == NULL )
- s[i] = '\0';
- else
- {
- int j=0;
- for(i=i+1;i<len + lenE;i++)
- {
- buf[i] = Extension[j];
- j++;
- }
- }
- break; //on sort de la boucle
- }
- }
- if( !change ) //L'extension n'a pas été changé car le nom passé en pramètre est sans extension
- {
- buf = realloc(buf,len+lenE+1); //on augmente le buffer pour contenir le caractère '.'
- if( buf == NULL )
- return NULL;
- buf = strncpy(buf,s,len);
- buf[len] = '.';
- int j=0;
- int i;
- for(i=len+1;i<len + lenE+1;i++)
- {
- buf[i] = Extension[j];
- j++;
- }
- }
- return buf;
- }
- int getFileName(pid_t * pids,pid_t pid, int taille)
- {
- int i;
- for(i=0;i<taille;i++)
- if(pids[i] == pid) return i;
- }
- int compiler (char * fichiers[], int nb)
- {
- int i;
- pid_t * child_pid = malloc(nb * sizeof(pid_t));
- if(child_pid == NULL)
- Erreur("Erreur lors de l'allocation mémoire : ",1);
- pid_t fils;
- pid_t fd = getpid();
- int cr;
- int fic;
- int erreur = 0;
- for(i=0;i<nb;i++)
- {
- fd = fork();
- switch(fd)
- {
- case -1 : Erreur("Erreur lors de création des fils : ",1);
- case 0 :
- fic = open(ChangerExtension(fichiers[i],"err"), O_WRONLY|O_CREAT, 0666);
- dup2(fic, 2);
- close(fic);
- printf("gcc -c -Wall %s\n",fichiers[i]); execlp("gcc","gcc","-c","-Wall",fichiers[i],NULL); exit(1);
- default :
- child_pid[i] = fd;
- break;
- }
- }
- char * filename ;
- while((fils = wait(&cr)) != -1)
- {
- i = getFileName(child_pid,fils,nb);
- filename = ChangerExtension(fichiers[i],"err");
- if(WIFEXITED(cr))
- {
- if(WEXITSTATUS(cr) != 0)
- {
- erreur = 1;
- printf("Des erreurs de compilation ont été détectées dans le fichier %s, les erreurs se trouvent dans %s.\n",fichiers[i],filename);
- }
- else
- {
- remove(filename);
- }
- }
- }
- for(i=0;i<nb;i++)
- {
- fichiers[i] = ChangerExtension(fichiers[i],"o");
- }
- if( !erreur )
- {
- execvp("gcc",fichiers);
- }
- }
- void modify(char ** argv,int argc)
- {
- int i;
- for(i=1;i<argc;i++)
- {
- argv[i-1] = argv[i];
- }
- argv[argc-1] = NULL;
- }
- int main (int argc, char * argv[] )
- {
- modify(argv,argc);
- compiler(argv,argc-1);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement