/* c11d.c (c11.c) - Don Yang (uguu.org) Preprocess 4: Translate names. At this point, I highly recommend compile with: gcc -O3 -fexpensive-optimizations -finline-functions Also note that it does not work with MSC, only gcc. 06/02/00 */ #include int b[65536], x, z, r, u, v, p, q, o, c, l, s, i, j; int e() { p ^= (o = getchar()); if( o == EOF ) p ^= EOF; if( (++u & 1023) == 0 ) fputc(46, stderr); return o; } void d(int w) { v++; q ^= (w &= 255); putchar(w); } void k(int t) { for(; t; t--) { x = (x + 1) & 65535; if( !(--z) ) { b[x] = e(); z++; } } } int g(int t) { for(; t >= z; b[(x + z++) & 65535] = e()); return b[(x + t + 65536) & 65535]; } void f() { d(r); d(r >> 8); for(; r; r--) d(g(-r)); } int main(int a) { for(i = x = u = v = p = q = r = 0; i < 65536; b[i++] = 0); if( a > 1 ) { for(i = e(); i - EOF; i = e()) { if( (j = e()) == EOF ) break; l = i | (j << 8); i = 0; if( l & (1<<15) ) { s = l | (-1<<16); r = e(); j = e(); l = r | (j << 8); for(; i < l; i++) { d( b[(x + i) % (1<<16)] = b[(x + i + s + (1<<16)) & 65535]); } } else { for(; i < l; d(b[(x + i++) & 65535] = e())); } x = (x + l) & 65535; } if( q ^ i ) fprintf(stderr, "Checksum failed.\n"); } else { b[0] = e(); z = 1; for(c = g(0); c - EOF; c = g(0)) { i = 0; for( s = -5; s > -32767; s--) { if( g(s) == c ) { for(l = 1; l < -s; l++) { if( g(s + l) - g(l) ) break; } if( l > i ) { i = l; j = s; } } } if( i > 5 ) { if( r ) f(); d(j); d(j >> 8); d(i); d(i >> 8 ); k(i); } else { k(1); if( ++r > 32766 ) f(); } } if( r ) f(); d(p); } u--; return fprintf(stderr, "\n%d/%d\n", v, u); }