/* aoi8.c - Don Yang (uguu.org) 08/25/02 */ #include #include FILE *i, *o; int m[]={ 0x6c726468,0x69766f6d,0x5453494c,0x68697661,0x68727473,0xffff00ff, 0x66727473,0x62770030,0x73647561,0x46464952,0x20495641 }, 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 == m[0]) ? 1 : (g == m[1]) ? 8 : 0; for(c = 0; d > c && (t = x()); c += t); return d; } int x() { v *c; r(&g); r(&n); if( g == m[2] ) return y(n); if( (z & 1) && g == m[3] ) { z |= 2; k(n); } else if( (z & 2) && g == m[4] ) { r(&g); if( g == m[8] ) z |= 4; k(n - 4); } else if( ((z & 4) && g == m[6]) || ((z & 24) && (g & m[5]) == m[7]) ) { 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 == m[9] ) { r(&g); if( g == m[10] ) 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; }