xref: /csrg-svn/old/dbx/makedefs.c (revision 18224)
19670Slinton /* Copyright (c) 1982 Regents of the University of California */
29670Slinton 
3*18224Slinton static	char sccsid[] = "@(#)makedefs.c	1.4 (Berkeley) 03/01/85";
49670Slinton 
5*18224Slinton static char rcsid[] = "$Header: makedefs.c,v 1.4 84/12/26 10:40:22 linton Exp $";
6*18224Slinton 
79670Slinton /*
89670Slinton  * Create a definitions file (e.g. .h) from an implementation file (e.g. .c).
99670Slinton  *
109670Slinton  * Usage is "makedefs source.c source.h" where source.h is to be created.
119670Slinton  *
129670Slinton  * Lines beginning with "public" or within a "#ifndef public ... #endif"
139670Slinton  * block are copied to the new file.  Initializations (e.g. "int x = 3") are
149670Slinton  * omitted ("int x;" is output).
159670Slinton  *
169670Slinton  * Normally a temporary definitions file is created and compared to
179670Slinton  * the given destination.  If they are different, the temporary file
189670Slinton  * is copied on top of the destination.  This is so that dependencies
199670Slinton  * when using "make" are not triggered.
209670Slinton  *
219670Slinton  * The "-f" option overrides this and forces the destination file to be created.
229670Slinton  */
239670Slinton 
249670Slinton #include "defs.h"
259670Slinton #include <signal.h>
269670Slinton 
279670Slinton #define procedure void
289670Slinton 
299670Slinton Boolean force;
309670Slinton Boolean copytext;
319670Slinton 
329670Slinton String tmpname;
339670Slinton String modulename();
349670Slinton procedure abnorm();
359670Slinton 
369670Slinton main(argc, argv)
379670Slinton int argc;
389670Slinton String argv[];
399670Slinton {
409670Slinton     extern String mktemp();
419670Slinton     String name;
429670Slinton     File tmp;
439670Slinton     Integer r;
449670Slinton     Integer index;
459670Slinton 
469670Slinton     if (streq(argv[1], "-f")) {
479670Slinton 	force = true;
489670Slinton 	index = 2;
499670Slinton     } else {
509670Slinton 	force = false;
519670Slinton 	index = 1;
529670Slinton     }
539670Slinton     if (argc - index > 2) {
549670Slinton 	fatal("usage: makedefs [ -f ] file.c [ file.h ]\n");
559670Slinton     }
569670Slinton     tmp = nil;
579670Slinton     if (freopen(argv[index], "r", stdin) == NULL) {
589670Slinton 	fatal("can't read %s", argv[index]);
599670Slinton     }
609670Slinton     signal(SIGINT, abnorm);
619670Slinton     signal(SIGQUIT, abnorm);
629670Slinton     if (index + 1 < argc) {
639670Slinton 	if (force) {
649670Slinton 	    tmpname = argv[index + 1];
659670Slinton 	} else {
669670Slinton 	    tmpname = mktemp("/tmp/makedefsXXXXXX");
679670Slinton 	}
689670Slinton 	tmp = freopen(tmpname, "w", stdout);
699670Slinton 	if (tmp == nil) {
709670Slinton 	    fatal("can't write %s", tmpname);
719670Slinton 	}
729670Slinton     }
739670Slinton     copytext = false;
749670Slinton     name = modulename(argv[index]);
759670Slinton     printf("#ifndef %s\n", name);
769670Slinton     printf("#define %s\n", name);
779670Slinton     copy();
789670Slinton     printf("#endif\n");
799670Slinton     if (tmp != NULL and not force) {
809670Slinton 	fclose(tmp);
819670Slinton 	r = call("cmp", stdin, stderr, "-s", tmpname, argv[2], nil);
829670Slinton 	if (r != 0) {
839670Slinton 	    r = call("cp", stdin, stderr, tmpname, argv[2], nil);
849670Slinton 	    if (r != 0) {
859670Slinton 		fprintf(stderr, "can't create %s\n", argv[2]);
869670Slinton 	    }
879670Slinton 	}
889670Slinton 	unlink(tmpname);
899670Slinton     }
909670Slinton     quit(0);
919670Slinton }
929670Slinton 
939670Slinton String modulename(s)
949670Slinton String s;
959670Slinton {
969670Slinton     String r, i, j;
979670Slinton     static char buf[256];
989670Slinton 
999670Slinton     strcpy(buf, s);
1009670Slinton     i = rindex(buf, '/');
1019670Slinton     if (i == nil) {
1029670Slinton 	i = buf;
1039670Slinton     }
1049670Slinton     for (j = i; *j != '.'; j++);
1059670Slinton     *j++ = '_';
1069670Slinton     *j++ = 'h';
1079670Slinton     *j = '\0';
1089670Slinton     return buf;
1099670Slinton }
1109670Slinton 
1119670Slinton copy()
1129670Slinton {
1139670Slinton     register char *p;
1149670Slinton     char line[1024];
1159670Slinton 
1169670Slinton     while (gets(line) != NULL) {
1179670Slinton 	if (strncmp(line, "#ifndef public", 14) == 0) {
1189670Slinton 	    copytext = true;
1199670Slinton 	} else if (strncmp(line, "#endif", 6) == 0) {
1209670Slinton 	    copytext = false;
1219670Slinton 	} else if (strncmp(line, "public", 6) == 0) {
1229670Slinton 	    copydef(line);
1239670Slinton 	} else if (copytext) {
1249670Slinton 	    printf("%s\n", line);
1259670Slinton 	}
1269670Slinton     }
1279670Slinton }
1289670Slinton 
1299670Slinton copydef(s)
1309670Slinton String s;
1319670Slinton {
1329670Slinton     register char *p;
1339670Slinton     register Boolean isproc;
1349670Slinton 
1359670Slinton     isproc = false;
1369670Slinton     for (p = &s[7]; *p != '\0' and *p != '='; p++) {
1379670Slinton 	if (*p == '(') {
1389670Slinton 	    isproc = true;
1399670Slinton 	    printf("(/* ");
1409670Slinton 	} else if (*p == ')' and isproc and *(p+1) == '\0') {
1419670Slinton 	    printf(" */)");
1429670Slinton 	} else {
1439670Slinton 	    putchar(*p);
1449670Slinton 	}
1459670Slinton     }
1469670Slinton     if (isproc or *p == '=') {
1479670Slinton 	putchar(';');
1489670Slinton     }
1499670Slinton     putchar('\n');
1509670Slinton }
1519670Slinton 
1529670Slinton /*
1539670Slinton  * Terminate program.
1549670Slinton  */
1559670Slinton 
1569670Slinton procedure abnorm(signo)
1579670Slinton int signo;
1589670Slinton {
1599670Slinton     unlink(tmpname);
1609670Slinton     quit(signo);
1619670Slinton }
1629670Slinton 
1639670Slinton quit(r)
1649670Slinton int r;
1659670Slinton {
1669670Slinton     exit(r);
1679670Slinton }
1689670Slinton 
1699670Slinton /*
1709670Slinton  * No special error recovery strategy.
1719670Slinton  */
1729670Slinton 
1739670Slinton erecover()
1749670Slinton {
1759670Slinton }
176