xref: /csrg-svn/old/dbx/makedefs.c (revision 42683)
121610Sdist /*
238105Sbostic  * Copyright (c) 1983 The Regents of the University of California.
338105Sbostic  * All rights reserved.
438105Sbostic  *
5*42683Sbostic  * %sccs.include.redist.c%
621610Sdist  */
79670Slinton 
821610Sdist #ifndef lint
921610Sdist char copyright[] =
1038105Sbostic "@(#) Copyright (c) 1983 The Regents of the University of California.\n\
1121610Sdist  All rights reserved.\n";
1238105Sbostic #endif /* not lint */
139670Slinton 
1421610Sdist #ifndef lint
15*42683Sbostic static char sccsid[] = "@(#)makedefs.c	5.6 (Berkeley) 06/01/90";
1638105Sbostic #endif /* not lint */
1721610Sdist 
189670Slinton /*
199670Slinton  * Create a definitions file (e.g. .h) from an implementation file (e.g. .c).
209670Slinton  *
219670Slinton  * Usage is "makedefs source.c source.h" where source.h is to be created.
229670Slinton  *
239670Slinton  * Lines beginning with "public" or within a "#ifndef public ... #endif"
249670Slinton  * block are copied to the new file.  Initializations (e.g. "int x = 3") are
259670Slinton  * omitted ("int x;" is output).
269670Slinton  *
279670Slinton  * Normally a temporary definitions file is created and compared to
289670Slinton  * the given destination.  If they are different, the temporary file
299670Slinton  * is copied on top of the destination.  This is so that dependencies
309670Slinton  * when using "make" are not triggered.
319670Slinton  *
329670Slinton  * The "-f" option overrides this and forces the destination file to be created.
339670Slinton  */
349670Slinton 
359670Slinton #include "defs.h"
369670Slinton #include <signal.h>
3737790Sbostic #include "pathnames.h"
389670Slinton 
399670Slinton #define procedure void
409670Slinton 
4133323Sdonn #define streqn(s1, s2, n) (strncmp(s1, s2, n) == 0)
4233323Sdonn 
439670Slinton Boolean force;
449670Slinton Boolean copytext;
459670Slinton 
469670Slinton String tmpname;
479670Slinton String modulename();
489670Slinton procedure abnorm();
499670Slinton 
main(argc,argv)509670Slinton main(argc, argv)
519670Slinton int argc;
529670Slinton String argv[];
539670Slinton {
549670Slinton     extern String mktemp();
559670Slinton     String name;
569670Slinton     File tmp;
579670Slinton     Integer r;
589670Slinton     Integer index;
599670Slinton 
609670Slinton     if (streq(argv[1], "-f")) {
619670Slinton 	force = true;
629670Slinton 	index = 2;
639670Slinton     } else {
649670Slinton 	force = false;
659670Slinton 	index = 1;
669670Slinton     }
679670Slinton     if (argc - index > 2) {
689670Slinton 	fatal("usage: makedefs [ -f ] file.c [ file.h ]\n");
699670Slinton     }
709670Slinton     tmp = nil;
719670Slinton     if (freopen(argv[index], "r", stdin) == NULL) {
729670Slinton 	fatal("can't read %s", argv[index]);
739670Slinton     }
749670Slinton     signal(SIGINT, abnorm);
759670Slinton     signal(SIGQUIT, abnorm);
769670Slinton     if (index + 1 < argc) {
779670Slinton 	if (force) {
789670Slinton 	    tmpname = argv[index + 1];
799670Slinton 	} else {
8037790Sbostic 	    tmpname = mktemp(_PATH_TMP);
819670Slinton 	}
829670Slinton 	tmp = freopen(tmpname, "w", stdout);
839670Slinton 	if (tmp == nil) {
849670Slinton 	    fatal("can't write %s", tmpname);
859670Slinton 	}
869670Slinton     }
879670Slinton     copytext = false;
889670Slinton     name = modulename(argv[index]);
899670Slinton     printf("#ifndef %s\n", name);
909670Slinton     printf("#define %s\n", name);
919670Slinton     copy();
929670Slinton     printf("#endif\n");
939670Slinton     if (tmp != NULL and not force) {
949670Slinton 	fclose(tmp);
959670Slinton 	r = call("cmp", stdin, stderr, "-s", tmpname, argv[2], nil);
969670Slinton 	if (r != 0) {
979670Slinton 	    r = call("cp", stdin, stderr, tmpname, argv[2], nil);
989670Slinton 	    if (r != 0) {
999670Slinton 		fprintf(stderr, "can't create %s\n", argv[2]);
1009670Slinton 	    }
1019670Slinton 	}
1029670Slinton 	unlink(tmpname);
1039670Slinton     }
1049670Slinton     quit(0);
1059670Slinton }
1069670Slinton 
modulename(s)1079670Slinton String modulename(s)
1089670Slinton String s;
1099670Slinton {
1109670Slinton     String r, i, j;
1119670Slinton     static char buf[256];
1129670Slinton 
1139670Slinton     strcpy(buf, s);
1149670Slinton     i = rindex(buf, '/');
1159670Slinton     if (i == nil) {
1169670Slinton 	i = buf;
11733383Sdonn     } else {
11833383Sdonn 	++i;
1199670Slinton     }
12033383Sdonn     for (j = i; *j; j++) {
12133383Sdonn 	if (*j == '.') {
12233383Sdonn 	    *j = '_';
12333383Sdonn 	}
12433383Sdonn     }
12533383Sdonn     if (j > i && *--j == 'c') {
12633383Sdonn 	*j = 'h';
12733383Sdonn     }
12833383Sdonn     return i;
1299670Slinton }
1309670Slinton 
copy()1319670Slinton copy()
1329670Slinton {
1339670Slinton     register char *p;
13433323Sdonn     integer nesting;
1359670Slinton     char line[1024];
1369670Slinton 
1379670Slinton     while (gets(line) != NULL) {
13833323Sdonn 	if (streqn(line, "#ifndef public", 14)) {
1399670Slinton 	    copytext = true;
14033323Sdonn 	    nesting = 1;
14133323Sdonn 	} else if (streqn(line, "public", 6)) {
1429670Slinton 	    copydef(line);
1439670Slinton 	} else if (copytext) {
14433323Sdonn 	    if (streqn(line, "#ifdef", 6) or streqn(line, "#ifndef", 7)) {
14533323Sdonn 		++nesting;
14633323Sdonn 		printf("%s\n", line);
14733323Sdonn 	    } else if (streqn(line, "#endif", 6)) {
14833323Sdonn 		--nesting;
14933323Sdonn 		if (nesting <= 0) {
15033323Sdonn 		    copytext = false;
15133323Sdonn 		} else {
15233323Sdonn 		    printf("%s\n", line);
15333323Sdonn 		}
15433323Sdonn 	    } else {
15533323Sdonn 		printf("%s\n", line);
15633323Sdonn 	    }
15733323Sdonn 	} else if (
15833323Sdonn 	    streqn(line, "#ifdef", 6) or
15933323Sdonn 	    streqn(line, "#ifndef", 7) or
16033323Sdonn 	    streqn(line, "#else", 5) or
16133323Sdonn 	    streqn(line, "#endif", 6)
16233323Sdonn 	) {
1639670Slinton 	    printf("%s\n", line);
1649670Slinton 	}
1659670Slinton     }
1669670Slinton }
1679670Slinton 
copydef(s)1689670Slinton copydef(s)
1699670Slinton String s;
1709670Slinton {
1719670Slinton     register char *p;
1729670Slinton     register Boolean isproc;
1739670Slinton 
1749670Slinton     isproc = false;
1759670Slinton     for (p = &s[7]; *p != '\0' and *p != '='; p++) {
1769670Slinton 	if (*p == '(') {
1779670Slinton 	    isproc = true;
1789670Slinton 	    printf("(/* ");
1799670Slinton 	} else if (*p == ')' and isproc and *(p+1) == '\0') {
1809670Slinton 	    printf(" */)");
1819670Slinton 	} else {
1829670Slinton 	    putchar(*p);
1839670Slinton 	}
1849670Slinton     }
1859670Slinton     if (isproc or *p == '=') {
1869670Slinton 	putchar(';');
1879670Slinton     }
1889670Slinton     putchar('\n');
1899670Slinton }
1909670Slinton 
1919670Slinton /*
1929670Slinton  * Terminate program.
1939670Slinton  */
1949670Slinton 
abnorm(signo)1959670Slinton procedure abnorm(signo)
1969670Slinton int signo;
1979670Slinton {
1989670Slinton     unlink(tmpname);
1999670Slinton     quit(signo);
2009670Slinton }
2019670Slinton 
quit(r)2029670Slinton quit(r)
2039670Slinton int r;
2049670Slinton {
2059670Slinton     exit(r);
2069670Slinton }
2079670Slinton 
2089670Slinton /*
2099670Slinton  * No special error recovery strategy.
2109670Slinton  */
2119670Slinton 
erecover()2129670Slinton erecover()
2139670Slinton {
2149670Slinton }
215