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