#include	<stdio.h>
#include	<string.h>
#include	"gfxfunc.h"
#include	"ReadVars.h"

void	KillVariable(VARIABLEHEADER *h)
{
	VARIABLE	*v;
	int			j;

	v=h->Data;
	for(j=0; j<h->Number; j++,v++){
		if(v->Type==VARIABLE_STRING){
			GXFreeMem(v->Data.String);
		}
	}
	GXFreeMem(h->Data);
	GXFreeMem(h);
}

VARIABLEHEADER	*FindVariable(char *name, char *data)
{
	char		SearchString[256], *loc, letter, *from, *Line=0, *from2, *to;	
	VARIABLE	*v;
	int			value, total, StringLength, NVariable, LineLength;
	int			InString, j, done;
	size_t		size;
	VARIABLEHEADER	*header;
	
	//	Search for variable name in data. Variable name starts at the
	//	beginning of a line and ends with an =
	sprintf(SearchString,"%s=",name);
	StringLength=strlen(SearchString);
	from=data;
	do{
		loc=strstr(from, SearchString);
		if(loc==NULL)goto fail;
		if(loc==data)break;
		if(loc[-1]=='\n')break;
		from+=StringLength;
	}while(1);
	loc+=StringLength;
	
	//	Get data for this line
	LineLength=0;
	from=loc;
	do{
		LineLength++;
		letter=*from++;
		if( (!letter) || (letter=='\n') )break;
	}while(1);
	Line=(char *)GXGetMem(LineLength*sizeof(char), MEMF_ABORT);
	memcpy(Line, loc, LineLength*sizeof(char));
	Line[LineLength-1]=0;
	
	//	Seperate out elements
	InString=0;
	to=from=Line;
	NVariable=0;
	done=0;
	do{
		letter=*from++;
		if(letter==','){
			*(from-1)=0;
			NVariable++;
		}
	}while(letter);
	NVariable++;
	
	//	Allocate data
	header=(VARIABLEHEADER *)GXGetMem(sizeof(VARIABLEHEADER), MEMF_ABORT);
	header->Number=NVariable;
	header->Data=(VARIABLE *)GXGetMem(NVariable*sizeof(VARIABLE), MEMF_ZERO|MEMF_ABORT);

	//	Read variables	
	from=Line;
	v=header->Data;
	for(j=0; j<NVariable; j++){
		from2=from;
		letter=*from2++;
		if(!letter){
			// invalid variable
			v->Type=VARIABLE_INVALID;
		}else if( (letter<='9') && (letter>='0') ){
			//	Read number
			value=(letter-'0');
			total=0;
			while( (value>=0) && (value<=9) ){
				total=total*10+value;
				value=(*from2++)-'0';
			}
			v->Type=VARIABLE_NUMBER;
			v->Data.Number=total;
		}else if(letter=='"'){
			//	Read String
			size=0;
			while(from2[size]){
				if(from2[size]=='"'){
					break;
				}
				size++;
			}
			if( !from2[size] ){
				v->Type=VARIABLE_INVALID;
			}else{
				v->Data.String=(char *)GXGetMem(size+1 , MEMF_ABORT);
				if(size){
					memcpy(v->Data.String, from2, size);
				}
				v->Data.String[size]=0;
				v->Type=VARIABLE_STRING;
			}
		}
		//	Move on to next item
		from++;
		while(*from++)
			;
		v++;
	}
	if(Line)GXFreeMem(Line);
	return	header;
fail:
	if(Line)GXFreeMem(Line);
	return	0;	
}
