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