#include <stdio.h>
int main() {

  unsigned char* buf;
  char outfile[255];
  char outfilerev[255];

  unsigned long int i, filesize;
  unsigned long int b1, b2, b3, b4, bt;
  unsigned long int record = 0, adpcmoffset, headeroffset, seqoffset;


  FILE *fin, *fout;
  fin = fopen("music.arc", "rb");

  fseek(fin, 0, SEEK_END);
  filesize = ftell(fin);
  fseek(fin, 0, SEEK_SET);

  printf("filesize = %d\n", filesize);
  buf = (unsigned char *)malloc(filesize + 0x40);
  if (!buf) {
    printf("out of memory\n");
    return(1);
  }
  fread(&buf[0], 1, filesize, fin);

  i = 2048;

  while (1) {
    adpcmoffset = i;
    for (; i < filesize; i+=4) {
      if (buf[i] == 'I') {
      if (buf[i+1] == 'E') {
      if (buf[i+2] == 'C') {
      if (buf[i+3] == 'S') {
	    headeroffset = i;
	    break;
	  }}}}
    }
    i += 0x4;
    for (; i < filesize; i+=4) {
      if (buf[i] == 'I') {
      if (buf[i+1] == 'E') {
      if (buf[i+2] == 'C') {
      if (buf[i+3] == 'S') {
      if (buf[i+4] == 's') {
      if (buf[i+5] == 'r') {
      if (buf[i+6] == 'e') {
      if (buf[i+7] == 'V') {
	    seqoffset = i;
	    i += 0x1c;
	    b1 = buf[i];
	    b2 = buf[i+1] << 8;
	    b3 = buf[i+2] << 16;
	    b4 = buf[i+3] << 24;
	    bt = b1 + b2 + b3 + b4;

	    i = i + bt - 0x1c;
	    break;
	  }}}}}}}}
    }

    printf ("[%d] adpcmoffset = %d, headeroffset = %d, seqoffset = %d\n", record, adpcmoffset, headeroffset, seqoffset);

      sprintf(outfilerev, "%02d", record);
	  mkdir(outfilerev);

	    sprintf(outfilerev, "%02d\\DEFAULT.BD", record);

	    fout = fopen(outfilerev, "wb");
	    fwrite(&buf[adpcmoffset], 1, (headeroffset - adpcmoffset), fout);
	    fclose(fout);

	    sprintf(outfilerev, "%02d\\DEFAULT.HD", record);
	    fout = fopen(outfilerev, "wb");
	    fwrite(&buf[headeroffset], 1, (seqoffset - headeroffset), fout);
	    fclose(fout);

	    sprintf(outfilerev, "%02d\\DEFAULT.SQ", record);
	    fout = fopen(outfilerev, "wb");
	    fwrite(&buf[seqoffset], 1, (i - seqoffset), fout);
	    fclose(fout);

    if (i >= filesize) break;
    if (record == 32) break;
    record++;
  }

  free(buf);
  fclose(fin);

}
