|
|
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.