/* aoi7.c - Don Yang (uguu.org) 08/25/02 */ #include #include FILE *i, *o; int s, t, z, n, h, l, g; typedef void v; v r(v *d) { fread(d, s, 1, i); } v w(v *d) { fwrite(d, s, 1, o); } v k(int p) { fseek(i, p, 1); } v K(int p) { fseek(o, p, 0); } int x(); int y(int d) { int c; r(&g); z |= (g == 0x6c726468) ? 1 : (g == 0x69766f6d) ? 8 : 0; for(c = 0; d > c && (t = x()); c += t); return d; } int x() { v *c; r(&g); r(&n); if( g == 0x5453494c ) return y(n); if( (z & 1) && g == 0x68697661 ) { z |= 2; k(n); } else if( (z & 2) && g == 0x68727473 ) { r(&g); if( g == 0x73647561 ) z |= 4; k(n - 4); } else if( ((z & 4) && g == 0x66727473) || ((z & 24) && (g & 0xffff00ff) == 0x62770030) ) { if( g & 1 ) { s = 20; w("RIFF....WAVEfmt ...."); z |= 16; h = n; } else { if( !(z & 32) ) { s = 8; w("data...."); z |= 32; } l += n; } if( (c = alloca(s = n)) ) { r(c); w(c); } else { n = -8; } s = 4; } else { k(n); } if( (n += 8) & 1 ) { fgetc(i); n++; } return n; } int main(int A, char **a) { if( A < 3 ) { printf("%s \n", *a); } else { h = l = z = 0; if( (i = fopen(a[1], "rb")) ) { if( (o = fopen(a[2], "wb+")) ) { s = 4; r(&g); r(&n); if( g == 0x46464952 ) { r(&g); if( g == 0x20495641 ) for(; !(z & 32) && x();); } if( (z & 32) ) { K(16); w(&h); K(h + 24); w(&l); l += h + 20; K(4); w(&l); } fclose(o); } fclose(i); } puts((z & 32) ? "success" : "fail"); } return 0; }