xref: /csrg-svn/old/dbx/makedefs.c (revision 9670)
1*9670Slinton /* Copyright (c) 1982 Regents of the University of California */
2*9670Slinton 
3*9670Slinton static char sccsid[] = "@(#)@(#)makedefs.c 1.1 12/15/82";
4*9670Slinton 
5*9670Slinton /*
6*9670Slinton  * Create a definitions file (e.g. .h) from an implementation file (e.g. .c).
7*9670Slinton  *
8*9670Slinton  * Usage is "makedefs source.c source.h" where source.h is to be created.
9*9670Slinton  *
10*9670Slinton  * Lines beginning with "public" or within a "#ifndef public ... #endif"
11*9670Slinton  * block are copied to the new file.  Initializations (e.g. "int x = 3") are
12*9670Slinton  * omitted ("int x;" is output).
13*9670Slinton  *
14*9670Slinton  * Normally a temporary definitions file is created and compared to
15*9670Slinton  * the given destination.  If they are different, the temporary file
16*9670Slinton  * is copied on top of the destination.  This is so that dependencies
17*9670Slinton  * when using "make" are not triggered.
18*9670Slinton  *
19*9670Slinton  * The "-f" option overrides this and forces the destination file to be created.
20*9670Slinton  */
21*9670Slinton 
22*9670Slinton #include "defs.h"
23*9670Slinton #include <signal.h>
24*9670Slinton 
25*9670Slinton #define procedure void
26*9670Slinton 
27*9670Slinton Boolean force;
28*9670Slinton Boolean copytext;
29*9670Slinton 
30*9670Slinton String tmpname;
31*9670Slinton String modulename();
32*9670Slinton procedure abnorm();
33*9670Slinton 
34*9670Slinton main(argc, argv)
35*9670Slinton int argc;
36*9670Slinton String argv[];
37*9670Slinton {
38*9670Slinton     extern String mktemp();
39*9670Slinton     String name;
40*9670Slinton     File tmp;
41*9670Slinton     Integer r;
42*9670Slinton     Integer index;
43*9670Slinton 
44*9670Slinton     if (streq(argv[1], "-f")) {
45*9670Slinton 	force = true;
46*9670Slinton 	index = 2;
47*9670Slinton     } else {
48*9670Slinton 	force = false;
49*9670Slinton 	index = 1;
50*9670Slinton     }
51*9670Slinton     if (argc - index > 2) {
52*9670Slinton 	fatal("usage: makedefs [ -f ] file.c [ file.h ]\n");
53*9670Slinton     }
54*9670Slinton     tmp = nil;
55*9670Slinton     if (freopen(argv[index], "r", stdin) == NULL) {
56*9670Slinton 	fatal("can't read %s", argv[index]);
57*9670Slinton     }
58*9670Slinton     signal(SIGINT, abnorm);
59*9670Slinton     signal(SIGQUIT, abnorm);
60*9670Slinton     if (index + 1 < argc) {
61*9670Slinton 	if (force) {
62*9670Slinton 	    tmpname = argv[index + 1];
63*9670Slinton 	} else {
64*9670Slinton 	    tmpname = mktemp("/tmp/makedefsXXXXXX");
65*9670Slinton 	}
66*9670Slinton 	tmp = freopen(tmpname, "w", stdout);
67*9670Slinton 	if (tmp == nil) {
68*9670Slinton 	    fatal("can't write %s", tmpname);
69*9670Slinton 	}
70*9670Slinton     }
71*9670Slinton     copytext = false;
72*9670Slinton     name = modulename(argv[index]);
73*9670Slinton     printf("#ifndef %s\n", name);
74*9670Slinton     printf("#define %s\n", name);
75*9670Slinton     copy();
76*9670Slinton     printf("#endif\n");
77*9670Slinton     if (tmp != NULL and not force) {
78*9670Slinton 	fclose(tmp);
79*9670Slinton 	r = call("cmp", stdin, stderr, "-s", tmpname, argv[2], nil);
80*9670Slinton 	if (r != 0) {
81*9670Slinton 	    r = call("cp", stdin, stderr, tmpname, argv[2], nil);
82*9670Slinton 	    if (r != 0) {
83*9670Slinton 		fprintf(stderr, "can't create %s\n", argv[2]);
84*9670Slinton 	    }
85*9670Slinton 	}
86*9670Slinton 	unlink(tmpname);
87*9670Slinton     }
88*9670Slinton     quit(0);
89*9670Slinton }
90*9670Slinton 
91*9670Slinton String modulename(s)
92*9670Slinton String s;
93*9670Slinton {
94*9670Slinton     String r, i, j;
95*9670Slinton     static char buf[256];
96*9670Slinton 
97*9670Slinton     strcpy(buf, s);
98*9670Slinton     i = rindex(buf, '/');
99*9670Slinton     if (i == nil) {
100*9670Slinton 	i = buf;
101*9670Slinton     }
102*9670Slinton     for (j = i; *j != '.'; j++);
103*9670Slinton     *j++ = '_';
104*9670Slinton     *j++ = 'h';
105*9670Slinton     *j = '\0';
106*9670Slinton     return buf;
107*9670Slinton }
108*9670Slinton 
109*9670Slinton copy()
110*9670Slinton {
111*9670Slinton     register char *p;
112*9670Slinton     char line[1024];
113*9670Slinton 
114*9670Slinton     while (gets(line) != NULL) {
115*9670Slinton 	if (strncmp(line, "#ifndef public", 14) == 0) {
116*9670Slinton 	    copytext = true;
117*9670Slinton 	} else if (strncmp(line, "#endif", 6) == 0) {
118*9670Slinton 	    copytext = false;
119*9670Slinton 	} else if (strncmp(line, "public", 6) == 0) {
120*9670Slinton 	    copydef(line);
121*9670Slinton 	} else if (copytext) {
122*9670Slinton 	    printf("%s\n", line);
123*9670Slinton 	}
124*9670Slinton     }
125*9670Slinton }
126*9670Slinton 
127*9670Slinton copydef(s)
128*9670Slinton String s;
129*9670Slinton {
130*9670Slinton     register char *p;
131*9670Slinton     register Boolean isproc;
132*9670Slinton 
133*9670Slinton     isproc = false;
134*9670Slinton     for (p = &s[7]; *p != '\0' and *p != '='; p++) {
135*9670Slinton 	if (*p == '(') {
136*9670Slinton 	    isproc = true;
137*9670Slinton 	    printf("(/* ");
138*9670Slinton 	} else if (*p == ')' and isproc and *(p+1) == '\0') {
139*9670Slinton 	    printf(" */)");
140*9670Slinton 	} else {
141*9670Slinton 	    putchar(*p);
142*9670Slinton 	}
143*9670Slinton     }
144*9670Slinton     if (isproc or *p == '=') {
145*9670Slinton 	putchar(';');
146*9670Slinton     }
147*9670Slinton     putchar('\n');
148*9670Slinton }
149*9670Slinton 
150*9670Slinton /*
151*9670Slinton  * Terminate program.
152*9670Slinton  */
153*9670Slinton 
154*9670Slinton procedure abnorm(signo)
155*9670Slinton int signo;
156*9670Slinton {
157*9670Slinton     unlink(tmpname);
158*9670Slinton     quit(signo);
159*9670Slinton }
160*9670Slinton 
161*9670Slinton quit(r)
162*9670Slinton int r;
163*9670Slinton {
164*9670Slinton     exit(r);
165*9670Slinton }
166*9670Slinton 
167*9670Slinton /*
168*9670Slinton  * No special error recovery strategy.
169*9670Slinton  */
170*9670Slinton 
171*9670Slinton erecover()
172*9670Slinton {
173*9670Slinton }
174