|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <sys/types.h> ! 3: #include <sys/stat.h> ! 4: FILE *popen(); ! 5: ! 6: int Argc; char **Argv; ! 7: char Doth[128],Dotu[128],Dotf[128],Dotut[128],Dotft[128],Dotui[128],Dotfi[128]; ! 8: ! 9: char Cfront[128] = "cfront"; ! 10: char Cpp[128] = "/lib/cpp"; ! 11: char *Base = 0; ! 12: ! 13: main( argc, argv ) ! 14: char **argv; ! 15: { ! 16: int i; ! 17: ! 18: setbuf( stderr, malloc(BUFSIZ) ); ! 19: Argc = argc; Argv= argv; ! 20: if( argc<2 ){ ! 21: Argerr: ! 22: fprintf( stderr, "use: cleave [-I] [+VE] base\n"); ! 23: exit(1); ! 24: } ! 25: for( i = 1; argv[i]; ++i ) switch( argv[i][0] ){ ! 26: case '+': ! 27: strcat( Cfront, " " ); ! 28: strcat( Cfront, argv[i] ); ! 29: break; ! 30: case '-': ! 31: strcat( Cpp, " " ); ! 32: strcat( Cpp, argv[i] ); ! 33: break; ! 34: default: ! 35: if( Base ) goto Argerr; ! 36: Base = argv[i]; ! 37: } ! 38: if( !Base ) goto Argerr; ! 39: sprintf( Doth, "%s.h", Base ); ! 40: sprintf( Dotu, "%s.pub", Base ); ! 41: sprintf( Dotf, "%s.pri", Base ); ! 42: sprintf( Dotut, "%s.pub.t", Base ); ! 43: sprintf( Dotft, "%s.pri.t", Base ); ! 44: sprintf( Dotui, "%s.pub.i", Base ); ! 45: sprintf( Dotfi, "%s.pri.i", Base ); ! 46: UpToDate(); ! 47: Split(0); ! 48: Compare(); ! 49: Split(0); ! 50: Install(Dotut,Dotu); ! 51: Install(Dotft,Dotf); ! 52: exit(0); ! 53: } ! 54: ! 55: char *GetLine(s, n, f) ! 56: char *s; ! 57: int n; ! 58: FILE *f; ! 59: { ! 60: char *e, l[256]; ! 61: int d; ! 62: ! 63: do e = fgets(s, n, f); ! 64: while( e && sscanf(s, "# %s %d", l, &d)==2 && !strcmp(l, "line") ); ! 65: return e; ! 66: } ! 67: ! 68: Same(a,b) ! 69: char *a, *b; ! 70: { ! 71: struct stat unused; ! 72: char al[1024], bl[1024], same = 1; ! 73: FILE *ap, *bp; ! 74: ! 75: if( !(bp = fopen(b,"r")) ) return 0; ! 76: if( !(ap = fopen(a,"r")) ) return 0; ! 77: while( same && GetLine(al, 1024, ap) ) ! 78: same = GetLine(bl, 1024, bp) && !strcmp(al,bl); ! 79: same = same && !GetLine(bl, 1024, bp); ! 80: fclose(ap); fclose(bp); ! 81: return same; ! 82: } ! 83: ! 84: Install(from,to) ! 85: char *from, *to; ! 86: { ! 87: if( Same(from,to) ){ ! 88: unlink(from); ! 89: fprintf( stderr, "%s unchanged\n", to ); ! 90: return; ! 91: } ! 92: unlink(to); ! 93: if( link(from,to) ) ! 94: Exit(1, "cannot link %s %s", from, to ); ! 95: if( unlink(from) ) ! 96: Exit(1, "cannot unlink %s", from ); ! 97: fprintf( stderr, "%s modified\n", to ); return; ! 98: } ! 99: ! 100: Compile( from, to ) ! 101: char *from, *to; ! 102: { ! 103: char cpp[256], cfront[256], *cpped = "huf.tmp"; ! 104: ! 105: sprintf( cpp, "%s <%s >%s", Cpp, from, cpped ); ! 106: if( system( cpp ) ) Exit( 1, "cpp failed: %s", from ); ! 107: sprintf( cfront, "%s +f%s <%s >%s", Cfront, from, cpped, to ); ! 108: if( system( cfront ) ) Exit( 1, "cfront failed: %s", from ); ! 109: unlink( cpped ); ! 110: } ! 111: ! 112: struct Context { ! 113: FILE *fp; ! 114: char line[1024]; ! 115: int n; ! 116: char path[256]; ! 117: }; ! 118: ! 119: int LineNo(c) ! 120: struct Context *c; ! 121: { ! 122: if( c->line[0] == '#' ){ ! 123: if( 2 != sscanf(c->line, "# %d %[^\n]", &c->n, c->path) ) ! 124: Exit( 1, ".i # syntax error: %s", c->line ); ! 125: --c->n; ! 126: } else ++c->n; ! 127: return c->line[0] == '#'; ! 128: } ! 129: ! 130: ShowContext(c) ! 131: struct Context *c; ! 132: { ! 133: fprintf( stderr, "%s ~%d >C++> %s", c->path, c->n, c->line ); ! 134: } ! 135: ! 136: struct Context ZContext; ! 137: ! 138: Compare() ! 139: { ! 140: char sed[256], i; ! 141: struct Context u, f, save; ! 142: ! 143: u = f = save = ZContext; ! 144: Compile( Dotut, Dotui ); ! 145: Compile( Dotft, Dotfi ); ! 146: sprintf( sed, "sed /pub_filler/d <%s", Dotui ); ! 147: u = f = save = ZContext; ! 148: if( !(u.fp = popen(sed, "r")) ) ! 149: Exit( 1, "cannot popen %s", sed ); ! 150: if( !(f.fp = fopen(Dotfi, "r")) ) ! 151: Exit( 1, "cannot open %s", Dotfi ); ! 152: strcpy( u.path, Dotut ); ! 153: strcpy( f.path, Dotft ); ! 154: for( i = 1; i <= 5; ++i ) ! 155: fgets( u.line, sizeof u.line, u.fp ); ! 156: while( fgets( u.line, sizeof u.line, u.fp ) ){ ! 157: if( LineNo(&u) ) continue; ! 158: while( fgets( f.line, sizeof f.line, f.fp ) ){ ! 159: if( LineNo(&f) ) continue; ! 160: save = f; ! 161: break; ! 162: } ! 163: /*Bogusfgets: if( strlen(u.line) > 510 ) continue; */ ! 164: while( strcmp( u.line, f.line ) ){ ! 165: if( !fgets( f.line, sizeof f.line, f.fp ) ){ ! 166: fprintf( stderr, "%s vs %s:\n", Dotui, Dotfi ); ! 167: ShowContext( &u ); ! 168: ShowContext( &save ); ! 169: exit(1); ! 170: } ! 171: LineNo(&f); ! 172: } ! 173: } ! 174: pclose(u.fp); fclose(f.fp); unlink(Dotui); unlink(Dotfi); ! 175: } ! 176: ! 177: Split(v) ! 178: { ! 179: FILE *h, *ut, *ft; ! 180: char text[256], u = 1, f = 1, cmd[256], direct[256]; ! 181: int n = 0, sync = 0; ! 182: ! 183: if( !(h = fopen(Doth, "r")) ) ! 184: Exit( 1, "cannot open %s", Doth ); ! 185: if( !(ut = fopen(Dotut, "w")) ) ! 186: Exit( 1, "cannot open %s", Dotut ); ! 187: if( !(ft = fopen(Dotft, "w")) ) ! 188: Exit( 1, "cannot open %s", Dotft ); ! 189: while( ++n, fgets( text, 256, h ) ){ ! 190: if( text[0] == '>' ){ ! 191: strcpy( direct, "" ); ! 192: sscanf( text, ">%s", direct ); ! 193: if(!strcmp(direct,"pub") || !strcmp(direct,"u")){ ! 194: u = 1; ! 195: f = 0; ! 196: } else if(!strcmp(direct,"pri") || !strcmp(direct,"f") ){ ! 197: u = 0; ! 198: f = 1; ! 199: } else { ! 200: if(v) fprintf(ft, "static %s_%d;\n", Base, ++sync ); ! 201: if(v) fprintf(ut, "static %s_%d;\n", Base, sync ); ! 202: u = 1; f = 1; ! 203: } ! 204: if(f&&v) fprintf(ft, "# line %d \"%s(.pri)\"\n", n+1, Doth); ! 205: if(u&&v) fprintf(ut, "# line %d \"%s(.pub)\"\n", n+1, Doth); ! 206: continue; ! 207: } ! 208: if( f ) fprintf( ft, "%s", text ); ! 209: if( u ) fprintf( ut, "%s", text ); ! 210: } ! 211: fclose(h); fclose(ut); fclose(ft); ! 212: sprintf( cmd, "cmp -s %s %s", Dotut, Dotft ); ! 213: if( v && !system(cmd) ){ ! 214: fprintf( stderr, "warning: identical .pri and .pub\n" ); ! 215: fflush(stderr); ! 216: } ! 217: } ! 218: ! 219: UpToDate() ! 220: { ! 221: struct stat h, f; ! 222: ! 223: if( stat(Doth, &h) ) ! 224: Exit( 1, "cannot stat %s", Doth ); ! 225: if( stat(Dotf, &f) ) ! 226: return; ! 227: if( h.st_mtime<f.st_mtime ){ ! 228: fprintf( stderr, "%s is up to date\n", Dotf ); ! 229: exit(0); ! 230: } ! 231: } ! 232: ! 233: Exit( code, f, a1, a2, a3, a4, a5, a6 ) ! 234: char *f; ! 235: { ! 236: char msg[256]; ! 237: ! 238: sprintf( msg, f, a1, a2, a3, a4, a5, a6 ); ! 239: perror( msg ); ! 240: exit(code); ! 241: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.