|
|
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.