1*9670Slinton /* Copyright (c) 1982 Regents of the University of California */ 2*9670Slinton 3*9670Slinton static char sccsid[] = "@(#)@(#)makedefs.c 1.1 12/15/82"; 4*9670Slinton 5*9670Slinton /* 6*9670Slinton * Create a definitions file (e.g. .h) from an implementation file (e.g. .c). 7*9670Slinton * 8*9670Slinton * Usage is "makedefs source.c source.h" where source.h is to be created. 9*9670Slinton * 10*9670Slinton * Lines beginning with "public" or within a "#ifndef public ... #endif" 11*9670Slinton * block are copied to the new file. Initializations (e.g. "int x = 3") are 12*9670Slinton * omitted ("int x;" is output). 13*9670Slinton * 14*9670Slinton * Normally a temporary definitions file is created and compared to 15*9670Slinton * the given destination. If they are different, the temporary file 16*9670Slinton * is copied on top of the destination. This is so that dependencies 17*9670Slinton * when using "make" are not triggered. 18*9670Slinton * 19*9670Slinton * The "-f" option overrides this and forces the destination file to be created. 20*9670Slinton */ 21*9670Slinton 22*9670Slinton #include "defs.h" 23*9670Slinton #include <signal.h> 24*9670Slinton 25*9670Slinton #define procedure void 26*9670Slinton 27*9670Slinton Boolean force; 28*9670Slinton Boolean copytext; 29*9670Slinton 30*9670Slinton String tmpname; 31*9670Slinton String modulename(); 32*9670Slinton procedure abnorm(); 33*9670Slinton 34*9670Slinton main(argc, argv) 35*9670Slinton int argc; 36*9670Slinton String argv[]; 37*9670Slinton { 38*9670Slinton extern String mktemp(); 39*9670Slinton String name; 40*9670Slinton File tmp; 41*9670Slinton Integer r; 42*9670Slinton Integer index; 43*9670Slinton 44*9670Slinton if (streq(argv[1], "-f")) { 45*9670Slinton force = true; 46*9670Slinton index = 2; 47*9670Slinton } else { 48*9670Slinton force = false; 49*9670Slinton index = 1; 50*9670Slinton } 51*9670Slinton if (argc - index > 2) { 52*9670Slinton fatal("usage: makedefs [ -f ] file.c [ file.h ]\n"); 53*9670Slinton } 54*9670Slinton tmp = nil; 55*9670Slinton if (freopen(argv[index], "r", stdin) == NULL) { 56*9670Slinton fatal("can't read %s", argv[index]); 57*9670Slinton } 58*9670Slinton signal(SIGINT, abnorm); 59*9670Slinton signal(SIGQUIT, abnorm); 60*9670Slinton if (index + 1 < argc) { 61*9670Slinton if (force) { 62*9670Slinton tmpname = argv[index + 1]; 63*9670Slinton } else { 64*9670Slinton tmpname = mktemp("/tmp/makedefsXXXXXX"); 65*9670Slinton } 66*9670Slinton tmp = freopen(tmpname, "w", stdout); 67*9670Slinton if (tmp == nil) { 68*9670Slinton fatal("can't write %s", tmpname); 69*9670Slinton } 70*9670Slinton } 71*9670Slinton copytext = false; 72*9670Slinton name = modulename(argv[index]); 73*9670Slinton printf("#ifndef %s\n", name); 74*9670Slinton printf("#define %s\n", name); 75*9670Slinton copy(); 76*9670Slinton printf("#endif\n"); 77*9670Slinton if (tmp != NULL and not force) { 78*9670Slinton fclose(tmp); 79*9670Slinton r = call("cmp", stdin, stderr, "-s", tmpname, argv[2], nil); 80*9670Slinton if (r != 0) { 81*9670Slinton r = call("cp", stdin, stderr, tmpname, argv[2], nil); 82*9670Slinton if (r != 0) { 83*9670Slinton fprintf(stderr, "can't create %s\n", argv[2]); 84*9670Slinton } 85*9670Slinton } 86*9670Slinton unlink(tmpname); 87*9670Slinton } 88*9670Slinton quit(0); 89*9670Slinton } 90*9670Slinton 91*9670Slinton String modulename(s) 92*9670Slinton String s; 93*9670Slinton { 94*9670Slinton String r, i, j; 95*9670Slinton static char buf[256]; 96*9670Slinton 97*9670Slinton strcpy(buf, s); 98*9670Slinton i = rindex(buf, '/'); 99*9670Slinton if (i == nil) { 100*9670Slinton i = buf; 101*9670Slinton } 102*9670Slinton for (j = i; *j != '.'; j++); 103*9670Slinton *j++ = '_'; 104*9670Slinton *j++ = 'h'; 105*9670Slinton *j = '\0'; 106*9670Slinton return buf; 107*9670Slinton } 108*9670Slinton 109*9670Slinton copy() 110*9670Slinton { 111*9670Slinton register char *p; 112*9670Slinton char line[1024]; 113*9670Slinton 114*9670Slinton while (gets(line) != NULL) { 115*9670Slinton if (strncmp(line, "#ifndef public", 14) == 0) { 116*9670Slinton copytext = true; 117*9670Slinton } else if (strncmp(line, "#endif", 6) == 0) { 118*9670Slinton copytext = false; 119*9670Slinton } else if (strncmp(line, "public", 6) == 0) { 120*9670Slinton copydef(line); 121*9670Slinton } else if (copytext) { 122*9670Slinton printf("%s\n", line); 123*9670Slinton } 124*9670Slinton } 125*9670Slinton } 126*9670Slinton 127*9670Slinton copydef(s) 128*9670Slinton String s; 129*9670Slinton { 130*9670Slinton register char *p; 131*9670Slinton register Boolean isproc; 132*9670Slinton 133*9670Slinton isproc = false; 134*9670Slinton for (p = &s[7]; *p != '\0' and *p != '='; p++) { 135*9670Slinton if (*p == '(') { 136*9670Slinton isproc = true; 137*9670Slinton printf("(/* "); 138*9670Slinton } else if (*p == ')' and isproc and *(p+1) == '\0') { 139*9670Slinton printf(" */)"); 140*9670Slinton } else { 141*9670Slinton putchar(*p); 142*9670Slinton } 143*9670Slinton } 144*9670Slinton if (isproc or *p == '=') { 145*9670Slinton putchar(';'); 146*9670Slinton } 147*9670Slinton putchar('\n'); 148*9670Slinton } 149*9670Slinton 150*9670Slinton /* 151*9670Slinton * Terminate program. 152*9670Slinton */ 153*9670Slinton 154*9670Slinton procedure abnorm(signo) 155*9670Slinton int signo; 156*9670Slinton { 157*9670Slinton unlink(tmpname); 158*9670Slinton quit(signo); 159*9670Slinton } 160*9670Slinton 161*9670Slinton quit(r) 162*9670Slinton int r; 163*9670Slinton { 164*9670Slinton exit(r); 165*9670Slinton } 166*9670Slinton 167*9670Slinton /* 168*9670Slinton * No special error recovery strategy. 169*9670Slinton */ 170*9670Slinton 171*9670Slinton erecover() 172*9670Slinton { 173*9670Slinton } 174