123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- /* Copyright (c) 1982 Regents of the University of California */
- static char sccsid[] = "@(#)makedefs.c 1.2 12/15/82";
- /*
- * Create a definitions file (e.g. .h) from an implementation file (e.g. .c).
- *
- * Usage is "makedefs source.c source.h" where source.h is to be created.
- *
- * Lines beginning with "public" or within a "#ifndef public ... #endif"
- * block are copied to the new file. Initializations (e.g. "int x = 3") are
- * omitted ("int x;" is output).
- *
- * Normally a temporary definitions file is created and compared to
- * the given destination. If they are different, the temporary file
- * is copied on top of the destination. This is so that dependencies
- * when using "make" are not triggered.
- *
- * The "-f" option overrides this and forces the destination file to be created.
- */
- #include "defs.h"
- #include <signal.h>
- #define procedure void
- Boolean force;
- Boolean copytext;
- String tmpname;
- String modulename();
- procedure abnorm();
- main(argc, argv)
- int argc;
- String argv[];
- {
- extern String mktemp();
- String name;
- File tmp;
- Integer r;
- Integer index;
- if (streq(argv[1], "-f")) {
- force = true;
- index = 2;
- } else {
- force = false;
- index = 1;
- }
- if (argc - index > 2) {
- fatal("usage: makedefs [ -f ] file.c [ file.h ]\n");
- }
- tmp = nil;
- if (freopen(argv[index], "r", stdin) == NULL) {
- fatal("can't read %s", argv[index]);
- }
- signal(SIGINT, abnorm);
- signal(SIGQUIT, abnorm);
- if (index + 1 < argc) {
- if (force) {
- tmpname = argv[index + 1];
- } else {
- tmpname = mktemp("/tmp/makedefsXXXXXX");
- }
- tmp = freopen(tmpname, "w", stdout);
- if (tmp == nil) {
- fatal("can't write %s", tmpname);
- }
- }
- copytext = false;
- name = modulename(argv[index]);
- printf("#ifndef %s\n", name);
- printf("#define %s\n", name);
- copy();
- printf("#endif\n");
- if (tmp != NULL and not force) {
- fclose(tmp);
- r = call("cmp", stdin, stderr, "-s", tmpname, argv[2], nil);
- if (r != 0) {
- r = call("cp", stdin, stderr, tmpname, argv[2], nil);
- if (r != 0) {
- fprintf(stderr, "can't create %s\n", argv[2]);
- }
- }
- unlink(tmpname);
- }
- quit(0);
- }
- String modulename(s)
- String s;
- {
- String r, i, j;
- static char buf[256];
- strcpy(buf, s);
- i = rindex(buf, '/');
- if (i == nil) {
- i = buf;
- }
- for (j = i; *j != '.'; j++);
- *j++ = '_';
- *j++ = 'h';
- *j = '\0';
- return buf;
- }
- copy()
- {
- register char *p;
- char line[1024];
- while (gets(line) != NULL) {
- if (strncmp(line, "#ifndef public", 14) == 0) {
- copytext = true;
- } else if (strncmp(line, "#endif", 6) == 0) {
- copytext = false;
- } else if (strncmp(line, "public", 6) == 0) {
- copydef(line);
- } else if (copytext) {
- printf("%s\n", line);
- }
- }
- }
- copydef(s)
- String s;
- {
- register char *p;
- register Boolean isproc;
- isproc = false;
- for (p = &s[7]; *p != '\0' and *p != '='; p++) {
- if (*p == '(') {
- isproc = true;
- printf("(/* ");
- } else if (*p == ')' and isproc and *(p+1) == '\0') {
- printf(" */)");
- } else {
- putchar(*p);
- }
- }
- if (isproc or *p == '=') {
- putchar(';');
- }
- putchar('\n');
- }
- /*
- * Terminate program.
- */
- procedure abnorm(signo)
- int signo;
- {
- unlink(tmpname);
- quit(signo);
- }
- quit(r)
- int r;
- {
- exit(r);
- }
- /*
- * No special error recovery strategy.
- */
- erecover()
- {
- }
|