Annotation of 43BSD/ucb/dbx/makedefs.c, revision 1.1

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.1 (Berkeley) 5/31/85";
        !            15: #endif not lint
        !            16: 
        !            17: static char rcsid[] = "$Header: makedefs.c,v 1.4 84/12/26 10:40:22 linton 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: Boolean force;
        !            42: Boolean copytext;
        !            43: 
        !            44: String tmpname;
        !            45: String modulename();
        !            46: procedure abnorm();
        !            47: 
        !            48: main(argc, argv)
        !            49: int argc;
        !            50: String argv[];
        !            51: {
        !            52:     extern String mktemp();
        !            53:     String name;
        !            54:     File tmp;
        !            55:     Integer r;
        !            56:     Integer index;
        !            57: 
        !            58:     if (streq(argv[1], "-f")) {
        !            59:        force = true;
        !            60:        index = 2;
        !            61:     } else {
        !            62:        force = false;
        !            63:        index = 1;
        !            64:     }
        !            65:     if (argc - index > 2) {
        !            66:        fatal("usage: makedefs [ -f ] file.c [ file.h ]\n");
        !            67:     }
        !            68:     tmp = nil;
        !            69:     if (freopen(argv[index], "r", stdin) == NULL) {
        !            70:        fatal("can't read %s", argv[index]);
        !            71:     }
        !            72:     signal(SIGINT, abnorm);
        !            73:     signal(SIGQUIT, abnorm);
        !            74:     if (index + 1 < argc) {
        !            75:        if (force) {
        !            76:            tmpname = argv[index + 1];
        !            77:        } else {
        !            78:            tmpname = mktemp("/tmp/makedefsXXXXXX");
        !            79:        }
        !            80:        tmp = freopen(tmpname, "w", stdout);
        !            81:        if (tmp == nil) {
        !            82:            fatal("can't write %s", tmpname);
        !            83:        }
        !            84:     }
        !            85:     copytext = false;
        !            86:     name = modulename(argv[index]);
        !            87:     printf("#ifndef %s\n", name);
        !            88:     printf("#define %s\n", name);
        !            89:     copy();
        !            90:     printf("#endif\n");
        !            91:     if (tmp != NULL and not force) {
        !            92:        fclose(tmp);
        !            93:        r = call("cmp", stdin, stderr, "-s", tmpname, argv[2], nil);
        !            94:        if (r != 0) {
        !            95:            r = call("cp", stdin, stderr, tmpname, argv[2], nil);
        !            96:            if (r != 0) {
        !            97:                fprintf(stderr, "can't create %s\n", argv[2]);
        !            98:            }
        !            99:        }
        !           100:        unlink(tmpname);
        !           101:     }
        !           102:     quit(0);
        !           103: }
        !           104: 
        !           105: String modulename(s)
        !           106: String s;
        !           107: {
        !           108:     String r, i, j;
        !           109:     static char buf[256];
        !           110: 
        !           111:     strcpy(buf, s);
        !           112:     i = rindex(buf, '/');
        !           113:     if (i == nil) {
        !           114:        i = buf;
        !           115:     }
        !           116:     for (j = i; *j != '.'; j++);
        !           117:     *j++ = '_';
        !           118:     *j++ = 'h';
        !           119:     *j = '\0';
        !           120:     return buf;
        !           121: }
        !           122: 
        !           123: copy()
        !           124: {
        !           125:     register char *p;
        !           126:     char line[1024];
        !           127: 
        !           128:     while (gets(line) != NULL) {
        !           129:        if (strncmp(line, "#ifndef public", 14) == 0) {
        !           130:            copytext = true;
        !           131:        } else if (strncmp(line, "#endif", 6) == 0) {
        !           132:            copytext = false;
        !           133:        } else if (strncmp(line, "public", 6) == 0) {
        !           134:            copydef(line);
        !           135:        } else if (copytext) {
        !           136:            printf("%s\n", line);
        !           137:        }
        !           138:     }
        !           139: }
        !           140: 
        !           141: copydef(s)
        !           142: String s;
        !           143: {
        !           144:     register char *p;
        !           145:     register Boolean isproc;
        !           146: 
        !           147:     isproc = false;
        !           148:     for (p = &s[7]; *p != '\0' and *p != '='; p++) {
        !           149:        if (*p == '(') {
        !           150:            isproc = true;
        !           151:            printf("(/* ");
        !           152:        } else if (*p == ')' and isproc and *(p+1) == '\0') {
        !           153:            printf(" */)");
        !           154:        } else {
        !           155:            putchar(*p);
        !           156:        }
        !           157:     }
        !           158:     if (isproc or *p == '=') {
        !           159:        putchar(';');
        !           160:     }
        !           161:     putchar('\n');
        !           162: }
        !           163: 
        !           164: /*
        !           165:  * Terminate program.
        !           166:  */
        !           167: 
        !           168: procedure abnorm(signo)
        !           169: int signo;
        !           170: {
        !           171:     unlink(tmpname);
        !           172:     quit(signo);
        !           173: }
        !           174: 
        !           175: quit(r)
        !           176: int r;
        !           177: {
        !           178:     exit(r);
        !           179: }
        !           180: 
        !           181: /*
        !           182:  * No special error recovery strategy.
        !           183:  */
        !           184: 
        !           185: erecover()
        !           186: {
        !           187: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.