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