#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define TRUE  1
#define FALSE 0

static FILE *fPrintout;
static FILE *fLog;
static FILE *fSprite;
static FILE *fMaster;
static int vType,vLength,vDummy,vPalette;
static int vKind,vWidth,vHeight,vSize;
static int vBit, vSpriteCount;
static char vFileName[40];

typedef struct /* In einer Sprite-Datei steht der SpriteArea-Header ohne die Lngenangabe */
{
//int size;      /* Size of spritearea - is not in file */
  int count;     /* Number of sprites in spritearea / file */
  int first;     /* Offset to first sprite */
  int free;      /* Offset to first free word */
} spritefile_header;

typedef struct /* Der Sprite-Header */
{
  int  next;      /*  Offset to next sprite                */
  char name[12];  /*  Sprite name                          */
  int  width;     /*  Width in words-1      (0..639)       */
  int  height;    /*  Height in scanlines-1 (0..255/511)   */
  int  lbit;      /*  First bit used (left end of row)     */
  int  rbit;      /*  Last bit used (right end of row)     */
  int  image;     /*  Offset to sprite image               */
  int  mask;      /*  Offset to transparency mask          */
  int  mode;      /*  Mode sprite was defined in           */
                  /*  Palette data optionally follows here */
                  /*  in memory                            */
} sprite_header;

static spritefile_header vSpriteFileHeader;
static sprite_header     vSpriteHeader;

int main(int argc,char *argv[])
{
	vSpriteCount = 0;

	/* SPrinter-Ausgabe und Logdatei ffnen */
	fPrintout = fopen("<SSplitter$Dir>.PrintoutB","r");
	fLog      = fopen("<SSplitter$Dir>.Blabla","w");

	/* SPrinter-Ausgabe abarbeiten */
	while (!feof(fPrintout))
	{
		/* Typ des Blocks und seine Lnge einlesen */
		vType = -1;
		fread(&vType,sizeof(int),1,fPrintout);
		fread(&vLength,sizeof(int),1,fPrintout);
		vLength = vLength/sizeof(int); vLength--; vLength--;
		switch(vType)
		{
		case -1: /* Nix mehr gelesen also Ende Gelnde */
			break;

		case 0: /* (Nchster) Datenblock des Sprites */
			fread(&vKind,sizeof(int),1,fPrintout); vLength--;
			fread(&vWidth,sizeof(int),1,fPrintout); vLength--;
			fread(&vHeight,sizeof(int),1,fPrintout); vLength--;
			fread(&vSize,sizeof(int),1,fPrintout); vLength--;
			vLength = vLength * ((vBit+7)/8); /* Daten sind ggf. viermal so lang */

/* Block */		fprintf(fLog,"Block: %x %x %x %x %x\n",vKind,vWidth,vHeight,vSize,vLength);
			vSpriteHeader.next   += vLength * sizeof(int);
			vSpriteHeader.width   = ((vWidth*vBit+31)/32)-1;
			vSpriteHeader.height += vHeight;
			vSpriteHeader.lbit    = 0;
			vSpriteHeader.rbit    = (vWidth*vBit-1) & 31;
			while (vLength--)
			{
				fread(&vDummy,sizeof(int),1,fPrintout);
				fwrite(&vDummy,sizeof(int),1,fSprite);
			}
			break;

		case 1: /* Start des nchsten Sprite */
			fread(&vKind,sizeof(int),1,fPrintout); vLength--;
/* Start */		fprintf(fLog,"Start: %d %x\n",vKind,vLength);
			while (vLength--) { fread(&vDummy,sizeof(int),1,fPrintout); }

			switch(vKind &0xF)
			{
			case 0: /* Schwarzwei */
				sprintf(vFileName,"<SSplitter$Dir>.???");
				vBit = 1;
				break;
			case 1: /* Graustufen */
				sprintf(vFileName,"<SSplitter$Dir>.Grey256");
				vBit = 8;
				break;
			case 2: /* Farbe mit Palette */
				sprintf(vFileName,"<SSplitter$Dir>.???");
				vBit = 8;
				break;
			case 5: /* Richtig farbig */
				sprintf(vFileName,"<SSplitter$Dir>.Color");
				vBit = 32;
				break;
			default:
				break;
			}
			fprintf(fLog," - Sample %s\n",vFileName);
			fMaster = fopen(vFileName,"r");
			fread(&vSpriteFileHeader,sizeof(spritefile_header),1,fMaster);
			fread(&vSpriteHeader,    sizeof(sprite_header),    1,fMaster);

			for (vDummy=0;vDummy<12;vDummy++) { vSpriteHeader.name[vDummy] = 0; }
			sprintf(vSpriteHeader.name,"sprite");
			vSpriteHeader.next    = vSpriteHeader.image; /* hier addiere ich dann drauf */
			vSpriteHeader.width   = 0;  /* Wird errechnet */
			vSpriteHeader.height  = -1; /* Wird aufaddiert, aber soll Hhe -1 sein */
			vSpriteHeader.lbit    = 0;  /* Wird errechnet */
			vSpriteHeader.rbit    = 0;  /* Wird errechnet */

			vSpriteCount++;
			sprintf(vFileName,"<SSplitter$Dir>.Sprite%02d",vSpriteCount);
			fSprite = fopen(vFileName,"w");

			fwrite(&vSpriteFileHeader,sizeof(spritefile_header),1,fSprite);
			fwrite(&vSpriteHeader,    sizeof(sprite_header),    1,fSprite);

			// Palette steht zwischen SpriteHeader und dem Bild selbst in der Datei
			// Die Lnge ist also Bildanfang minus SpriteHeade-Lnge */
			vPalette = (vSpriteHeader.image - sizeof(sprite_header)) / sizeof(int);
			fprintf(fLog," - Palette %x\n",vPalette);
			while (vPalette--) {
				fread(&vDummy,sizeof(int),1,fMaster);
				fwrite(&vDummy,sizeof(int),1,fSprite);
			}
			fclose(fMaster);

			break;

		case 2: /* Seitenende */
/* Ende */		fprintf(fLog,"Ende\n");
			while (vLength--) { fread(&vDummy,sizeof(int),1,fPrintout); }

			vSpriteFileHeader.free = vSpriteHeader.next + sizeof(spritefile_header) + sizeof(int);
			rewind(fSprite);
			fwrite(&vSpriteFileHeader,sizeof(spritefile_header),1,fSprite);
			fwrite(&vSpriteHeader,    sizeof(sprite_header),    1,fSprite);
			fclose(fSprite);

			break;

		default: /* Andere Eintrge kommen nach dem Sprite also Ende des Sprites */
/* Else */		fprintf(fLog,"%d %x\n",vType,vLength);
			while (vLength--) { fread(&vDummy,sizeof(int),1,fPrintout); }

			break;
		}
	}
	fclose(fPrintout);
	fclose(fLog);
}
