/* PrefsScanner.c */

#include <OSIncludes.h>
#pragma header

#define CATCOMP_NUMBERS
#include "catalogs/PrefsAttack.h"
#include "PWPrefs.h"

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

static struct Gruppe *Akt_Gruppe;
static struct Seite *Akt_Seite;
static struct Objekt *Akt_Objekt;
static struct ObjektItem *Akt_Item;

static char *FilePos;
static char line[300];
static char FehlerText[257];
static char FrameName[42];
static char *option,*command;
static char *ss;

static BOOL done,DoFrame;

#define strequ(a,b) (strcmp((a),(b))==0)
                   
static void PrefsHinweis(char *msg,BOOL quitme)
{
	char s[257];

	sprintf(s,MSG(MSG_ERROR_GUIFILE),msg);
	if (!quitme)
	{
		Hinweis(s);
	} else {
		Ende(s);
	}
}

static void PrefsSpeicherMangel(void)
{
	Ende(MSG(ERR_OUTOFMEMORY));
}

static void KillSpaces(char *s)
{
	WORD i=0;
	WORD i2=strlen(s);

	while (i<i2)
	{
		if (s[i]==9 || s[i]==' ')
		{
			memmove(&s[i],&s[i+1],i2-i);
			--i2;
			--i;
		}
		i++;
	}
	
}

static void OptionToString(char *s)
{
	WORD i=0;
	WORD i2=strlen(s);

	BOOL KillSP=TRUE;

	while (i<i2)
	{
		if ((KillSP && (s[i]==9 || s[i]==' ')) ||
		    (s[i]=='"'))
		{
			if (s[i]=='"') KillSP=!KillSP;
			
			memmove(&s[i],&s[i+1],i2-i);
			--i2;
			--i;
		}
		i++;
	}

}

static LONG OptionValue(char *s)
{
	return strtol(s,0,10);
}

static void CheckGroupHere(void)
{
	if (!Akt_Gruppe)
	{
		PrefsHinweis(MSG(ERR_GUI_MISSING_GROUP),TRUE);
	}
}

static void CheckPageHere(void)
{
	if (!Akt_Seite)
	{
		PrefsHinweis(MSG(ERR_GUI_MISSING_PAGE),TRUE);
	}
}

static void CheckObjHere(void)
{
	if (!Akt_Objekt)
	{
		sprintf(FehlerText,MSG(ERR_GUI_MISSING_OBJECT),command);
		PrefsHinweis(FehlerText,TRUE);
	}
}

static void CheckItemHere(void)
{
	if (!Akt_Item)
	{
		sprintf(FehlerText,MSG(ERR_GUI_MISSING_ITEM),command);
		PrefsHinweis(FehlerText,TRUE);
	}
}

static void CreateNewObjekt(WORD typ)
{
	CheckPageHere();

	ItemCounter=0;Akt_Item=0;
	ObjCounter++;
	Akt_Seite->se_AnzObjekte++;

	if (!(Akt_Objekt=AddNew_Objekt(Akt_Seite)))
	{
		PrefsSpeicherMangel();
	}
	
	Akt_Objekt->ob_Typ=typ;
	if (DoFrame)
	{
		if (!(SetFrameName_Objekt(Akt_Objekt,FrameName)))
		{
			PrefsSpeicherMangel();
		}
		DoFrame=FALSE;FrameName[0]=0;
	}
}

static void DoCommand(void)
{
	KillSpaces(command);
	if (strequ(command,"END"))
	{
		done=TRUE;
	} else if (strequ(command,"GROUP"))
	{
      PageCounter=0;Akt_Seite=0;
		ObjCounter=0;Akt_Objekt=0;
		ItemCounter=0;Akt_Item=0;
		GroupCounter++;
		Anz_Gruppen++;

		if (!(Akt_Gruppe=AddNew_Gruppe()))
		{
			PrefsSpeicherMangel();
		}
	} else if (strequ(command,"PAGE"))
	{
		CheckGroupHere();

		ObjCounter=0;Akt_Objekt=0;
		ItemCounter=0;Akt_Item=0;
		PageCounter++;
		Akt_Gruppe->gr_AnzSeiten++;
		
		if (!(Akt_Seite=AddNew_Seite(Akt_Gruppe)))
		{
			PrefsSpeicherMangel();
		}
	} else if (strequ(command,"FRAME"))
	{
		CheckPageHere();
		Akt_Seite->se_AnzFrames++;
		DoFrame=TRUE;
	} else if (strequ(command,"FRAMEEND"))
	{
		CheckObjHere();
		Akt_Objekt->ob_EndFrame=TRUE;
	} else if (strequ(command,"BOOL"))
	{
		CreateNewObjekt(OBJ_BOOL);
	} else if (strequ(command,"INTEGER"))
	{
		CreateNewObjekt(OBJ_INTEGER);
	} else if (strequ(command,"STRING"))
	{
		CreateNewObjekt(OBJ_STRING);
	} else if (strequ(command,"CYCLE"))
	{
		CreateNewObjekt(OBJ_CYCLE);
	} else if (strequ(command,"SLIDER"))
	{
		CreateNewObjekt(OBJ_SLIDER);
	} else if (strequ(command,"POPFILE"))
	{
		CreateNewObjekt(OBJ_FILE);
	} else if (strequ(command,"POPFONT"))
	{
		CreateNewObjekt(OBJ_FONT);
	} else if (strequ(command,"LISTVIEW"))
	{
		CreateNewObjekt(OBJ_LISTVIEW);
	} else {
		sprintf(s,MSG(ERR_GUI_ILLEGAL_KEYWORD),command);
		PrefsHinweis(s,TRUE);
	}
}

static void DoOption(void)
{

	KillSpaces(command);
	OptionToString(option);
	
	if (strequ(command,"PREFSNAME"))
	{
		strncat(PrefsName,option,90-strlen(PrefsName));
	} else if (strequ(command,"HELPGUIDE"))
	{
		strcpy(GuideFile,option);
	} else if (strequ(command,"GROUPNAME"))
	{
		CheckGroupHere();
		SetName_Gruppe(Akt_Gruppe,option)
	} else if (strequ(command,"GROUPHELPNODE"))
	{
		CheckGroupHere();
		SetHelpNode_Gruppe(Akt_Gruppe,option);
	} else if (strequ(command,"GROUPIMAGE"))
	{
		CheckGroupHere();
		SetImageName_Gruppe(Akt_Gruppe,option);
	} else if (strequ(command,"PAGENAME"))
	{
		CheckPageHere();
		SetName_Seite(Akt_Seite,option);
	} else if (strequ(command,"PAGEHELPNODE"))
	{
		CheckPageHere();
		SetHelpNode_Seite(Akt_Seite,option);
	} else if (strequ(command,"NAME"))
	{
		CheckObjHere();
		if (!SetName_Objekt(Akt_Objekt,option)) PrefsSpeicherMangel();
	} else if (strequ(command,"HELPTEXT"))
	{
		CheckObjHere();
		if (!SetHelp_Objekt(Akt_Objekt,option)) PrefsSpeicherMangel();
	} else if (strequ(command,"HELPNODE"))
	{
		CheckObjHere();
		if (!(SetHelpNode_Objekt(Akt_Objekt,option))) PrefsSpeicherMangel();
	} else if (strequ(command,"HELPLINE"))
	{
		CheckObjHere();
		Akt_Objekt->ob_HelpLine=OptionValue(option);
	} else if (strequ(command,"KEYWORD"))
	{
		CheckObjHere();
		if (!(SetKeyWord_Objekt(Akt_Objekt,option))) PrefsSpeicherMangel();
	} else if (strequ(command,"FRAMENAME"))
	{
		strncpy(FrameName,option,40);
	} else if (strequ(command,"LABELWIDTH"))
	{
		CheckPageHere();
		Akt_Seite->se_LabelWeight=OptionValue(option);
	} else if (strequ(command,"GADGETWIDTH"))
	{
		CheckPageHere();
		Akt_Seite->se_GadgetWeight=OptionValue(option);
	} else if (strequ(command,"MIN"))
	{
		CheckObjHere();
		Akt_Objekt->ob_Min=OptionValue(option);
	} else if (strequ(command,"MAX"))
	{
		CheckObjHere();
		switch (Akt_Objekt->ob_Typ)
		{
			case OBJ_STRING:
				Akt_Objekt->ob_MaxStringLen=OptionValue(option);
				break;

			default:
				Akt_Objekt->ob_Max=OptionValue(option);
				break;
		}
	} else if (strequ(command,"VALUE"))
	{
		CheckObjHere();
		switch (Akt_Objekt->ob_Typ)
		{
			case OBJ_INTEGER:
			case OBJ_CYCLE:
			case OBJ_SLIDER:
				Akt_Objekt->ob_LongValue=OptionValue(option);
				break;
			
			case OBJ_STRING:
			case OBJ_FILE:
			case OBJ_FONT:
				if (!SetStringValue_Objekt(Akt_Objekt,option,Akt_Objekt->ob_MaxStringLen>0 ? Akt_Objekt->ob_MaxStringLen : 255))
				{
					PrefsSpeicherMangel();
				}
				break;
			
			case OBJ_BOOL:
				if (strequ(option,"TRUE"))
				{
					Akt_Objekt->ob_LongValue=1;
				}
				break;
				
			case OBJ_LISTVIEW:
				ItemCounter++;
				Akt_Objekt->ob_AnzItems++;
		
				if (!(Akt_Item=AddNew_Item(Akt_Objekt)))
				{
					PrefsSpeicherMangel();
				}
				if (!SetName_Item(Akt_Item,option)) PrefsSpeicherMangel();
				break;
				
		}
	} else if (strequ(command,"ITEMNAME"))
	{
		CheckObjHere();
		ItemCounter++;
		Akt_Objekt->ob_AnzItems++;

		if (!(Akt_Item=AddNew_Item(Akt_Objekt)))
		{
			PrefsSpeicherMangel();
		}
		if (!SetName_Item(Akt_Item,option)) PrefsSpeicherMangel();
	} else if (strequ(command,"ITEMKEYWORD"))
	{
		CheckItemHere();
		if (!SetKeyWord_Item(Akt_Item,option)) PrefsSpeicherMangel();
	} else if (strequ(command,"CHARWIDTH"))
	{
		CheckObjHere();
		Akt_Objekt->ob_CharWidth=OptionValue(option);
	} else {
		sprintf(s,MSG(ERR_GUI_ILLEGAL_KEYWORD),command);
		PrefsHinweis(s,TRUE);
	}
}

static void MakeTabellen(void)
{
	struct Gruppe *gruppe;
	struct Seite *seite;
	struct Objekt *objekt;
	struct ObjektItem *item;

	STRPTR *sg,*ss,*so;
	
	gruppe=(struct Gruppe *)GruppenListe.lh_Head;
	
	while (gruppe->gr_Node.ln_Succ)
	{
		if (!(gruppe->gr_Tabelle=MyAllocVec((gruppe->gr_AnzSeiten+2)*sizeof(STRPTR),MEMF_ANY|MEMF_CLEAR)))
		{
			PrefsSpeicherMangel();
		}
		sg=gruppe->gr_Tabelle;
		
		seite=(struct Seite *)gruppe->gr_SeitenListe.lh_Head;
		while (seite->se_Node.ln_Succ)
		{
			*sg++ = seite->se_Name;
			
			if (!(seite->se_Tabelle=MyAllocVec((seite->se_AnzObjekte+2)*sizeof(STRPTR),MEMF_ANY|MEMF_CLEAR)))
			{
				PrefsSpeicherMangel();
			}
			
			ss=seite->se_Tabelle;
			
			objekt=(struct Objekt *)seite->se_ObjektListe.lh_Head;
			while (objekt->ob_Node.ln_Succ)
			{
				*ss++ = objekt->ob_Name;
				
				if (objekt->ob_AnzItems>0)
				{
					if (!(objekt->ob_Tabelle=MyAllocVec((objekt->ob_AnzItems+2)*sizeof(STRPTR),MEMF_ANY|MEMF_CLEAR)))
					{
						PrefsSpeicherMangel();
					}
					
					so=objekt->ob_Tabelle;
					
					item=(struct ObjektItem *)objekt->ob_ItemListe.lh_Head;
					while (item->obi_Node.ln_Succ)
					{
						*so++ = item->obi_Name;
						
						item=(struct ObjektItem *)item->obi_Node.ln_Succ;
					}
				}

				objekt=(struct Objekt *)objekt->ob_Node.ln_Succ;
			}
			
			seite=(struct Seite *)seite->se_Node.ln_Succ;
		}
		
		gruppe=(struct Gruppe *)gruppe->gr_Node.ln_Succ;
	}
}

void ScanPrefs(void)
{
	WORD linelen;
	char c;

	BOOL IsFound;

	FilePos=PrefsMemory;

	line[0]=0;linelen=0;
	done=FALSE;
	do {
		c = *FilePos++;
		switch (c)
		{
			case 0:
				done=TRUE;
			case 10:
				if ((line[0]!=0) && (line[0]!=';'))
				{
					command=line;
					while ((*command==' ') || (*command==9)) command++;
					
					if (command[0])
					{
						ss=strchr(line,'=');
						if (ss)
						{
							IsFound=TRUE;
							*ss++=0;
							option=ss;
						} else {
							IsFound=FALSE;
						}
						if (IsFound)
						{
							DoOption();
						} else {
							DoCommand();
						}
					} /* if (command[0]) */
				} /* if ((line[0]!=0) && (line[0]!=';')) */
				line[0]=0;linelen=0;
				break;
				
			default:
				line[linelen]=c;line[linelen+1]=0;
				linelen++;
		} /* switch (c) */
	} while (!done);
	
	MakeTabellen();
}


