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*33383Sdonn static char sccsid[] = "@(#)makedefs.c 5.3 (Berkeley) 01/22/88"; 1521610Sdist #endif not lint 1621610Sdist 1733323Sdonn 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 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 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; 117*33383Sdonn } else { 118*33383Sdonn ++i; 1199670Slinton } 120*33383Sdonn for (j = i; *j; j++) { 121*33383Sdonn if (*j == '.') { 122*33383Sdonn *j = '_'; 123*33383Sdonn } 124*33383Sdonn } 125*33383Sdonn if (j > i && *--j == 'c') { 126*33383Sdonn *j = 'h'; 127*33383Sdonn } 128*33383Sdonn return i; 1299670Slinton } 1309670Slinton 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 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 1959670Slinton procedure abnorm(signo) 1969670Slinton int signo; 1979670Slinton { 1989670Slinton unlink(tmpname); 1999670Slinton quit(signo); 2009670Slinton } 2019670Slinton 2029670Slinton quit(r) 2039670Slinton int r; 2049670Slinton { 2059670Slinton exit(r); 2069670Slinton } 2079670Slinton 2089670Slinton /* 2099670Slinton * No special error recovery strategy. 2109670Slinton */ 2119670Slinton 2129670Slinton erecover() 2139670Slinton { 2149670Slinton } 215