Annotation of 43BSDReno/pgrm/dbx/makedefs.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1983 The Regents of the University of California.
        !             3:  * All rights reserved.
        !             4:  *
        !             5:  * Redistribution and use in source and binary forms are permitted
        !             6:  * provided that: (1) source distributions retain this entire copyright
        !             7:  * notice and comment, and (2) distributions including binaries display
        !             8:  * the following acknowledgement:  ``This product includes software
        !             9:  * developed by the University of California, Berkeley and its contributors''
        !            10:  * in the documentation or other materials provided with the distribution
        !            11:  * and in all advertising materials mentioning features or use of this
        !            12:  * software. Neither the name of the University nor the names of its
        !            13:  * contributors may be used to endorse or promote products derived
        !            14:  * from this software without specific prior written permission.
        !            15:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !            16:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !            17:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            18:  */
        !            19: 
        !            20: #ifndef lint
        !            21: char copyright[] =
        !            22: "@(#) Copyright (c) 1983 The Regents of the University of California.\n\
        !            23:  All rights reserved.\n";
        !            24: #endif /* not lint */
        !            25: 
        !            26: #ifndef lint
        !            27: static char sccsid[] = "@(#)makedefs.c 5.6 (Berkeley) 6/1/90";
        !            28: #endif /* not lint */
        !            29: 
        !            30: /*
        !            31:  * Create a definitions file (e.g. .h) from an implementation file (e.g. .c).
        !            32:  *
        !            33:  * Usage is "makedefs source.c source.h" where source.h is to be created.
        !            34:  *
        !            35:  * Lines beginning with "public" or within a "#ifndef public ... #endif"
        !            36:  * block are copied to the new file.  Initializations (e.g. "int x = 3") are
        !            37:  * omitted ("int x;" is output).
        !            38:  *
        !            39:  * Normally a temporary definitions file is created and compared to
        !            40:  * the given destination.  If they are different, the temporary file
        !            41:  * is copied on top of the destination.  This is so that dependencies
        !            42:  * when using "make" are not triggered.
        !            43:  *
        !            44:  * The "-f" option overrides this and forces the destination file to be created.
        !            45:  */
        !            46: 
        !            47: #include "defs.h"
        !            48: #include <signal.h>
        !            49: #include "pathnames.h"
        !            50: 
        !            51: #define procedure void
        !            52: 
        !            53: #define streqn(s1, s2, n) (strncmp(s1, s2, n) == 0)
        !            54: 
        !            55: Boolean force;
        !            56: Boolean copytext;
        !            57: 
        !            58: String tmpname;
        !            59: String modulename();
        !            60: procedure abnorm();
        !            61: 
        !            62: main(argc, argv)
        !            63: int argc;
        !            64: String argv[];
        !            65: {
        !            66:     extern String mktemp();
        !            67:     String name;
        !            68:     File tmp;
        !            69:     Integer r;
        !            70:     Integer index;
        !            71: 
        !            72:     if (streq(argv[1], "-f")) {
        !            73:        force = true;
        !            74:        index = 2;
        !            75:     } else {
        !            76:        force = false;
        !            77:        index = 1;
        !            78:     }
        !            79:     if (argc - index > 2) {
        !            80:        fatal("usage: makedefs [ -f ] file.c [ file.h ]\n");
        !            81:     }
        !            82:     tmp = nil;
        !            83:     if (freopen(argv[index], "r", stdin) == NULL) {
        !            84:        fatal("can't read %s", argv[index]);
        !            85:     }
        !            86:     signal(SIGINT, abnorm);
        !            87:     signal(SIGQUIT, abnorm);
        !            88:     if (index + 1 < argc) {
        !            89:        if (force) {
        !            90:            tmpname = argv[index + 1];
        !            91:        } else {
        !            92:            tmpname = mktemp(_PATH_TMP);
        !            93:        }
        !            94:        tmp = freopen(tmpname, "w", stdout);
        !            95:        if (tmp == nil) {
        !            96:            fatal("can't write %s", tmpname);
        !            97:        }
        !            98:     }
        !            99:     copytext = false;
        !           100:     name = modulename(argv[index]);
        !           101:     printf("#ifndef %s\n", name);
        !           102:     printf("#define %s\n", name);
        !           103:     copy();
        !           104:     printf("#endif\n");
        !           105:     if (tmp != NULL and not force) {
        !           106:        fclose(tmp);
        !           107:        r = call("cmp", stdin, stderr, "-s", tmpname, argv[2], nil);
        !           108:        if (r != 0) {
        !           109:            r = call("cp", stdin, stderr, tmpname, argv[2], nil);
        !           110:            if (r != 0) {
        !           111:                fprintf(stderr, "can't create %s\n", argv[2]);
        !           112:            }
        !           113:        }
        !           114:        unlink(tmpname);
        !           115:     }
        !           116:     quit(0);
        !           117: }
        !           118: 
        !           119: String modulename(s)
        !           120: String s;
        !           121: {
        !           122:     String r, i, j;
        !           123:     static char buf[256];
        !           124: 
        !           125:     strcpy(buf, s);
        !           126:     i = rindex(buf, '/');
        !           127:     if (i == nil) {
        !           128:        i = buf;
        !           129:     } else {
        !           130:        ++i;
        !           131:     }
        !           132:     for (j = i; *j; j++) {
        !           133:        if (*j == '.') {
        !           134:            *j = '_';
        !           135:        }
        !           136:     }
        !           137:     if (j > i && *--j == 'c') {
        !           138:        *j = 'h';
        !           139:     }
        !           140:     return i;
        !           141: }
        !           142: 
        !           143: copy()
        !           144: {
        !           145:     register char *p;
        !           146:     integer nesting;
        !           147:     char line[1024];
        !           148: 
        !           149:     while (gets(line) != NULL) {
        !           150:        if (streqn(line, "#ifndef public", 14)) {
        !           151:            copytext = true;
        !           152:            nesting = 1;
        !           153:        } else if (streqn(line, "public", 6)) {
        !           154:            copydef(line);
        !           155:        } else if (copytext) {
        !           156:            if (streqn(line, "#ifdef", 6) or streqn(line, "#ifndef", 7)) {
        !           157:                ++nesting;
        !           158:                printf("%s\n", line);
        !           159:            } else if (streqn(line, "#endif", 6)) {
        !           160:                --nesting;
        !           161:                if (nesting <= 0) {
        !           162:                    copytext = false;
        !           163:                } else {
        !           164:                    printf("%s\n", line);
        !           165:                }
        !           166:            } else {
        !           167:                printf("%s\n", line);
        !           168:            }
        !           169:        } else if (
        !           170:            streqn(line, "#ifdef", 6) or
        !           171:            streqn(line, "#ifndef", 7) or
        !           172:            streqn(line, "#else", 5) or
        !           173:            streqn(line, "#endif", 6)
        !           174:        ) {
        !           175:            printf("%s\n", line);
        !           176:        }
        !           177:     }
        !           178: }
        !           179: 
        !           180: copydef(s)
        !           181: String s;
        !           182: {
        !           183:     register char *p;
        !           184:     register Boolean isproc;
        !           185: 
        !           186:     isproc = false;
        !           187:     for (p = &s[7]; *p != '\0' and *p != '='; p++) {
        !           188:        if (*p == '(') {
        !           189:            isproc = true;
        !           190:            printf("(/* ");
        !           191:        } else if (*p == ')' and isproc and *(p+1) == '\0') {
        !           192:            printf(" */)");
        !           193:        } else {
        !           194:            putchar(*p);
        !           195:        }
        !           196:     }
        !           197:     if (isproc or *p == '=') {
        !           198:        putchar(';');
        !           199:     }
        !           200:     putchar('\n');
        !           201: }
        !           202: 
        !           203: /*
        !           204:  * Terminate program.
        !           205:  */
        !           206: 
        !           207: procedure abnorm(signo)
        !           208: int signo;
        !           209: {
        !           210:     unlink(tmpname);
        !           211:     quit(signo);
        !           212: }
        !           213: 
        !           214: quit(r)
        !           215: int r;
        !           216: {
        !           217:     exit(r);
        !           218: }
        !           219: 
        !           220: /*
        !           221:  * No special error recovery strategy.
        !           222:  */
        !           223: 
        !           224: erecover()
        !           225: {
        !           226: }

unix.superglobalmegacorp.com

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