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*33323Sdonn static char sccsid[] = "@(#)makedefs.c 5.2 (Berkeley) 01/12/88"; 1521610Sdist #endif not lint 1621610Sdist 17*33323Sdonn 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 41*33323Sdonn #define streqn(s1, s2, n) (strncmp(s1, s2, n) == 0) 42*33323Sdonn 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; 1179670Slinton } 1189670Slinton for (j = i; *j != '.'; j++); 1199670Slinton *j++ = '_'; 1209670Slinton *j++ = 'h'; 1219670Slinton *j = '\0'; 1229670Slinton return buf; 1239670Slinton } 1249670Slinton 1259670Slinton copy() 1269670Slinton { 1279670Slinton register char *p; 128*33323Sdonn integer nesting; 1299670Slinton char line[1024]; 1309670Slinton 1319670Slinton while (gets(line) != NULL) { 132*33323Sdonn if (streqn(line, "#ifndef public", 14)) { 1339670Slinton copytext = true; 134*33323Sdonn nesting = 1; 135*33323Sdonn } else if (streqn(line, "public", 6)) { 1369670Slinton copydef(line); 1379670Slinton } else if (copytext) { 138*33323Sdonn if (streqn(line, "#ifdef", 6) or streqn(line, "#ifndef", 7)) { 139*33323Sdonn ++nesting; 140*33323Sdonn printf("%s\n", line); 141*33323Sdonn } else if (streqn(line, "#endif", 6)) { 142*33323Sdonn --nesting; 143*33323Sdonn if (nesting <= 0) { 144*33323Sdonn copytext = false; 145*33323Sdonn } else { 146*33323Sdonn printf("%s\n", line); 147*33323Sdonn } 148*33323Sdonn } else { 149*33323Sdonn printf("%s\n", line); 150*33323Sdonn } 151*33323Sdonn } else if ( 152*33323Sdonn streqn(line, "#ifdef", 6) or 153*33323Sdonn streqn(line, "#ifndef", 7) or 154*33323Sdonn streqn(line, "#else", 5) or 155*33323Sdonn streqn(line, "#endif", 6) 156*33323Sdonn ) { 1579670Slinton printf("%s\n", line); 1589670Slinton } 1599670Slinton } 1609670Slinton } 1619670Slinton 1629670Slinton copydef(s) 1639670Slinton String s; 1649670Slinton { 1659670Slinton register char *p; 1669670Slinton register Boolean isproc; 1679670Slinton 1689670Slinton isproc = false; 1699670Slinton for (p = &s[7]; *p != '\0' and *p != '='; p++) { 1709670Slinton if (*p == '(') { 1719670Slinton isproc = true; 1729670Slinton printf("(/* "); 1739670Slinton } else if (*p == ')' and isproc and *(p+1) == '\0') { 1749670Slinton printf(" */)"); 1759670Slinton } else { 1769670Slinton putchar(*p); 1779670Slinton } 1789670Slinton } 1799670Slinton if (isproc or *p == '=') { 1809670Slinton putchar(';'); 1819670Slinton } 1829670Slinton putchar('\n'); 1839670Slinton } 1849670Slinton 1859670Slinton /* 1869670Slinton * Terminate program. 1879670Slinton */ 1889670Slinton 1899670Slinton procedure abnorm(signo) 1909670Slinton int signo; 1919670Slinton { 1929670Slinton unlink(tmpname); 1939670Slinton quit(signo); 1949670Slinton } 1959670Slinton 1969670Slinton quit(r) 1979670Slinton int r; 1989670Slinton { 1999670Slinton exit(r); 2009670Slinton } 2019670Slinton 2029670Slinton /* 2039670Slinton * No special error recovery strategy. 2049670Slinton */ 2059670Slinton 2069670Slinton erecover() 2079670Slinton { 2089670Slinton } 209