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