assembler.c (1293B)
1 #include <assert.h> 2 #include <limits.h> 3 #include <stdio.h> 4 5 static int inclure(FILE *); 6 static int lire_chemin(FILE *, char *); 7 static int copier_fichier(char *); 8 9 char *nom_prog; 10 11 int 12 main(int argc, char **argv) 13 { 14 (void)argc; 15 16 if ((nom_prog = argv[0]) == NULL || nom_prog[0] == '\0') 17 nom_prog = "assembler"; 18 19 return inclure(stdin); 20 } 21 22 23 static int 24 inclure(FILE *f) 25 { 26 int res; 27 char chemin[PATH_MAX+1]; 28 29 assert(f != NULL); 30 31 printf("(pqt\n"); 32 while ((res = lire_chemin(f, chemin)) > 0) { 33 printf("(fch (@:nom %s)\n", chemin); 34 if (copier_fichier(chemin) < 0) 35 return 1; 36 printf(")\n"); 37 } 38 printf(")\n"); 39 40 return res * -1; 41 } 42 43 /* problème: les chemins ne sont pas échappés */ 44 static int 45 lire_chemin(FILE *f, char *chemin) 46 { 47 int c; 48 long n; 49 50 assert(f != NULL); 51 assert(chemin != NULL); 52 53 for (n = 0; (c = getc(f)) != '\n' && c != EOF; n++) { 54 if (n == PATH_MAX) { 55 fprintf(stderr, "%s: chemin trop long\n", nom_prog); 56 return -1; 57 } 58 *chemin++ = c; 59 } 60 *chemin = '\0'; 61 if (c == EOF) 62 return 0; 63 64 return 1; 65 } 66 67 static int 68 copier_fichier(char *chemin) { 69 int c; 70 FILE *f; 71 72 if ((f = fopen(chemin, "r")) == NULL) { 73 fprintf(stderr, "%s: impossible d'ouvrir %s\n", 74 nom_prog, chemin); 75 return -1; 76 } 77 78 while ((c = getc(f)) != EOF) 79 putc(c, stdout); 80 81 return 0; 82 }