xref: /original-bsd/old/dbx/makedefs.c (revision 1808f06c)
1a47ca249Sdist /*
2be26f981Sbostic  * Copyright (c) 1983 The Regents of the University of California.
3be26f981Sbostic  * All rights reserved.
4be26f981Sbostic  *
5*1808f06cSbostic  * %sccs.include.redist.c%
6a47ca249Sdist  */
743461268Slinton 
8a47ca249Sdist #ifndef lint
9a47ca249Sdist char copyright[] =
10be26f981Sbostic "@(#) Copyright (c) 1983 The Regents of the University of California.\n\
11a47ca249Sdist  All rights reserved.\n";
12be26f981Sbostic #endif /* not lint */
13a47ca249Sdist 
14a47ca249Sdist #ifndef lint
15*1808f06cSbostic static char sccsid[] = "@(#)makedefs.c	5.6 (Berkeley) 06/01/90";
16be26f981Sbostic #endif /* not lint */
1747ab37e0Ssam 
1843461268Slinton /*
1943461268Slinton  * Create a definitions file (e.g. .h) from an implementation file (e.g. .c).
2043461268Slinton  *
2143461268Slinton  * Usage is "makedefs source.c source.h" where source.h is to be created.
2243461268Slinton  *
2343461268Slinton  * Lines beginning with "public" or within a "#ifndef public ... #endif"
2443461268Slinton  * block are copied to the new file.  Initializations (e.g. "int x = 3") are
2543461268Slinton  * omitted ("int x;" is output).
2643461268Slinton  *
2743461268Slinton  * Normally a temporary definitions file is created and compared to
2843461268Slinton  * the given destination.  If they are different, the temporary file
2943461268Slinton  * is copied on top of the destination.  This is so that dependencies
3043461268Slinton  * when using "make" are not triggered.
3143461268Slinton  *
3243461268Slinton  * The "-f" option overrides this and forces the destination file to be created.
3343461268Slinton  */
3443461268Slinton 
3543461268Slinton #include "defs.h"
3643461268Slinton #include <signal.h>
374a01dc16Sbostic #include "pathnames.h"
3843461268Slinton 
3943461268Slinton #define procedure void
4043461268Slinton 
4165ece679Sdonn #define streqn(s1, s2, n) (strncmp(s1, s2, n) == 0)
4265ece679Sdonn 
4343461268Slinton Boolean force;
4443461268Slinton Boolean copytext;
4543461268Slinton 
4643461268Slinton String tmpname;
4743461268Slinton String modulename();
4843461268Slinton procedure abnorm();
4943461268Slinton 
main(argc,argv)5043461268Slinton main(argc, argv)
5143461268Slinton int argc;
5243461268Slinton String argv[];
5343461268Slinton {
5443461268Slinton     extern String mktemp();
5543461268Slinton     String name;
5643461268Slinton     File tmp;
5743461268Slinton     Integer r;
5843461268Slinton     Integer index;
5943461268Slinton 
6043461268Slinton     if (streq(argv[1], "-f")) {
6143461268Slinton 	force = true;
6243461268Slinton 	index = 2;
6343461268Slinton     } else {
6443461268Slinton 	force = false;
6543461268Slinton 	index = 1;
6643461268Slinton     }
6743461268Slinton     if (argc - index > 2) {
6843461268Slinton 	fatal("usage: makedefs [ -f ] file.c [ file.h ]\n");
6943461268Slinton     }
7043461268Slinton     tmp = nil;
7143461268Slinton     if (freopen(argv[index], "r", stdin) == NULL) {
7243461268Slinton 	fatal("can't read %s", argv[index]);
7343461268Slinton     }
7443461268Slinton     signal(SIGINT, abnorm);
7543461268Slinton     signal(SIGQUIT, abnorm);
7643461268Slinton     if (index + 1 < argc) {
7743461268Slinton 	if (force) {
7843461268Slinton 	    tmpname = argv[index + 1];
7943461268Slinton 	} else {
804a01dc16Sbostic 	    tmpname = mktemp(_PATH_TMP);
8143461268Slinton 	}
8243461268Slinton 	tmp = freopen(tmpname, "w", stdout);
8343461268Slinton 	if (tmp == nil) {
8443461268Slinton 	    fatal("can't write %s", tmpname);
8543461268Slinton 	}
8643461268Slinton     }
8743461268Slinton     copytext = false;
8843461268Slinton     name = modulename(argv[index]);
8943461268Slinton     printf("#ifndef %s\n", name);
9043461268Slinton     printf("#define %s\n", name);
9143461268Slinton     copy();
9243461268Slinton     printf("#endif\n");
9343461268Slinton     if (tmp != NULL and not force) {
9443461268Slinton 	fclose(tmp);
9543461268Slinton 	r = call("cmp", stdin, stderr, "-s", tmpname, argv[2], nil);
9643461268Slinton 	if (r != 0) {
9743461268Slinton 	    r = call("cp", stdin, stderr, tmpname, argv[2], nil);
9843461268Slinton 	    if (r != 0) {
9943461268Slinton 		fprintf(stderr, "can't create %s\n", argv[2]);
10043461268Slinton 	    }
10143461268Slinton 	}
10243461268Slinton 	unlink(tmpname);
10343461268Slinton     }
10443461268Slinton     quit(0);
10543461268Slinton }
10643461268Slinton 
modulename(s)10743461268Slinton String modulename(s)
10843461268Slinton String s;
10943461268Slinton {
11043461268Slinton     String r, i, j;
11143461268Slinton     static char buf[256];
11243461268Slinton 
11343461268Slinton     strcpy(buf, s);
11443461268Slinton     i = rindex(buf, '/');
11543461268Slinton     if (i == nil) {
11643461268Slinton 	i = buf;
117efbfe1f7Sdonn     } else {
118efbfe1f7Sdonn 	++i;
11943461268Slinton     }
120efbfe1f7Sdonn     for (j = i; *j; j++) {
121efbfe1f7Sdonn 	if (*j == '.') {
122efbfe1f7Sdonn 	    *j = '_';
123efbfe1f7Sdonn 	}
124efbfe1f7Sdonn     }
125efbfe1f7Sdonn     if (j > i && *--j == 'c') {
126efbfe1f7Sdonn 	*j = 'h';
127efbfe1f7Sdonn     }
128efbfe1f7Sdonn     return i;
12943461268Slinton }
13043461268Slinton 
copy()13143461268Slinton copy()
13243461268Slinton {
13343461268Slinton     register char *p;
13465ece679Sdonn     integer nesting;
13543461268Slinton     char line[1024];
13643461268Slinton 
13743461268Slinton     while (gets(line) != NULL) {
13865ece679Sdonn 	if (streqn(line, "#ifndef public", 14)) {
13943461268Slinton 	    copytext = true;
14065ece679Sdonn 	    nesting = 1;
14165ece679Sdonn 	} else if (streqn(line, "public", 6)) {
14243461268Slinton 	    copydef(line);
14343461268Slinton 	} else if (copytext) {
14465ece679Sdonn 	    if (streqn(line, "#ifdef", 6) or streqn(line, "#ifndef", 7)) {
14565ece679Sdonn 		++nesting;
14665ece679Sdonn 		printf("%s\n", line);
14765ece679Sdonn 	    } else if (streqn(line, "#endif", 6)) {
14865ece679Sdonn 		--nesting;
14965ece679Sdonn 		if (nesting <= 0) {
15065ece679Sdonn 		    copytext = false;
15165ece679Sdonn 		} else {
15265ece679Sdonn 		    printf("%s\n", line);
15365ece679Sdonn 		}
15465ece679Sdonn 	    } else {
15565ece679Sdonn 		printf("%s\n", line);
15665ece679Sdonn 	    }
15765ece679Sdonn 	} else if (
15865ece679Sdonn 	    streqn(line, "#ifdef", 6) or
15965ece679Sdonn 	    streqn(line, "#ifndef", 7) or
16065ece679Sdonn 	    streqn(line, "#else", 5) or
16165ece679Sdonn 	    streqn(line, "#endif", 6)
16265ece679Sdonn 	) {
16343461268Slinton 	    printf("%s\n", line);
16443461268Slinton 	}
16543461268Slinton     }
16643461268Slinton }
16743461268Slinton 
copydef(s)16843461268Slinton copydef(s)
16943461268Slinton String s;
17043461268Slinton {
17143461268Slinton     register char *p;
17243461268Slinton     register Boolean isproc;
17343461268Slinton 
17443461268Slinton     isproc = false;
17543461268Slinton     for (p = &s[7]; *p != '\0' and *p != '='; p++) {
17643461268Slinton 	if (*p == '(') {
17743461268Slinton 	    isproc = true;
17843461268Slinton 	    printf("(/* ");
17943461268Slinton 	} else if (*p == ')' and isproc and *(p+1) == '\0') {
18043461268Slinton 	    printf(" */)");
18143461268Slinton 	} else {
18243461268Slinton 	    putchar(*p);
18343461268Slinton 	}
18443461268Slinton     }
18543461268Slinton     if (isproc or *p == '=') {
18643461268Slinton 	putchar(';');
18743461268Slinton     }
18843461268Slinton     putchar('\n');
18943461268Slinton }
19043461268Slinton 
19143461268Slinton /*
19243461268Slinton  * Terminate program.
19343461268Slinton  */
19443461268Slinton 
abnorm(signo)19543461268Slinton procedure abnorm(signo)
19643461268Slinton int signo;
19743461268Slinton {
19843461268Slinton     unlink(tmpname);
19943461268Slinton     quit(signo);
20043461268Slinton }
20143461268Slinton 
quit(r)20243461268Slinton quit(r)
20343461268Slinton int r;
20443461268Slinton {
20543461268Slinton     exit(r);
20643461268Slinton }
20743461268Slinton 
20843461268Slinton /*
20943461268Slinton  * No special error recovery strategy.
21043461268Slinton  */
21143461268Slinton 
erecover()21243461268Slinton erecover()
21343461268Slinton {
21443461268Slinton }
215