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