|
|
1.1 root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.