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*37790Sbostic static char sccsid[] = "@(#)makedefs.c 5.4 (Berkeley) 05/10/89"; 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> 38*37790Sbostic #include "pathnames.h" 399670Slinton 409670Slinton #define procedure void 419670Slinton 4233323Sdonn #define streqn(s1, s2, n) (strncmp(s1, s2, n) == 0) 4333323Sdonn 449670Slinton Boolean force; 459670Slinton Boolean copytext; 469670Slinton 479670Slinton String tmpname; 489670Slinton String modulename(); 499670Slinton procedure abnorm(); 509670Slinton 519670Slinton main(argc, argv) 529670Slinton int argc; 539670Slinton String argv[]; 549670Slinton { 559670Slinton extern String mktemp(); 569670Slinton String name; 579670Slinton File tmp; 589670Slinton Integer r; 599670Slinton Integer index; 609670Slinton 619670Slinton if (streq(argv[1], "-f")) { 629670Slinton force = true; 639670Slinton index = 2; 649670Slinton } else { 659670Slinton force = false; 669670Slinton index = 1; 679670Slinton } 689670Slinton if (argc - index > 2) { 699670Slinton fatal("usage: makedefs [ -f ] file.c [ file.h ]\n"); 709670Slinton } 719670Slinton tmp = nil; 729670Slinton if (freopen(argv[index], "r", stdin) == NULL) { 739670Slinton fatal("can't read %s", argv[index]); 749670Slinton } 759670Slinton signal(SIGINT, abnorm); 769670Slinton signal(SIGQUIT, abnorm); 779670Slinton if (index + 1 < argc) { 789670Slinton if (force) { 799670Slinton tmpname = argv[index + 1]; 809670Slinton } else { 81*37790Sbostic tmpname = mktemp(_PATH_TMP); 829670Slinton } 839670Slinton tmp = freopen(tmpname, "w", stdout); 849670Slinton if (tmp == nil) { 859670Slinton fatal("can't write %s", tmpname); 869670Slinton } 879670Slinton } 889670Slinton copytext = false; 899670Slinton name = modulename(argv[index]); 909670Slinton printf("#ifndef %s\n", name); 919670Slinton printf("#define %s\n", name); 929670Slinton copy(); 939670Slinton printf("#endif\n"); 949670Slinton if (tmp != NULL and not force) { 959670Slinton fclose(tmp); 969670Slinton r = call("cmp", stdin, stderr, "-s", tmpname, argv[2], nil); 979670Slinton if (r != 0) { 989670Slinton r = call("cp", stdin, stderr, tmpname, argv[2], nil); 999670Slinton if (r != 0) { 1009670Slinton fprintf(stderr, "can't create %s\n", argv[2]); 1019670Slinton } 1029670Slinton } 1039670Slinton unlink(tmpname); 1049670Slinton } 1059670Slinton quit(0); 1069670Slinton } 1079670Slinton 1089670Slinton String modulename(s) 1099670Slinton String s; 1109670Slinton { 1119670Slinton String r, i, j; 1129670Slinton static char buf[256]; 1139670Slinton 1149670Slinton strcpy(buf, s); 1159670Slinton i = rindex(buf, '/'); 1169670Slinton if (i == nil) { 1179670Slinton i = buf; 11833383Sdonn } else { 11933383Sdonn ++i; 1209670Slinton } 12133383Sdonn for (j = i; *j; j++) { 12233383Sdonn if (*j == '.') { 12333383Sdonn *j = '_'; 12433383Sdonn } 12533383Sdonn } 12633383Sdonn if (j > i && *--j == 'c') { 12733383Sdonn *j = 'h'; 12833383Sdonn } 12933383Sdonn return i; 1309670Slinton } 1319670Slinton 1329670Slinton copy() 1339670Slinton { 1349670Slinton register char *p; 13533323Sdonn integer nesting; 1369670Slinton char line[1024]; 1379670Slinton 1389670Slinton while (gets(line) != NULL) { 13933323Sdonn if (streqn(line, "#ifndef public", 14)) { 1409670Slinton copytext = true; 14133323Sdonn nesting = 1; 14233323Sdonn } else if (streqn(line, "public", 6)) { 1439670Slinton copydef(line); 1449670Slinton } else if (copytext) { 14533323Sdonn if (streqn(line, "#ifdef", 6) or streqn(line, "#ifndef", 7)) { 14633323Sdonn ++nesting; 14733323Sdonn printf("%s\n", line); 14833323Sdonn } else if (streqn(line, "#endif", 6)) { 14933323Sdonn --nesting; 15033323Sdonn if (nesting <= 0) { 15133323Sdonn copytext = false; 15233323Sdonn } else { 15333323Sdonn printf("%s\n", line); 15433323Sdonn } 15533323Sdonn } else { 15633323Sdonn printf("%s\n", line); 15733323Sdonn } 15833323Sdonn } else if ( 15933323Sdonn streqn(line, "#ifdef", 6) or 16033323Sdonn streqn(line, "#ifndef", 7) or 16133323Sdonn streqn(line, "#else", 5) or 16233323Sdonn streqn(line, "#endif", 6) 16333323Sdonn ) { 1649670Slinton printf("%s\n", line); 1659670Slinton } 1669670Slinton } 1679670Slinton } 1689670Slinton 1699670Slinton copydef(s) 1709670Slinton String s; 1719670Slinton { 1729670Slinton register char *p; 1739670Slinton register Boolean isproc; 1749670Slinton 1759670Slinton isproc = false; 1769670Slinton for (p = &s[7]; *p != '\0' and *p != '='; p++) { 1779670Slinton if (*p == '(') { 1789670Slinton isproc = true; 1799670Slinton printf("(/* "); 1809670Slinton } else if (*p == ')' and isproc and *(p+1) == '\0') { 1819670Slinton printf(" */)"); 1829670Slinton } else { 1839670Slinton putchar(*p); 1849670Slinton } 1859670Slinton } 1869670Slinton if (isproc or *p == '=') { 1879670Slinton putchar(';'); 1889670Slinton } 1899670Slinton putchar('\n'); 1909670Slinton } 1919670Slinton 1929670Slinton /* 1939670Slinton * Terminate program. 1949670Slinton */ 1959670Slinton 1969670Slinton procedure abnorm(signo) 1979670Slinton int signo; 1989670Slinton { 1999670Slinton unlink(tmpname); 2009670Slinton quit(signo); 2019670Slinton } 2029670Slinton 2039670Slinton quit(r) 2049670Slinton int r; 2059670Slinton { 2069670Slinton exit(r); 2079670Slinton } 2089670Slinton 2099670Slinton /* 2109670Slinton * No special error recovery strategy. 2119670Slinton */ 2129670Slinton 2139670Slinton erecover() 2149670Slinton { 2159670Slinton } 216