xref: /csrg-svn/old/dbx/makedefs.c (revision 33323)
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*33323Sdonn static char sccsid[] = "@(#)makedefs.c	5.2 (Berkeley) 01/12/88";
1521610Sdist #endif not lint
1621610Sdist 
17*33323Sdonn 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>
389670Slinton 
399670Slinton #define procedure void
409670Slinton 
41*33323Sdonn #define streqn(s1, s2, n) (strncmp(s1, s2, n) == 0)
42*33323Sdonn 
439670Slinton Boolean force;
449670Slinton Boolean copytext;
459670Slinton 
469670Slinton String tmpname;
479670Slinton String modulename();
489670Slinton procedure abnorm();
499670Slinton 
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 {
809670Slinton 	    tmpname = mktemp("/tmp/makedefsXXXXXX");
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 
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;
1179670Slinton     }
1189670Slinton     for (j = i; *j != '.'; j++);
1199670Slinton     *j++ = '_';
1209670Slinton     *j++ = 'h';
1219670Slinton     *j = '\0';
1229670Slinton     return buf;
1239670Slinton }
1249670Slinton 
1259670Slinton copy()
1269670Slinton {
1279670Slinton     register char *p;
128*33323Sdonn     integer nesting;
1299670Slinton     char line[1024];
1309670Slinton 
1319670Slinton     while (gets(line) != NULL) {
132*33323Sdonn 	if (streqn(line, "#ifndef public", 14)) {
1339670Slinton 	    copytext = true;
134*33323Sdonn 	    nesting = 1;
135*33323Sdonn 	} else if (streqn(line, "public", 6)) {
1369670Slinton 	    copydef(line);
1379670Slinton 	} else if (copytext) {
138*33323Sdonn 	    if (streqn(line, "#ifdef", 6) or streqn(line, "#ifndef", 7)) {
139*33323Sdonn 		++nesting;
140*33323Sdonn 		printf("%s\n", line);
141*33323Sdonn 	    } else if (streqn(line, "#endif", 6)) {
142*33323Sdonn 		--nesting;
143*33323Sdonn 		if (nesting <= 0) {
144*33323Sdonn 		    copytext = false;
145*33323Sdonn 		} else {
146*33323Sdonn 		    printf("%s\n", line);
147*33323Sdonn 		}
148*33323Sdonn 	    } else {
149*33323Sdonn 		printf("%s\n", line);
150*33323Sdonn 	    }
151*33323Sdonn 	} else if (
152*33323Sdonn 	    streqn(line, "#ifdef", 6) or
153*33323Sdonn 	    streqn(line, "#ifndef", 7) or
154*33323Sdonn 	    streqn(line, "#else", 5) or
155*33323Sdonn 	    streqn(line, "#endif", 6)
156*33323Sdonn 	) {
1579670Slinton 	    printf("%s\n", line);
1589670Slinton 	}
1599670Slinton     }
1609670Slinton }
1619670Slinton 
1629670Slinton copydef(s)
1639670Slinton String s;
1649670Slinton {
1659670Slinton     register char *p;
1669670Slinton     register Boolean isproc;
1679670Slinton 
1689670Slinton     isproc = false;
1699670Slinton     for (p = &s[7]; *p != '\0' and *p != '='; p++) {
1709670Slinton 	if (*p == '(') {
1719670Slinton 	    isproc = true;
1729670Slinton 	    printf("(/* ");
1739670Slinton 	} else if (*p == ')' and isproc and *(p+1) == '\0') {
1749670Slinton 	    printf(" */)");
1759670Slinton 	} else {
1769670Slinton 	    putchar(*p);
1779670Slinton 	}
1789670Slinton     }
1799670Slinton     if (isproc or *p == '=') {
1809670Slinton 	putchar(';');
1819670Slinton     }
1829670Slinton     putchar('\n');
1839670Slinton }
1849670Slinton 
1859670Slinton /*
1869670Slinton  * Terminate program.
1879670Slinton  */
1889670Slinton 
1899670Slinton procedure abnorm(signo)
1909670Slinton int signo;
1919670Slinton {
1929670Slinton     unlink(tmpname);
1939670Slinton     quit(signo);
1949670Slinton }
1959670Slinton 
1969670Slinton quit(r)
1979670Slinton int r;
1989670Slinton {
1999670Slinton     exit(r);
2009670Slinton }
2019670Slinton 
2029670Slinton /*
2039670Slinton  * No special error recovery strategy.
2049670Slinton  */
2059670Slinton 
2069670Slinton erecover()
2079670Slinton {
2089670Slinton }
209