1*21610Sdist /* 2*21610Sdist * Copyright (c) 1983 Regents of the University of California. 3*21610Sdist * All rights reserved. The Berkeley software License Agreement 4*21610Sdist * specifies the terms and conditions for redistribution. 5*21610Sdist */ 69670Slinton 7*21610Sdist #ifndef lint 8*21610Sdist char copyright[] = 9*21610Sdist "@(#) Copyright (c) 1983 Regents of the University of California.\n\ 10*21610Sdist All rights reserved.\n"; 11*21610Sdist #endif not lint 129670Slinton 13*21610Sdist #ifndef lint 14*21610Sdist static char sccsid[] = "@(#)makedefs.c 5.1 (Berkeley) 05/31/85"; 15*21610Sdist #endif not lint 16*21610Sdist 1718224Slinton static char rcsid[] = "$Header: makedefs.c,v 1.4 84/12/26 10:40:22 linton 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 419670Slinton Boolean force; 429670Slinton Boolean copytext; 439670Slinton 449670Slinton String tmpname; 459670Slinton String modulename(); 469670Slinton procedure abnorm(); 479670Slinton 489670Slinton main(argc, argv) 499670Slinton int argc; 509670Slinton String argv[]; 519670Slinton { 529670Slinton extern String mktemp(); 539670Slinton String name; 549670Slinton File tmp; 559670Slinton Integer r; 569670Slinton Integer index; 579670Slinton 589670Slinton if (streq(argv[1], "-f")) { 599670Slinton force = true; 609670Slinton index = 2; 619670Slinton } else { 629670Slinton force = false; 639670Slinton index = 1; 649670Slinton } 659670Slinton if (argc - index > 2) { 669670Slinton fatal("usage: makedefs [ -f ] file.c [ file.h ]\n"); 679670Slinton } 689670Slinton tmp = nil; 699670Slinton if (freopen(argv[index], "r", stdin) == NULL) { 709670Slinton fatal("can't read %s", argv[index]); 719670Slinton } 729670Slinton signal(SIGINT, abnorm); 739670Slinton signal(SIGQUIT, abnorm); 749670Slinton if (index + 1 < argc) { 759670Slinton if (force) { 769670Slinton tmpname = argv[index + 1]; 779670Slinton } else { 789670Slinton tmpname = mktemp("/tmp/makedefsXXXXXX"); 799670Slinton } 809670Slinton tmp = freopen(tmpname, "w", stdout); 819670Slinton if (tmp == nil) { 829670Slinton fatal("can't write %s", tmpname); 839670Slinton } 849670Slinton } 859670Slinton copytext = false; 869670Slinton name = modulename(argv[index]); 879670Slinton printf("#ifndef %s\n", name); 889670Slinton printf("#define %s\n", name); 899670Slinton copy(); 909670Slinton printf("#endif\n"); 919670Slinton if (tmp != NULL and not force) { 929670Slinton fclose(tmp); 939670Slinton r = call("cmp", stdin, stderr, "-s", tmpname, argv[2], nil); 949670Slinton if (r != 0) { 959670Slinton r = call("cp", stdin, stderr, tmpname, argv[2], nil); 969670Slinton if (r != 0) { 979670Slinton fprintf(stderr, "can't create %s\n", argv[2]); 989670Slinton } 999670Slinton } 1009670Slinton unlink(tmpname); 1019670Slinton } 1029670Slinton quit(0); 1039670Slinton } 1049670Slinton 1059670Slinton String modulename(s) 1069670Slinton String s; 1079670Slinton { 1089670Slinton String r, i, j; 1099670Slinton static char buf[256]; 1109670Slinton 1119670Slinton strcpy(buf, s); 1129670Slinton i = rindex(buf, '/'); 1139670Slinton if (i == nil) { 1149670Slinton i = buf; 1159670Slinton } 1169670Slinton for (j = i; *j != '.'; j++); 1179670Slinton *j++ = '_'; 1189670Slinton *j++ = 'h'; 1199670Slinton *j = '\0'; 1209670Slinton return buf; 1219670Slinton } 1229670Slinton 1239670Slinton copy() 1249670Slinton { 1259670Slinton register char *p; 1269670Slinton char line[1024]; 1279670Slinton 1289670Slinton while (gets(line) != NULL) { 1299670Slinton if (strncmp(line, "#ifndef public", 14) == 0) { 1309670Slinton copytext = true; 1319670Slinton } else if (strncmp(line, "#endif", 6) == 0) { 1329670Slinton copytext = false; 1339670Slinton } else if (strncmp(line, "public", 6) == 0) { 1349670Slinton copydef(line); 1359670Slinton } else if (copytext) { 1369670Slinton printf("%s\n", line); 1379670Slinton } 1389670Slinton } 1399670Slinton } 1409670Slinton 1419670Slinton copydef(s) 1429670Slinton String s; 1439670Slinton { 1449670Slinton register char *p; 1459670Slinton register Boolean isproc; 1469670Slinton 1479670Slinton isproc = false; 1489670Slinton for (p = &s[7]; *p != '\0' and *p != '='; p++) { 1499670Slinton if (*p == '(') { 1509670Slinton isproc = true; 1519670Slinton printf("(/* "); 1529670Slinton } else if (*p == ')' and isproc and *(p+1) == '\0') { 1539670Slinton printf(" */)"); 1549670Slinton } else { 1559670Slinton putchar(*p); 1569670Slinton } 1579670Slinton } 1589670Slinton if (isproc or *p == '=') { 1599670Slinton putchar(';'); 1609670Slinton } 1619670Slinton putchar('\n'); 1629670Slinton } 1639670Slinton 1649670Slinton /* 1659670Slinton * Terminate program. 1669670Slinton */ 1679670Slinton 1689670Slinton procedure abnorm(signo) 1699670Slinton int signo; 1709670Slinton { 1719670Slinton unlink(tmpname); 1729670Slinton quit(signo); 1739670Slinton } 1749670Slinton 1759670Slinton quit(r) 1769670Slinton int r; 1779670Slinton { 1789670Slinton exit(r); 1799670Slinton } 1809670Slinton 1819670Slinton /* 1829670Slinton * No special error recovery strategy. 1839670Slinton */ 1849670Slinton 1859670Slinton erecover() 1869670Slinton { 1879670Slinton } 188