#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <io.h>
#include <sys\types.h>
#include <sys\stat.h>
#include <malloc.h>
#include <fcntl.h>

int	fh;
FILE	*fp;
long	offset;

void error(char *errstr)
{	printf(errstr);
	exit(1);	}

main(argc,argv)
int argc;
char *argv[];
{
	char texname[10], patname[10];
	char *pnames, *pnam;
	char *texgarb, *texg;
	long numtexs, numpats, dummy, i;
	int numpat, scuz, dummi, j, k;
	
	if (argc != 4)
		error("Usage: retex <textfile> <pnames> <textures>\n");

	texname[8]='\0';
	patname[8]='\0';
	
	if (!(fp=fopen(argv[1], "rt")))
		error("Can't open TEXTURES.TXT.\n");
	if ((pnames=(char *)malloc(8192))==NULL)
		error("Can't even allocate 8K!\n");
	if ((texgarb=(char *)malloc(32768))==NULL)
		error("Can't allocate 32K now.\n");
	pnam=pnames+4;
	numpats=0;
	fscanf(fp, "%s", patname);
	while (strcmp(patname, "PATCHES")) fscanf(fp, "%s", patname);
	fscanf(fp, "%s", texname);
	while (strcmp(texname, "TEXTURES")) {
		numpats++;
		for (k=0; k<8; k++) patname[k]='\0';
		fscanf(fp, "%s %s", patname, texname);
		for (k=0; k<8; k++) *pnam++=patname[k];
		}
	*((long *)pnames)=numpats;

	numtexs=0;
	texg=texgarb+4;
	offset=0;
	fscanf(fp, "%s", texname);
	while (strcmp(texname, "EOF")) {
		numtexs++;
		*((long *)texg)=offset;
		texg+=4;
		for (j=0; j<7; j++) fscanf(fp, "%d", &scuz);
		offset+=22+10*scuz;
		for (j=0; j<scuz; j++) fscanf(fp, "%*d %*d %*d %*s %*d %*d");
		fscanf(fp, "%s", texname);
		}
	*((long *)texgarb)=numtexs;
	offset=texg-texgarb;
	texg=texgarb+4;
	for (i=0; i<numtexs; i++) {
		*((long *)texg)+=offset;
		texg+=4;
		}
	fclose(fp);
	fp=fopen("textures.txt", "rt");
	fscanf(fp, "%s", texname);
	while (strcmp(texname, "TEXTURES")) fscanf(fp, "%s", texname);
	for (k=0; k<8; k++) texname[k]='\0';
	fscanf(fp, "%s", texname);
	while (strcmp(texname, "EOF")) {
		for (k=0; k<8; k++) *(texg++)=texname[k];
		for (j=0; j<7; j++) {
			fscanf(fp, "%d", &scuz);
			*((int *)texg)=scuz;
			texg+=2;
			}
		for (j=0; j<scuz; j++) {
			for (k=0; k<3; k++) {
				fscanf(fp, "%d", &dummi);
				*((int *)texg)=dummi;
				texg+=2;
				}
			fscanf(fp, "%s", patname);
			for (k=0; k<2; k++) {
				fscanf(fp, "%d", &dummi);
				*((int *)texg)=dummi;
				texg+=2;
				}
			}
		for (k=0; k<8; k++) texname[k]='\0';
		fscanf(fp, "%s", texname);
		}
	fclose(fp);

	fh=open(argv[2], O_CREAT|O_BINARY|O_WRONLY, S_IREAD|S_IWRITE);
	write(fh, pnames, 4+8*numpats);
	close(fh);
	fh=open(argv[3], O_CREAT|O_BINARY|O_WRONLY, S_IREAD|S_IWRITE);
	write(fh, texgarb, texg-texgarb);
	close(fh);

	free(pnames);
	free(texgarb);
	
	exit(0);
}