/* rinia5.c - Don Yang (uguu.org) 01/10/04 */ #include #include #include typedef int _; _ R,i,N,I,A; _ m,o,e[9],k[9],a[256],n[256]; unsigned char *u, *v, w[9][128]; FILE *f; _ x(_ K, _ r, _ q) { for(; r < q; K = ((K >> 8) & 0xffffff) ^ n[(K ^ u[r++]) & 255]); return K; } _ main(_ t, char **z) { if( t < 4 ) return printf("%s \n", *z); u = 0; if( f = fopen(z[1], "rb") ) { fseek(f, 0, 2); if( (o = ftell(f)) > 8 ) { if( u = (unsigned char*)malloc(o) ) { fseek(f, 0, 0); fread(u, o, 1, f); } } fclose(f); } if( !u ) return printf("bad input %s\n", z[1]); i = I = 0; if( f = fopen(z[2], "rb") ) { for(; i < 256; n[i++] = -1) a[i] = 0; N = -1; for(i = I = 0; i < o && (R = fgetc(f)) > -1; i++) { a[R]++; if( R == N ) { if( ++I > 7 ) { if( n[N] == -1 ) n[N] = i - 7; } } else { N = R; I = 1; } } A = -1; N = o + 1; for(i = 33; i < 127; i++) { if( n[i] + 1 && N > a[i] ) { N = a[i]; A = i; } } fseek(f, i = I = 0, 0); if( A + 1 ) { for(N = n[A]; i < o && I < 8 && (R = fgetc(f)) > -1; i++) { if( i < N || i > N + 7 ) { if( R == A ) { if( !(*w[I] = u[i]) ) *w[I] = 46; a[I++] = i; } } } } fclose(f); } if( I < 1 ) return printf("bad layout %s\n", z[2]); for(i = 0; i < 256; i++) { R = i; for(A = 8; A > 0; A--) { R = ( R & 1 ) ? ((unsigned)R >> 1) ^ 0xedb88320 : (unsigned)R >> 1; } n[i] = R; } m = a[I - 1]; a[I] = ( m < N ) ? (m = N + 8) : ++m; for(i = 0; i < I; e[i++] = 0) { v = w[i] + 1; for(R = 33; R < 127; R++) { if( R - 47 && R - 92 && R - (_)*w[i] ) *(v++) = (unsigned char)R; } *v = 0; } R = time(0); sprintf((char*)*w + 1, "%08x", x(R, m, o) ^ ~0); for(i = 0; i < 8; i++) u[N + i] = *(*w + i + 1); for(*k = x(~0, i = 0, *a); i > -1;) { for(A = i; A < I; A++) { u[a[A]] = w[A][e[A]]; k[A + 1] = x(k[A], a[A], a[A + 1]); } if( k[I] == R ) break; for(i = I - 1; i > -1; i--) { if( w[i][++e[i]] ) break; for(A = i; A < I; e[A++] = 0); } if( i < I - 4 ) { putchar(46); fflush(stdout); } } if( i < 0 ) { puts("\nfail"); } else { if( f = fopen(z[3], "wb+") ) { fwrite(u, o, 1, f); fclose(f); puts("\nsuccess"); } else { printf("Error writing %s\n", z[3]); } } free(u); return 0; }