/* c11b.c (c11.c) - Don Yang (uguu.org) Preprocess 2: Remove comments, evaluate constants. 06/02/00 */ #include static int buffer[0x10000]; static int bindex; static int blength; static int run; static int isize, osize; static int isum, osum; static int input(void) { int data; isize++; isum ^= (data = getchar()); if( data == EOF ) isum ^= EOF; if( isize % 1024 == 0 ) fputc('.', stderr); return data; } static void output(int data) { osize++; osum ^= (data &= 0xff); putchar(data); } static void bseek(int offset) { for(; offset; offset--) { bindex = (bindex + 1) % 0x10000; if( !(--blength) ) { buffer[bindex] = input(); blength++; } } } static int bgetc(int offset) { for(; offset >= blength; blength++) buffer[(bindex + blength) % 0x10000] = input(); return buffer[(bindex + offset + 0x10000) % 0x10000]; } static void bflush(void) { output(run); output(run >> 8); for(; run; run--) output(bgetc(-run)); } int main(int argc) { int code, length, source, i, j; isize = osize = isum = osum = 0; for(i = bindex = 0; i < 0x10000; buffer[i++] = 0); if( argc > 1 ) { for(i = input(); i != EOF; i = input()) { if( (j = input()) == EOF ) break; length = i | (j << 8); if( length & 0x8000 ) { source = length | 0xffff0000; i = input(); j = input(); length = i | (j << 8); for(i = 0; i < length; i++) { output( buffer[(bindex + i) % 0x10000] = buffer[(bindex + i + source + 0x10000) % 0x10000]); } bindex = (bindex + length) % 0x10000; } else { for(i = 0; i < length; i++) output(buffer[(bindex + i) % 0x10000] = input()); bindex = (bindex + length) % 0x10000; } } if( osum ^ i ) fprintf(stderr, "Checksum failed.\n"); isize--; isize ^= osize; osize ^= isize; isize ^= osize; } else { buffer[0] = input(); blength = 1; for(code = bgetc(run = 0); code != EOF; code = bgetc(0)) { i = 0; for( source = -5; source > -0x7fff; source--) { if( bgetc(source) == code ) { for(length = 1; length < -source; length++) { if( bgetc(source + length) != bgetc(length) ) break; } if( length > i ) { i = length; j = source; } } } if( i > 5 ) { if( run ) bflush(); output(j); output(j >> 8); output(i); output(i >> 8 ); bseek(i); } else { bseek(1); run++; if( run >= 0x7fff ) bflush(); } } if( run ) bflush(); output(isum); isize--; } fprintf(stderr, "\n%d/%d\n", osize, isize); return 0; }