xref: /csrg-svn/old/dbx/makedefs.c (revision 21610)
1*21610Sdist /*
2*21610Sdist  * Copyright (c) 1983 Regents of the University of California.
3*21610Sdist  * All rights reserved.  The Berkeley software License Agreement
4*21610Sdist  * specifies the terms and conditions for redistribution.
5*21610Sdist  */
69670Slinton 
7*21610Sdist #ifndef lint
8*21610Sdist char copyright[] =
9*21610Sdist "@(#) Copyright (c) 1983 Regents of the University of California.\n\
10*21610Sdist  All rights reserved.\n";
11*21610Sdist #endif not lint
129670Slinton 
13*21610Sdist #ifndef lint
14*21610Sdist static char sccsid[] = "@(#)makedefs.c	5.1 (Berkeley) 05/31/85";
15*21610Sdist #endif not lint
16*21610Sdist 
1718224Slinton static char rcsid[] = "$Header: makedefs.c,v 1.4 84/12/26 10:40:22 linton 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 
419670Slinton Boolean force;
429670Slinton Boolean copytext;
439670Slinton 
449670Slinton String tmpname;
459670Slinton String modulename();
469670Slinton procedure abnorm();
479670Slinton 
489670Slinton main(argc, argv)
499670Slinton int argc;
509670Slinton String argv[];
519670Slinton {
529670Slinton     extern String mktemp();
539670Slinton     String name;
549670Slinton     File tmp;
559670Slinton     Integer r;
569670Slinton     Integer index;
579670Slinton 
589670Slinton     if (streq(argv[1], "-f")) {
599670Slinton 	force = true;
609670Slinton 	index = 2;
619670Slinton     } else {
629670Slinton 	force = false;
639670Slinton 	index = 1;
649670Slinton     }
659670Slinton     if (argc - index > 2) {
669670Slinton 	fatal("usage: makedefs [ -f ] file.c [ file.h ]\n");
679670Slinton     }
689670Slinton     tmp = nil;
699670Slinton     if (freopen(argv[index], "r", stdin) == NULL) {
709670Slinton 	fatal("can't read %s", argv[index]);
719670Slinton     }
729670Slinton     signal(SIGINT, abnorm);
739670Slinton     signal(SIGQUIT, abnorm);
749670Slinton     if (index + 1 < argc) {
759670Slinton 	if (force) {
769670Slinton 	    tmpname = argv[index + 1];
779670Slinton 	} else {
789670Slinton 	    tmpname = mktemp("/tmp/makedefsXXXXXX");
799670Slinton 	}
809670Slinton 	tmp = freopen(tmpname, "w", stdout);
819670Slinton 	if (tmp == nil) {
829670Slinton 	    fatal("can't write %s", tmpname);
839670Slinton 	}
849670Slinton     }
859670Slinton     copytext = false;
869670Slinton     name = modulename(argv[index]);
879670Slinton     printf("#ifndef %s\n", name);
889670Slinton     printf("#define %s\n", name);
899670Slinton     copy();
909670Slinton     printf("#endif\n");
919670Slinton     if (tmp != NULL and not force) {
929670Slinton 	fclose(tmp);
939670Slinton 	r = call("cmp", stdin, stderr, "-s", tmpname, argv[2], nil);
949670Slinton 	if (r != 0) {
959670Slinton 	    r = call("cp", stdin, stderr, tmpname, argv[2], nil);
969670Slinton 	    if (r != 0) {
979670Slinton 		fprintf(stderr, "can't create %s\n", argv[2]);
989670Slinton 	    }
999670Slinton 	}
1009670Slinton 	unlink(tmpname);
1019670Slinton     }
1029670Slinton     quit(0);
1039670Slinton }
1049670Slinton 
1059670Slinton String modulename(s)
1069670Slinton String s;
1079670Slinton {
1089670Slinton     String r, i, j;
1099670Slinton     static char buf[256];
1109670Slinton 
1119670Slinton     strcpy(buf, s);
1129670Slinton     i = rindex(buf, '/');
1139670Slinton     if (i == nil) {
1149670Slinton 	i = buf;
1159670Slinton     }
1169670Slinton     for (j = i; *j != '.'; j++);
1179670Slinton     *j++ = '_';
1189670Slinton     *j++ = 'h';
1199670Slinton     *j = '\0';
1209670Slinton     return buf;
1219670Slinton }
1229670Slinton 
1239670Slinton copy()
1249670Slinton {
1259670Slinton     register char *p;
1269670Slinton     char line[1024];
1279670Slinton 
1289670Slinton     while (gets(line) != NULL) {
1299670Slinton 	if (strncmp(line, "#ifndef public", 14) == 0) {
1309670Slinton 	    copytext = true;
1319670Slinton 	} else if (strncmp(line, "#endif", 6) == 0) {
1329670Slinton 	    copytext = false;
1339670Slinton 	} else if (strncmp(line, "public", 6) == 0) {
1349670Slinton 	    copydef(line);
1359670Slinton 	} else if (copytext) {
1369670Slinton 	    printf("%s\n", line);
1379670Slinton 	}
1389670Slinton     }
1399670Slinton }
1409670Slinton 
1419670Slinton copydef(s)
1429670Slinton String s;
1439670Slinton {
1449670Slinton     register char *p;
1459670Slinton     register Boolean isproc;
1469670Slinton 
1479670Slinton     isproc = false;
1489670Slinton     for (p = &s[7]; *p != '\0' and *p != '='; p++) {
1499670Slinton 	if (*p == '(') {
1509670Slinton 	    isproc = true;
1519670Slinton 	    printf("(/* ");
1529670Slinton 	} else if (*p == ')' and isproc and *(p+1) == '\0') {
1539670Slinton 	    printf(" */)");
1549670Slinton 	} else {
1559670Slinton 	    putchar(*p);
1569670Slinton 	}
1579670Slinton     }
1589670Slinton     if (isproc or *p == '=') {
1599670Slinton 	putchar(';');
1609670Slinton     }
1619670Slinton     putchar('\n');
1629670Slinton }
1639670Slinton 
1649670Slinton /*
1659670Slinton  * Terminate program.
1669670Slinton  */
1679670Slinton 
1689670Slinton procedure abnorm(signo)
1699670Slinton int signo;
1709670Slinton {
1719670Slinton     unlink(tmpname);
1729670Slinton     quit(signo);
1739670Slinton }
1749670Slinton 
1759670Slinton quit(r)
1769670Slinton int r;
1779670Slinton {
1789670Slinton     exit(r);
1799670Slinton }
1809670Slinton 
1819670Slinton /*
1829670Slinton  * No special error recovery strategy.
1839670Slinton  */
1849670Slinton 
1859670Slinton erecover()
1869670Slinton {
1879670Slinton }
188