19670Slinton /* Copyright (c) 1982 Regents of the University of California */ 29670Slinton 3*18224Slinton static char sccsid[] = "@(#)makedefs.c 1.4 (Berkeley) 03/01/85"; 49670Slinton 5*18224Slinton static char rcsid[] = "$Header: makedefs.c,v 1.4 84/12/26 10:40:22 linton Exp $"; 6*18224Slinton 79670Slinton /* 89670Slinton * Create a definitions file (e.g. .h) from an implementation file (e.g. .c). 99670Slinton * 109670Slinton * Usage is "makedefs source.c source.h" where source.h is to be created. 119670Slinton * 129670Slinton * Lines beginning with "public" or within a "#ifndef public ... #endif" 139670Slinton * block are copied to the new file. Initializations (e.g. "int x = 3") are 149670Slinton * omitted ("int x;" is output). 159670Slinton * 169670Slinton * Normally a temporary definitions file is created and compared to 179670Slinton * the given destination. If they are different, the temporary file 189670Slinton * is copied on top of the destination. This is so that dependencies 199670Slinton * when using "make" are not triggered. 209670Slinton * 219670Slinton * The "-f" option overrides this and forces the destination file to be created. 229670Slinton */ 239670Slinton 249670Slinton #include "defs.h" 259670Slinton #include <signal.h> 269670Slinton 279670Slinton #define procedure void 289670Slinton 299670Slinton Boolean force; 309670Slinton Boolean copytext; 319670Slinton 329670Slinton String tmpname; 339670Slinton String modulename(); 349670Slinton procedure abnorm(); 359670Slinton 369670Slinton main(argc, argv) 379670Slinton int argc; 389670Slinton String argv[]; 399670Slinton { 409670Slinton extern String mktemp(); 419670Slinton String name; 429670Slinton File tmp; 439670Slinton Integer r; 449670Slinton Integer index; 459670Slinton 469670Slinton if (streq(argv[1], "-f")) { 479670Slinton force = true; 489670Slinton index = 2; 499670Slinton } else { 509670Slinton force = false; 519670Slinton index = 1; 529670Slinton } 539670Slinton if (argc - index > 2) { 549670Slinton fatal("usage: makedefs [ -f ] file.c [ file.h ]\n"); 559670Slinton } 569670Slinton tmp = nil; 579670Slinton if (freopen(argv[index], "r", stdin) == NULL) { 589670Slinton fatal("can't read %s", argv[index]); 599670Slinton } 609670Slinton signal(SIGINT, abnorm); 619670Slinton signal(SIGQUIT, abnorm); 629670Slinton if (index + 1 < argc) { 639670Slinton if (force) { 649670Slinton tmpname = argv[index + 1]; 659670Slinton } else { 669670Slinton tmpname = mktemp("/tmp/makedefsXXXXXX"); 679670Slinton } 689670Slinton tmp = freopen(tmpname, "w", stdout); 699670Slinton if (tmp == nil) { 709670Slinton fatal("can't write %s", tmpname); 719670Slinton } 729670Slinton } 739670Slinton copytext = false; 749670Slinton name = modulename(argv[index]); 759670Slinton printf("#ifndef %s\n", name); 769670Slinton printf("#define %s\n", name); 779670Slinton copy(); 789670Slinton printf("#endif\n"); 799670Slinton if (tmp != NULL and not force) { 809670Slinton fclose(tmp); 819670Slinton r = call("cmp", stdin, stderr, "-s", tmpname, argv[2], nil); 829670Slinton if (r != 0) { 839670Slinton r = call("cp", stdin, stderr, tmpname, argv[2], nil); 849670Slinton if (r != 0) { 859670Slinton fprintf(stderr, "can't create %s\n", argv[2]); 869670Slinton } 879670Slinton } 889670Slinton unlink(tmpname); 899670Slinton } 909670Slinton quit(0); 919670Slinton } 929670Slinton 939670Slinton String modulename(s) 949670Slinton String s; 959670Slinton { 969670Slinton String r, i, j; 979670Slinton static char buf[256]; 989670Slinton 999670Slinton strcpy(buf, s); 1009670Slinton i = rindex(buf, '/'); 1019670Slinton if (i == nil) { 1029670Slinton i = buf; 1039670Slinton } 1049670Slinton for (j = i; *j != '.'; j++); 1059670Slinton *j++ = '_'; 1069670Slinton *j++ = 'h'; 1079670Slinton *j = '\0'; 1089670Slinton return buf; 1099670Slinton } 1109670Slinton 1119670Slinton copy() 1129670Slinton { 1139670Slinton register char *p; 1149670Slinton char line[1024]; 1159670Slinton 1169670Slinton while (gets(line) != NULL) { 1179670Slinton if (strncmp(line, "#ifndef public", 14) == 0) { 1189670Slinton copytext = true; 1199670Slinton } else if (strncmp(line, "#endif", 6) == 0) { 1209670Slinton copytext = false; 1219670Slinton } else if (strncmp(line, "public", 6) == 0) { 1229670Slinton copydef(line); 1239670Slinton } else if (copytext) { 1249670Slinton printf("%s\n", line); 1259670Slinton } 1269670Slinton } 1279670Slinton } 1289670Slinton 1299670Slinton copydef(s) 1309670Slinton String s; 1319670Slinton { 1329670Slinton register char *p; 1339670Slinton register Boolean isproc; 1349670Slinton 1359670Slinton isproc = false; 1369670Slinton for (p = &s[7]; *p != '\0' and *p != '='; p++) { 1379670Slinton if (*p == '(') { 1389670Slinton isproc = true; 1399670Slinton printf("(/* "); 1409670Slinton } else if (*p == ')' and isproc and *(p+1) == '\0') { 1419670Slinton printf(" */)"); 1429670Slinton } else { 1439670Slinton putchar(*p); 1449670Slinton } 1459670Slinton } 1469670Slinton if (isproc or *p == '=') { 1479670Slinton putchar(';'); 1489670Slinton } 1499670Slinton putchar('\n'); 1509670Slinton } 1519670Slinton 1529670Slinton /* 1539670Slinton * Terminate program. 1549670Slinton */ 1559670Slinton 1569670Slinton procedure abnorm(signo) 1579670Slinton int signo; 1589670Slinton { 1599670Slinton unlink(tmpname); 1609670Slinton quit(signo); 1619670Slinton } 1629670Slinton 1639670Slinton quit(r) 1649670Slinton int r; 1659670Slinton { 1669670Slinton exit(r); 1679670Slinton } 1689670Slinton 1699670Slinton /* 1709670Slinton * No special error recovery strategy. 1719670Slinton */ 1729670Slinton 1739670Slinton erecover() 1749670Slinton { 1759670Slinton } 176