Pristine Ack-5.5
[Ack-5.5.git] / util / ack / mktables.c
1 /*
2  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
3  * See the copyright notice in the ACK home directory, in the file "Copyright".
4  *
5  */
6
7 #include <stdio.h>
8 #include <ctype.h>
9
10 #ifndef NORCSID
11 static char rcs_id[] = "$Id: mktables.c,v 2.4 1994/06/24 10:12:56 ceriel Exp $" ;
12 #endif
13
14 char *fname = 0 ;
15 char dname[200] ;
16 char *tail ;
17
18 FILE *intab ;
19 FILE *dmach ;
20
21 int index ;
22
23 main(argc,argv) char **argv ; {
24         register i ;
25
26         start(argv[1]) ;
27         for ( i=2 ; i<argc ; i++ ) {
28                 fname= argv[i] ;
29                 readm() ;
30         }
31         stop(argc>2) ;
32         return 0 ;
33 }
34
35 start(dir) char *dir ; {
36         tail= dname ;
37         while ( *dir ) {
38                 *tail++ = *dir ++ ;
39         }
40         if ( tail!=dname ) *tail++= '/' ;
41         index=0 ;
42         intab= fopen("intable.c","w");
43         dmach= fopen("dmach.c","w");
44         if ( intab==NULL || dmach==NULL ) {
45                 fprintf(stderr,"Couln't create output file(s)\n");
46                 exit ( 1) ;
47         }
48         fprintf(dmach,"#include \"dmach.h\"\n\ndmach\tmassoc[] = {\n") ;
49         fprintf(intab,"char intable[] = {\n") ;
50 }
51
52 stop(filled) {
53         fprintf(dmach,"\t{\"\",\t-1\t}\n} ;\n") ;
54         if ( !filled ) fprintf(intab,"\t0\n") ;
55         fprintf(intab,"\n} ;\n") ;
56         fclose(dmach); fclose(intab) ;
57 }
58
59 FILE *do_open(file) char *file ; {
60         FILE *fd;
61
62         strcpy(tail,file) ;
63         strcat(tail,"/");
64         strcat(tail,"descr");
65         if ((fd = fopen(dname,"r")) != NULL) return fd;
66         strcpy(tail,"descr/");
67         strcat(tail,file);
68         return fopen(dname,"r");
69 }
70
71 readm() {
72         register int i ;
73         register int token ;
74         register FILE *in ;
75
76         in=do_open(fname) ;
77         if ( in==NULL ) {
78                 fprintf(stderr,"Cannot open %s\n",fname) ;
79                 return ;
80         }
81         i=0 ;
82         fprintf(dmach,"\t{\"%s\",\t%d\t},\n",fname,index) ;
83         fprintf(intab,"\n/* %s */\n\t",fname) ;
84         for (;;) {
85                 token=getc(in) ;
86                 index++ ;
87                 if ( ++i == 10 ) {
88                         fprintf(intab,"\n\t") ;
89                         i=0 ;
90                 } else {
91                         fprintf(intab," ") ;
92                 }
93                 if ( !isascii(token) || !(isprint(token) || isspace(token)) ){
94                         if ( token!=EOF ) {
95                           fprintf(stderr,"warning: non-ascii in %s\n",fname) ;
96                           fprintf(intab,"%4d,",token) ;
97                         } else {
98                           fprintf(intab,"  0,",token) ;
99                           break ;
100                         }
101                 } else if ( isprint(token) ) {
102                         switch ( token ) {
103                         case '\'': fprintf(intab,"'\\''") ; break ;
104                         case '\\': fprintf(intab,"'\\\\'") ; break ;
105                         default:   fprintf(intab," '%c'",token) ; break ;
106                         }
107                 } else switch ( token ) {
108                 case '\n' : fprintf(intab,"'\\n'") ; break ;
109                 case '\t' : fprintf(intab,"'\\t'") ; break ;
110                 case '\r' : fprintf(intab,"'\\r'") ; break ;
111                 case '\f' : fprintf(intab,"'\\f'") ; break ;
112                 case ' '  : fprintf(intab," ' '")  ; break ;
113                 default :   fprintf(stderr,"warning: unrec. %d\n",
114                                 token) ;
115                             fprintf(intab,"%4d",token) ;
116                             break ;
117                 }
118                 fprintf(intab,",") ;
119         }
120         fclose(in) ;
121 }