aplat

Documents structurés pour Unix
git clone git://git.asteride.xyz/~ldp/aplat.git
Journaux | Fichiers | Références | LISEZ-MOI | LICENCE

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 }