/**************************************/
/***** FILLIN							 *****/
/***** (c) 1996 by Dirk Holtwick  *****/
/**************************************/

#include <dos/dos.h>
#include <pragma/dos_lib.h>
#include <stdio.h> 
#include <string.h>

#define CHECK(d) if(*(tex+1)==d){*lis++=*tex++; s++; break;}

long	qnum=0, 						// aktuelle lücke
		qanz=0, 						// anzahl der lücken
		anum=0;						// anzahl der antworten
char	antwort[10][100]; 		// antwortstrings

/*********/
#include <pragma/datatypes_lib.h>
#include <pragma/exec_lib.h>
#include <datatypes/datatypesclass.h>
struct	Library	*DataTypesBase=0;
Object	*o;


// SPEICHER RESERVIEREN FÜR LISTVIEW
long malloc_lister(){
	char	*str;
	long	size=0;

	str=text;
	while(*str){
		size++;
		switch(*str){
			case '{': size++; break;
			case '}': size++; break;
			case '<': size++; break;
			case '>': size++; break;
			case '[': if(*(str+1)=='['){ ++str; size++; }
						 else { size+=6; qanz++;}
						 break;						
		}
		str++;
	}
	lister=malloc(size+10);
	return(size);
}


// LISTE AKTUALISIEREN UND ANTWORTEN EXTRAHIEREN
void initliste(long num, int first){
	char	*tex=text,*lis=lister,*ans;
	long	s=0;
	long 	l,p;

	if(qanz) set (App->ga_good, MUIA_Gauge_Current, 100*qnum/qanz);
	get(App->lv_text,MUIA_List_First, &p);
	get(App->lv_text,MUIA_List_Visible,&l);
	p+=l-1;
	while(*tex){
		switch(*tex){
			case '{': CHECK('{'); *lis++='\x1b'; *lis++='i'; s+=2; break;
			case '}': CHECK('}'); *lis++='\x1b'; *lis++='n'; s+=2; break;
			case '<': CHECK('<'); *lis++='\x1b'; *lis++='b'; s+=2; break;
			case '>': CHECK('>'); *lis++='\x1b'; *lis++='n'; s+=2; break;
			case '[': CHECK('[');
				if (num<=0){
					*lis++='\x1b'; *lis++='8'; 
					if(num==0){
						anum=0;
						do{
							++tex;
							ans = antwort[anum];
//							printf("%d",&antwort[anum]);
							while((*tex!=']') && (*tex!='|') && *tex)	
								*ans++=*tex++;
							*ans=0;
//							printf("%s\n",antwort[anum]);
							++anum;
						}while(*tex=='|');
						*lis++='_'; *lis++='?'; *lis++='_';
					}else{
						while((*tex!=']')&&*tex) tex++;
						*lis++='_'; *lis++='_'; *lis++='_';
					}
					*lis++='\x1b'; *lis++='0';
					s+=7;
					--tex;
				}else{
					*lis++='\x1b'; *lis++='8'; 
					s+=2;
				}
				num--;
				break;
			case ']':  CHECK(']'); *lis++='\x1b'; *lis++='0'; s+=2; break;
			case '\n': *lis++=' '; s++; break;
			case '\\':  CHECK('\\'); if(*(tex+1)=='\n'){ ++tex; } *lis++='\n'; s++; break;
			default: *lis++=*tex; s++; break;
		}
		tex++;
	}
	*lis=0;
//	printf("used: %d\n",s);
	set (App->lv_text,MUIA_Floattext_Text,lister);
	if(!first){
		if(l){
			get(App->lv_text,MUIA_List_Entries,&l);
			if(l<p) DoMethod (App->lv_text,MUIM_List_Jump,l);
			else  DoMethod (App->lv_text,MUIM_List_Jump,p);
		}
	}
}


// ALLES SCHOEN HERRICHTEN
void do_init(){
	qnum=0;
	initliste(qnum,1);
}


// BESTIMME DIE LAENGE DER DATEI
long lgetsize(char *fname){
	long		size=0,locksave;
	struct 	FileInfoBlock  *fileinfo;

	fileinfo=malloc(sizeof(struct FileInfoBlock));
	if (locksave=Lock(fname,ACCESS_READ)){
		if(Examine(locksave,fileinfo)){
			size=fileinfo->fib_Size;
		}
		UnLock(locksave);
	};
	free(fileinfo);
	return(size);
}


// DATEI LADEN
void do_load(){
	long		size;
	FILE		*in;
	char		*name;

	get (App->str_file, MUIA_String_Contents, &name);

	if(size=lgetsize(name)){
		if(text) free(text);
		if(lister){
			free(lister);
			lister=0;
		}
		if(text=malloc(size+10)){
			if (in=fopen (name,"rb")){
				fread(text,size,1,in);
				text[size]=0;
				fclose (in);
				qnum=0; qanz=0;
				malloc_lister();
				do_init();
				return;
			};
		}else MUI_RequestA (App->App,App->win_fillout,0,NULL,"*_OK","Not enough memory!",0);
	};
	MUI_RequestA (App->App,App->win_fillout,0,NULL,"*_OK","Couldn't open file!",0);
}


// RICHTIGE ANTWORT? EINS WEITER!
void do_answ(){
	qnum++;
	if(qnum>=qanz){
		initliste(qnum,0);
		qnum=0;
		MUI_RequestA (App->App,App->win_fillout,0,NULL,"*_OK",
			GetFillInString(MSG_req_end),0);
	}
	initliste(qnum,0);
	setstring (App->str_antw,"");
}


// VERGLEICHE STRING MIT ALLEN ANTWORTEN
BOOL isok(char *s){
	int	i;

	for(i=0;i<anum;i++){
//		puts(antwort[i]);
		if(!strcmp(s,antwort[i])) return(TRUE);
	}
	return(FALSE);
}


//	ÜBERPRÜFE DEN STRING
void do_check(){
	char	*s;

	get (App->str_antw, MUIA_String_Contents, &s);
	if(isok(s)) do_answ();
	set(App->win_fillout,MUIA_Window_ActiveObject, App->str_antw)
}


//	EITELE NACHRICHT DES VERFASSERS
void do_info(){
	APTR	*win;

	get(App->win_fillout, MUIA_Window_Window, &win);
	if(DataTypesBase=OpenLibrary("datatypes.library",0)){
		if (o = NewDTObject ((APTR)"stuff:dito/samples/probe", DTA_Immediate, TRUE, NULL)){
//			DoDTMethod(o,(void *)win,0,GM_GOACTIVE,0,0);
			DisposeDTObject (o);
		}else puts("Datatype error");
		CloseLibrary (DataTypesBase);
	}else puts("Lib error");
	MUI_RequestA (App->App,App->win_fillout,0,NULL,"*_OK",
		GetFillInString(MSG_tx_info),0);
}
