1a47ca249Sdist /*
2be26f981Sbostic * Copyright (c) 1983 The Regents of the University of California.
3be26f981Sbostic * All rights reserved.
4be26f981Sbostic *
5*1808f06cSbostic * %sccs.include.redist.c%
6a47ca249Sdist */
743461268Slinton
8a47ca249Sdist #ifndef lint
9a47ca249Sdist char copyright[] =
10be26f981Sbostic "@(#) Copyright (c) 1983 The Regents of the University of California.\n\
11a47ca249Sdist All rights reserved.\n";
12be26f981Sbostic #endif /* not lint */
13a47ca249Sdist
14a47ca249Sdist #ifndef lint
15*1808f06cSbostic static char sccsid[] = "@(#)makedefs.c 5.6 (Berkeley) 06/01/90";
16be26f981Sbostic #endif /* not lint */
1747ab37e0Ssam
1843461268Slinton /*
1943461268Slinton * Create a definitions file (e.g. .h) from an implementation file (e.g. .c).
2043461268Slinton *
2143461268Slinton * Usage is "makedefs source.c source.h" where source.h is to be created.
2243461268Slinton *
2343461268Slinton * Lines beginning with "public" or within a "#ifndef public ... #endif"
2443461268Slinton * block are copied to the new file. Initializations (e.g. "int x = 3") are
2543461268Slinton * omitted ("int x;" is output).
2643461268Slinton *
2743461268Slinton * Normally a temporary definitions file is created and compared to
2843461268Slinton * the given destination. If they are different, the temporary file
2943461268Slinton * is copied on top of the destination. This is so that dependencies
3043461268Slinton * when using "make" are not triggered.
3143461268Slinton *
3243461268Slinton * The "-f" option overrides this and forces the destination file to be created.
3343461268Slinton */
3443461268Slinton
3543461268Slinton #include "defs.h"
3643461268Slinton #include <signal.h>
374a01dc16Sbostic #include "pathnames.h"
3843461268Slinton
3943461268Slinton #define procedure void
4043461268Slinton
4165ece679Sdonn #define streqn(s1, s2, n) (strncmp(s1, s2, n) == 0)
4265ece679Sdonn
4343461268Slinton Boolean force;
4443461268Slinton Boolean copytext;
4543461268Slinton
4643461268Slinton String tmpname;
4743461268Slinton String modulename();
4843461268Slinton procedure abnorm();
4943461268Slinton
main(argc,argv)5043461268Slinton main(argc, argv)
5143461268Slinton int argc;
5243461268Slinton String argv[];
5343461268Slinton {
5443461268Slinton extern String mktemp();
5543461268Slinton String name;
5643461268Slinton File tmp;
5743461268Slinton Integer r;
5843461268Slinton Integer index;
5943461268Slinton
6043461268Slinton if (streq(argv[1], "-f")) {
6143461268Slinton force = true;
6243461268Slinton index = 2;
6343461268Slinton } else {
6443461268Slinton force = false;
6543461268Slinton index = 1;
6643461268Slinton }
6743461268Slinton if (argc - index > 2) {
6843461268Slinton fatal("usage: makedefs [ -f ] file.c [ file.h ]\n");
6943461268Slinton }
7043461268Slinton tmp = nil;
7143461268Slinton if (freopen(argv[index], "r", stdin) == NULL) {
7243461268Slinton fatal("can't read %s", argv[index]);
7343461268Slinton }
7443461268Slinton signal(SIGINT, abnorm);
7543461268Slinton signal(SIGQUIT, abnorm);
7643461268Slinton if (index + 1 < argc) {
7743461268Slinton if (force) {
7843461268Slinton tmpname = argv[index + 1];
7943461268Slinton } else {
804a01dc16Sbostic tmpname = mktemp(_PATH_TMP);
8143461268Slinton }
8243461268Slinton tmp = freopen(tmpname, "w", stdout);
8343461268Slinton if (tmp == nil) {
8443461268Slinton fatal("can't write %s", tmpname);
8543461268Slinton }
8643461268Slinton }
8743461268Slinton copytext = false;
8843461268Slinton name = modulename(argv[index]);
8943461268Slinton printf("#ifndef %s\n", name);
9043461268Slinton printf("#define %s\n", name);
9143461268Slinton copy();
9243461268Slinton printf("#endif\n");
9343461268Slinton if (tmp != NULL and not force) {
9443461268Slinton fclose(tmp);
9543461268Slinton r = call("cmp", stdin, stderr, "-s", tmpname, argv[2], nil);
9643461268Slinton if (r != 0) {
9743461268Slinton r = call("cp", stdin, stderr, tmpname, argv[2], nil);
9843461268Slinton if (r != 0) {
9943461268Slinton fprintf(stderr, "can't create %s\n", argv[2]);
10043461268Slinton }
10143461268Slinton }
10243461268Slinton unlink(tmpname);
10343461268Slinton }
10443461268Slinton quit(0);
10543461268Slinton }
10643461268Slinton
modulename(s)10743461268Slinton String modulename(s)
10843461268Slinton String s;
10943461268Slinton {
11043461268Slinton String r, i, j;
11143461268Slinton static char buf[256];
11243461268Slinton
11343461268Slinton strcpy(buf, s);
11443461268Slinton i = rindex(buf, '/');
11543461268Slinton if (i == nil) {
11643461268Slinton i = buf;
117efbfe1f7Sdonn } else {
118efbfe1f7Sdonn ++i;
11943461268Slinton }
120efbfe1f7Sdonn for (j = i; *j; j++) {
121efbfe1f7Sdonn if (*j == '.') {
122efbfe1f7Sdonn *j = '_';
123efbfe1f7Sdonn }
124efbfe1f7Sdonn }
125efbfe1f7Sdonn if (j > i && *--j == 'c') {
126efbfe1f7Sdonn *j = 'h';
127efbfe1f7Sdonn }
128efbfe1f7Sdonn return i;
12943461268Slinton }
13043461268Slinton
copy()13143461268Slinton copy()
13243461268Slinton {
13343461268Slinton register char *p;
13465ece679Sdonn integer nesting;
13543461268Slinton char line[1024];
13643461268Slinton
13743461268Slinton while (gets(line) != NULL) {
13865ece679Sdonn if (streqn(line, "#ifndef public", 14)) {
13943461268Slinton copytext = true;
14065ece679Sdonn nesting = 1;
14165ece679Sdonn } else if (streqn(line, "public", 6)) {
14243461268Slinton copydef(line);
14343461268Slinton } else if (copytext) {
14465ece679Sdonn if (streqn(line, "#ifdef", 6) or streqn(line, "#ifndef", 7)) {
14565ece679Sdonn ++nesting;
14665ece679Sdonn printf("%s\n", line);
14765ece679Sdonn } else if (streqn(line, "#endif", 6)) {
14865ece679Sdonn --nesting;
14965ece679Sdonn if (nesting <= 0) {
15065ece679Sdonn copytext = false;
15165ece679Sdonn } else {
15265ece679Sdonn printf("%s\n", line);
15365ece679Sdonn }
15465ece679Sdonn } else {
15565ece679Sdonn printf("%s\n", line);
15665ece679Sdonn }
15765ece679Sdonn } else if (
15865ece679Sdonn streqn(line, "#ifdef", 6) or
15965ece679Sdonn streqn(line, "#ifndef", 7) or
16065ece679Sdonn streqn(line, "#else", 5) or
16165ece679Sdonn streqn(line, "#endif", 6)
16265ece679Sdonn ) {
16343461268Slinton printf("%s\n", line);
16443461268Slinton }
16543461268Slinton }
16643461268Slinton }
16743461268Slinton
copydef(s)16843461268Slinton copydef(s)
16943461268Slinton String s;
17043461268Slinton {
17143461268Slinton register char *p;
17243461268Slinton register Boolean isproc;
17343461268Slinton
17443461268Slinton isproc = false;
17543461268Slinton for (p = &s[7]; *p != '\0' and *p != '='; p++) {
17643461268Slinton if (*p == '(') {
17743461268Slinton isproc = true;
17843461268Slinton printf("(/* ");
17943461268Slinton } else if (*p == ')' and isproc and *(p+1) == '\0') {
18043461268Slinton printf(" */)");
18143461268Slinton } else {
18243461268Slinton putchar(*p);
18343461268Slinton }
18443461268Slinton }
18543461268Slinton if (isproc or *p == '=') {
18643461268Slinton putchar(';');
18743461268Slinton }
18843461268Slinton putchar('\n');
18943461268Slinton }
19043461268Slinton
19143461268Slinton /*
19243461268Slinton * Terminate program.
19343461268Slinton */
19443461268Slinton
abnorm(signo)19543461268Slinton procedure abnorm(signo)
19643461268Slinton int signo;
19743461268Slinton {
19843461268Slinton unlink(tmpname);
19943461268Slinton quit(signo);
20043461268Slinton }
20143461268Slinton
quit(r)20243461268Slinton quit(r)
20343461268Slinton int r;
20443461268Slinton {
20543461268Slinton exit(r);
20643461268Slinton }
20743461268Slinton
20843461268Slinton /*
20943461268Slinton * No special error recovery strategy.
21043461268Slinton */
21143461268Slinton
erecover()21243461268Slinton erecover()
21343461268Slinton {
21443461268Slinton }
215