// Freely distributable GadTools interface to PBM Plus

// mark@topic.demon.co.uk

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stddef.h>
#include <proto/exec.h>
#include <proto/gadtools.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <proto/asl.h>
extern struct Library *GadToolsBase = NULL;
extern struct Library *AslBase = NULL;
#include <intuition/gadgetclass.h>
#include <dos/dostags.h>

#define GetString( g )      ((( struct StringInfo * )g->SpecialInfo )->Buffer  )
#define GetNumber( g )      ((( struct StringInfo * )g->SpecialInfo )->LongInt )

#ifdef DEBUG
#define debug1(a) printf(a)
#define debug2(a,b) printf(a,b)
#else
#define debug1(a)
#define debug2(a,b)
#endif

#define HEAD_NONE 0
#define HEAD_LOAD 1
#define HEAD_PROCESS 2
#define HEAD_MISC 3
#define HEAD_SAVE 4

#define GAD_LFILE	1
#define GAD_SFILE	2
#define GAD_FILE	3
#define GAD_OFILE	4
#define GAD_ONUMBER	5
#define GAD_NUMBER	6
#define GAD_CYCLE	7
#define GAD_STRING	8
#define GAD_OSTRING	9
#define GAD_CHECK	10

struct TagItem ProcTags[] = {
	{ SYS_Input, 0 },
	{ SYS_Output, 0 },
	{ NP_Error, 0 },
	{ NP_CloseError, FALSE },
	{ NP_StackSize, 50000 },
	{ TAG_DONE }
};

struct MyType {		// Load/Save etc.
	struct List		CList;		// List of commands
	short				Number;		// Number of commands
	struct Gadget	*Gadget;		// Listview gadget
};

struct MyCommand {	// A command
	struct Node		CNode;		// In list of commands - holds Title of gadget
	struct List		GList;		// List of gadgets
	struct MyType	*OwnType;	// Owning type
	char				*Command;	//	Command to run
	char				*Comment;	//	Helpful comment
};

struct MyGadgetPtr {
	struct MyGadget *MyGadget;
	short				Number;
};

struct MyGadget {		// A gadget
	struct Node		GNode;		//	Used for list of gadgets on command
	short				Type;			// Gadget type
	struct List		VList;		// Used for values on cycle gadget
	STRPTR			*VStrings;	//	Used for strings on cycle gadget
	struct MyCommand *OwnCommand;	// Owning command
	struct MyGadget *OwnCycle;	// Owning cycle gadget
	struct Gadget	*Gadget1;	// 1st gadget
	struct Gadget	*Gadget2;	// 2nd gadget
	struct Gadget	*Gadget3;	//	3rd gadget
	long				Activey;		// Cycle value these are activated on
	char				*Title;		// Title of gadget
	char				*Prefix;		// Prefix for command
	char				*Defaults;	//	Default string;
	long				Defaultn;	// Default number;
	short				Defaultc;	// Default check;
	long				Defaulty;	//	Default cycle;
	long				Currentc;	// Current check;
	long				Currenty;	//	Current cycle;
	struct MyGadgetPtr Ptr1;		// UserData points to one of these
	struct MyGadgetPtr Ptr2;
	struct MyGadgetPtr Ptr3;
};

struct MyValue {
	struct Node		VNode;		// Used for list of cycle values;
	char				*Prefix;		//	Prefix for command
};

UWORD Zoom[] = {
	0,0,
	0,0
};

char Version[]="$VER: PBMGui 1.0 (9.2.94)";
char TempFileName[256];
struct FileRequester *filereq;

FILE *fp;
char buffer[256];
long linenumber = 0;
short heading=HEAD_NONE;
short FoundError=0;
short OutOfMemory = 0;

struct MyType Load,Process,Misc,Save;
struct MyType *CurrentType = NULL;
struct MyCommand *CurrentCommand = NULL;
struct MyGadget *CurrentGadget = NULL;
struct MyGadget *CurrentCycle = NULL;
struct MyValue *CurrentValue = NULL;
long	CurrentCycleVal = -1;

/* Wait pointer */
static USHORT __chip BusyPointerData[] =
{
   0x0000,0x0000,
   0x0400,0x07C0,0x0000,0x07C0,0x0100,0x0380,0x0000,0x07E0,
   0x07C0,0x1FF8,0x1FF0,0x3FEC,0x3FF8,0x7FDE,0x3FF8,0x7FBE,
   0x7FFC,0xFF7F,0x7EFC,0xFFFF,0x7FFC,0xFFFF,0x3FF8,0x7FFE,
   0x3FF8,0x7FFE,0x1FF0,0x3FFC,0x07C0,0x1FF8,0x0000,0x07E0,
   0x0000,0x0000,
};

void pError(char *a,char *b);
void Command(void);
void ProcessGadget(void);
void ProcessCycle(void);
void GetTitle();
void GetParameter();
void GetStringDefault();
void GetNumberDefault();
void GetCheckDefault();
void GetDefCycle();
void GetCycleTitle();
void GetCycleParameter();
char *myfgets(void);
char *SkipSpace(char *s);
void RequesterStuff(struct MyCommand *MyCommand);
BOOL CreateGadgets(struct MyCommand *MyCommand);
BOOL GetAFile(UBYTE *name,char *Prompt,ULONG flags);

#define LISTHEIGHT 160
#define LISTWIDTH 148

void
main(int argc,char **argv) {
	struct Screen *MyScreen;
	struct TextAttr *MyTextAttr;
	APTR MyVisInfo;
	struct Gadget *MyContext;
	struct Window *MyWindow;
	struct IntuiMessage	*MyIntuiMsg;
	short Mynotdone = 1;
	struct NewGadget MyNewGadget = {
		0,0,
		LISTWIDTH,LISTHEIGHT,
		NULL,
		NULL,
		PLACETEXT_ABOVE,
		NULL,
		NULL
	};
	struct MyCommand *MyCommand;
	struct MyType *MyType;
	short Count = 0;
	ULONG Secs=0;
	ULONG Micros=0;
	short LastGadget = -1;
	struct MyType *LastType = NULL;
	struct Requester MyRequest;

if (IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",37)) {
if (GadToolsBase = OpenLibrary("gadtools.library",37)) {
if (GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",37)) {
if (AslBase = OpenLibrary("asl.library",37)) {
if (filereq = AllocFileRequest()) {
	NewList(&Load.CList);
	Load.Number = 0;
	NewList(&Process.CList);
	Process.Number = 0;
	NewList(&Misc.CList);
	Misc.Number = 0;
	NewList(&Save.CList);
	Save.Number = 0;
	if (fp = fopen("PROGDIR:PBMGui.config","r")) {
		while (myfgets()) {
			if (buffer[0] == '=') {
				if (!strcmp(&buffer[1],"LOAD\n")) {
					heading = HEAD_LOAD;
					CurrentType = &Load;
				}
				else {
					if (!strcmp(&buffer[1],"PROCESS\n")) {
						heading = HEAD_PROCESS;
						CurrentType = &Process;
					}
					else {
						if (!strcmp(&buffer[1],"MISC\n")) {
							heading = HEAD_MISC;
							CurrentType = &Misc;
						}
						else {
							if (!strcmp(&buffer[1],"SAVE\n")) {
								heading = HEAD_SAVE;
								CurrentType = &Save;
							}
							else {
								heading = HEAD_NONE;
								CurrentType = NULL;
								pError("Invalid = header %s",&buffer[1]);
							}
						}
					}
				}
			}
			else {
				if (buffer[0] == '\n') {
				}
				else {
					if (buffer[0] == '"') {
						Command();
					}
				}
			}
		}
		if (!FoundError) {
			if (MyScreen = LockPubScreen(NULL)) {
				MyTextAttr = MyScreen->Font;
				if (MyVisInfo = GetVisualInfo(MyScreen,NULL)) {
					if (CreateContext(&MyContext)) {
						MyNewGadget.ng_TopEdge = MyScreen->WBorTop + (MyScreen->Font->ta_YSize + 1 + INTERHEIGHT)*2;
						MyNewGadget.ng_LeftEdge = MyScreen->WBorLeft + INTERWIDTH;
						MyNewGadget.ng_VisualInfo = MyVisInfo;
						MyNewGadget.ng_TextAttr = MyTextAttr;
						MyNewGadget.ng_UserData = &(Load);
						MyNewGadget.ng_GadgetText = "Load";
						if (Load.Gadget = CreateGadget(LISTVIEW_KIND,MyContext,&MyNewGadget,
										GTLV_Labels, &(Load.CList),
										GTLV_ShowSelected,NULL,
										TAG_END)) {
							MyNewGadget.ng_UserData = &(Process);
							MyNewGadget.ng_GadgetText = "Process";
							MyNewGadget.ng_LeftEdge += LISTWIDTH + INTERWIDTH;
							if (Process.Gadget = CreateGadget(LISTVIEW_KIND,Load.Gadget,&MyNewGadget,
											GTLV_Labels, &(Process.CList),
											GTLV_ShowSelected,NULL,
											TAG_END)) {
								MyNewGadget.ng_UserData = &(Misc);
								MyNewGadget.ng_GadgetText = "Misc";
								MyNewGadget.ng_LeftEdge += LISTWIDTH + INTERWIDTH;
								if (Misc.Gadget = CreateGadget(LISTVIEW_KIND,Process.Gadget,&MyNewGadget,
												GTLV_Labels, &(Misc.CList),
												GTLV_ShowSelected,NULL,
												TAG_END)) {
									MyNewGadget.ng_UserData = &(Save);
									MyNewGadget.ng_GadgetText = "Save";
									MyNewGadget.ng_LeftEdge += LISTWIDTH + INTERWIDTH;
									if (Save.Gadget = CreateGadget(LISTVIEW_KIND,Misc.Gadget,&MyNewGadget,
													GTLV_Labels, &(Save.CList),
													GTLV_ShowSelected,NULL,
													TAG_END)) {
										Zoom[0] = 0;
										Zoom[1] = MyScreen->BarHeight+1;
										Zoom[2] = 200;
										Zoom[3] = MyScreen->WBorTop + MyScreen->Font->ta_YSize + 1;
										if (MyWindow = OpenWindowTags(NULL,
												  	WA_Flags,  	WFLG_DRAGBAR|
										  		              	WFLG_DEPTHGADGET|
							      				         	WFLG_CLOSEGADGET|
							         				     	   WFLG_SMART_REFRESH|
							            		   		   WFLG_ACTIVATE,
											   	WA_IDCMP,   BUTTONIDCMP|
													            IDCMP_CLOSEWINDOW|
							   	   	   		         IDCMP_REFRESHWINDOW|
							   	   	   		         LISTVIEWIDCMP,
										  			WA_Width,   (LISTWIDTH * 4 + INTERWIDTH * 5) + 
										  							MyScreen->WBorLeft + MyScreen->WBorRight,
										      	WA_Height,  LISTHEIGHT + MyScreen->WBorTop + 
										      					(MyScreen->Font->ta_YSize + 1)*2 + (INTERHEIGHT * 3),
													WA_Title,	"PBMGui",
													WA_AutoAdjust,	TRUE,
													WA_PubScreen,	MyScreen,
													WA_Gadgets,	MyContext,
													WA_Zoom, Zoom,
													TAG_END)) {
											GT_RefreshWindow(MyWindow,NULL);
											while (Mynotdone) {
												WaitPort(MyWindow->UserPort);
													while (MyIntuiMsg = GT_GetIMsg(MyWindow->UserPort)) {
														switch (MyIntuiMsg->Class) {
														case IDCMP_REFRESHWINDOW:
															GT_BeginRefresh(MyWindow);
															GT_EndRefresh(MyWindow,TRUE);
															break;
														case IDCMP_CLOSEWINDOW:
															Mynotdone = 0;
															break;
														case IDCMP_GADGETUP:
															MyType = (struct MyType *)((struct Gadget *)MyIntuiMsg->IAddress)->UserData;
															if ((MyType == LastType) &&
																 (LastGadget == MyIntuiMsg->Code) &&
																 DoubleClick(Secs,Micros,MyIntuiMsg->Seconds,MyIntuiMsg->Micros)) {
																Count = 0;
																for (MyCommand = (struct MyCommand *)MyType->CList.lh_Head;
																		(Count != MyIntuiMsg->Code);
																		MyCommand = (struct MyCommand *)MyCommand->CNode.ln_Succ) {
																	++Count;
																}
																if (*MyCommand->Command != ' ') {
																	InitRequester(&MyRequest);
																	SetPointer(MyWindow, BusyPointerData, 16, 16, -6, 0);
																	if (Request(&MyRequest,MyWindow)) {
																		RequesterStuff(MyCommand);
																		EndRequest(&MyRequest,MyWindow);
																	}
																	ClearPointer(MyWindow);
																}
															}
															LastType = MyType;
															LastGadget = MyIntuiMsg->Code;
															Secs = MyIntuiMsg->Seconds;
															Micros = MyIntuiMsg->Micros;
															break;
													}
													GT_ReplyIMsg(MyIntuiMsg);
												}
											}
											CloseWindow(MyWindow);
										}
									}
								}
							}
						}
						FreeGadgets(MyContext);
					}
					FreeVisualInfo(MyVisInfo);
				}
				UnlockPubScreen(NULL,MyScreen);
			}
		}
		fclose(fp);
	}
FreeAslRequest(filereq);
}
CloseLibrary(AslBase);
}
CloseLibrary((struct Library *)GfxBase);
}
CloseLibrary(GadToolsBase);
}
CloseLibrary((struct Library *)IntuitionBase);
}
}

void
Command(void) {
	char *s,*s1;
	if (CurrentCommand = (struct MyCommand *)calloc(1,sizeof(struct MyCommand))) {
		CurrentCommand->OwnType = CurrentType;
		NewList(&CurrentCommand->GList);
		if (CurrentType) {
			AddTail(&CurrentType->CList,&CurrentCommand->CNode);
			++CurrentType->Number;
		}
	}
	else {
		pError("Out of memory",NULL);
		OutOfMemory = 1;
		return;
	}
	s = strchr(&buffer[1],'"');
	if (s) {
		*s = 0;
		CurrentCommand->Command = strdup(&buffer[1]);
		while ((s = myfgets()) && !strchr(buffer,'"')) {
		}
		if (s) {
			s = strchr(buffer,'"');
			s1 = strchr(s+1,'"');
			if (s1) {
				*s1=0;
				CurrentCommand->Comment = strdup(s+1);
				if (myfgets()) {
					s = strchr(buffer,'"');
					if (s) {
						s1 = strchr(s+1,'"');
						if (s1) {
							*s1=0;
							CurrentCommand->CNode.ln_Name = strdup(s+1);
							while (myfgets() && (buffer[0] != '\n')) {
								ProcessGadget();
							}
 						}
						else {
							pError("No trailing \" on 'Title' line",NULL);
							while (myfgets() && (buffer[0] != '\n')) {
							}
						}
					}
					else {
						pError("No starting \" on 'Title' line",NULL);
						while (myfgets() && (buffer[0] != '\n')) {
						}
					}
				}
				else {
					pError("Unexpected end of file - missing Title",NULL);
				}
			}
			else {
				pError("No trailing \" on 'Comment' line",NULL);
				while (myfgets() && (buffer[0] != '\n')) {
				}
			}
		}
		else {
			pError("Unexpected end of file - Missin Comment",NULL);
		}
	}
	else {
		pError("No trailing \" on 'Command' line",NULL);
		while (myfgets() && (buffer[0] != '\n')) {
		}
	}
	CurrentCommand = NULL;
}

void
pError(char *a,char *b) {
	if (!OutOfMemory) {
		printf("Error on line %ld\n",linenumber);
		printf(a,b);
		printf("\n");
		++FoundError;
	}
}

char
*myfgets(void) {
	char *s;
	if ((FoundError > 10) || (OutOfMemory)) {
		printf("Too many errors - giving up!!!\n");
		return NULL;
	}
	++linenumber;
	while ((s = fgets(buffer,255,fp)) && (buffer[0] == '*')) {
		++linenumber;
	}
	return s;
}

void
ProcessGadget(void) {
	char *s;
	if (CurrentGadget = (struct MyGadget *)calloc(1,sizeof(struct MyGadget))) {
		CurrentGadget->OwnCommand = CurrentCommand;
		NewList(&CurrentGadget->VList);
		if (CurrentCommand) {
			AddTail(&CurrentCommand->GList,&CurrentGadget->GNode);
		}
		if (CurrentCycle) {
			CurrentGadget->Activey = CurrentCycleVal;
			CurrentGadget->OwnCycle = CurrentCycle;
		}
	}
	else {
		pError("Out of memory",NULL);
		OutOfMemory = 1;
		return;
	}
	s = SkipSpace(buffer);
	if (s) {
		if (!strncmp(s,"LFILE",strlen("LFILE"))) {
			CurrentGadget->Type = GAD_LFILE;
			GetTitle();
			GetParameter();
			GetStringDefault();
		}
		else {
			if (!strncmp(s,"SFILE",strlen("SFILE"))) {
				CurrentGadget->Type = GAD_SFILE;
				GetTitle();
				GetParameter();
				GetStringDefault();
			}
			else {
				if (!strncmp(s,"FILE",strlen("FILE"))) {
					CurrentGadget->Type = GAD_FILE;
					GetTitle();
					GetParameter();
					GetStringDefault();
				}
				else {
					if (!strncmp(s,"OFILE",strlen("OFILE"))) {
						CurrentGadget->Type = GAD_OFILE;
						GetTitle();
						GetParameter();
						GetStringDefault();
						GetCheckDefault();
					}
					else {
						if (!strncmp(s,"ONUMBER",strlen("ONUMBER"))) {
							CurrentGadget->Type = GAD_ONUMBER;
							GetTitle();
							GetParameter();
							GetNumberDefault();
							GetCheckDefault();
						}
						else {
							if (!strncmp(s,"NUMBER",strlen("NUMBER"))) {
								CurrentGadget->Type = GAD_NUMBER;
								GetTitle();
								GetParameter();
								GetNumberDefault();
							}
							else {
								if (!strncmp(s,"CYCLE",strlen("CYCLE"))) {
									CurrentGadget->Type = GAD_CYCLE;
									if (CurrentCycle) {
										pError("Cannot have CYCLE in CYCLE",NULL);
									}
									else {
										GetTitle();
										ProcessCycle();
									}
								}
								else {
									if (!strncmp(s,"STRING",strlen("STRING"))) {
										CurrentGadget->Type = GAD_STRING;
										GetTitle();
										GetParameter();
										GetStringDefault();
									}
									else {
										if (!strncmp(s,"OSTRING",strlen("OSTRING"))) {
											CurrentGadget->Type = GAD_OSTRING;
											GetTitle();
											GetParameter();
											GetStringDefault();
											GetCheckDefault();
										}
										else {
											if (!strncmp(s,"CHECK",strlen("CHECK"))) {
												CurrentGadget->Type = GAD_CHECK;
												GetTitle();
												GetParameter();
												GetCheckDefault();
											}
											else {
												pError("Unknown gadget type",s);
												while(myfgets() && (buffer[0] != '\n')) {
												}
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}
	else {
		pError("Unexpcted space filled line",NULL);
	}
	CurrentGadget = NULL;
}

void
ProcessCycle(void) {
	char *s;
	short endfound = 0;
	short first = 1;
	short StringCount = 0;
	struct MyValue *MyValue;
	STRPTR *ptr;
	CurrentCycle = CurrentGadget;
	CurrentCycleVal = -1;
	while (!endfound && myfgets()) {
		s = SkipSpace(buffer);
		if (s) {
			if (*s == '"') {
				first = 0;
				if (CurrentValue = (struct MyValue *)calloc(1,sizeof(struct MyValue))) {
					AddTail(&CurrentCycle->VList,&CurrentValue->VNode);
					GetCycleTitle();
					GetCycleParameter();
					CurrentValue = NULL;
					++StringCount;
					++CurrentCycleVal;
				}
				else {
					pError("Out of memory",NULL);
					OutOfMemory = 1;
					return;
				}
			}
			else {
				if (!first) {
					if (!strncmp(s,"ENDCYCLE",strlen("ENDCYCLE"))) {
						GetDefCycle();
						endfound = 1;
					}
					else {
						ProcessGadget();
					}
				}
				else {
					pError("Missing first cycle gadget text",NULL);
					while (myfgets() && (buffer[0] != '\n')) {
					}
				}
			}
		}
		else {
			pError("Unexpected space line - Missing ENDCYCLE",NULL);
			return;
		}
	}
	if (!endfound) {
		pError("Unexpected end of file - Missing ENDCYCLE",NULL);
	}
	if (ptr = CurrentCycle->VStrings = (STRPTR *)calloc(sizeof(STRPTR),StringCount+1)) {
		for (MyValue = (struct MyValue *)CurrentCycle->VList.lh_Head;
				MyValue->VNode.ln_Succ;
				MyValue = (struct MyValue *)MyValue->VNode.ln_Succ) {
			*ptr = MyValue->VNode.ln_Name;
			ptr++;
		}
	}
	else {
		pError("Out of memory",NULL);
		OutOfMemory = 1;
		return;
	}
	CurrentCycle = NULL;
}

char *CurrentPos;

void
GetTitle() {
	char *s;
	CurrentPos = strchr(buffer,'"');
	if (CurrentPos) {
		s = CurrentPos + 1;
		CurrentPos = strchr(s,'"');
		if (CurrentPos) {
			*CurrentPos = 0;
			CurrentGadget->Title = strdup(s);
			++CurrentPos;
		}
		else {
			pError("Missing gadget Title end \"",NULL);
		}
	}
	else {
		pError("Missing gadget Title start \"",NULL);
	}
}

void
GetParameter() {
	char *s;
	if (CurrentPos) {
		CurrentPos = strchr(CurrentPos,'"');
		if (CurrentPos) {
			s = CurrentPos + 1;
			CurrentPos = strchr(s,'"');
			if (CurrentPos) {
				*CurrentPos = 0;
				CurrentGadget->Prefix = strdup(s);
				++CurrentPos;
			}
			else {
				pError("Missing gadget Prefix end \"",NULL);
			}
		}
		else {
			pError("Missing gadget Prefix start \"",NULL);
		}
	}
}

char *NullString = "";

void
GetStringDefault() {
	char *s;
	if (CurrentPos) {
		CurrentPos = strchr(CurrentPos,'"');
		if (CurrentPos) {
			s = CurrentPos + 1;
			CurrentPos = strchr(s,'"');
			if (CurrentPos) {
				*CurrentPos = 0;
				CurrentGadget->Defaults = strdup(s);
				++CurrentPos;
			}
			else {
				pError("Missing gadget Default end \"",NULL);
			}
		}
		else {
			CurrentGadget->Defaults = NullString;
		}
	}
	else {
		CurrentGadget->Defaults = NullString;
	}
}

void
GetNumberDefault() {
	char *s;
	long number;
	if (CurrentPos) {
		CurrentPos = strchr(CurrentPos,'"');
		if (CurrentPos) {
			s = CurrentPos + 1;
			CurrentPos = strchr(s,'"');
			if (CurrentPos) {
				*CurrentPos = 0;
				number = strtol(s,&CurrentPos,10);
				CurrentGadget->Defaultn = number;
				++CurrentPos;
			}
			else {
				pError("Missing gadget Default end \"",NULL);
			}
		}
		else {
			number = 0;
			CurrentGadget->Defaultn = number;
		}
	}
	else {
		number = 0;
		CurrentGadget->Defaultn = number;
	}
}

void
GetCheckDefault() {
	char *s;
	short Check;
	if (CurrentPos) {
		s = strpbrk(CurrentPos,"YN");
		if (s && *s) {
			if (*s == 'Y') {
				Check = 1;
				CurrentGadget->Defaultc = Check;
			}
			else {
				Check = 0;
				CurrentGadget->Defaultc = Check;
			}
		}
		else {
			Check = 0;
			CurrentGadget->Defaultc = Check;
		}
	}
	else {
		Check = 0;
		CurrentGadget->Defaultc = Check;
	}
	CurrentGadget->Currentc = CurrentGadget->Defaultc;
}

void
GetDefCycle() {
	char *s;
	long number;
	CurrentPos = strchr(buffer,'"');
	if (CurrentPos) {
		s = CurrentPos + 1;
		CurrentPos = strchr(s,'"');
		if (CurrentPos) {
			*CurrentPos = 0;
			number = strtol(s,&CurrentPos,10);
			CurrentCycle->Defaulty = number;
			++CurrentPos;
		}
		else {
			pError("Missing gadget Default end \"",NULL);
		}
	}
	else {
		number = 0;
		CurrentCycle->Defaulty = number;
	}
	CurrentCycle->Currenty = CurrentCycle->Defaulty;
}

void
GetCycleTitle() {
	char *s;
	CurrentPos = strchr(buffer,'"');
	if (CurrentPos) {
		s = CurrentPos + 1;
		CurrentPos = strchr(s,'"');
		if (CurrentPos) {
			*CurrentPos = 0;
			CurrentValue->VNode.ln_Name = strdup(s);
			++CurrentPos;
		}
		else {
			pError("Missing Cycle Value end \"",NULL);
		}
	}
	else {
		pError("Missing Cycle Value start \"",NULL);
	}
}

void
GetCycleParameter() {
	char *s;
	if (CurrentPos) {
		CurrentPos = strchr(CurrentPos,'"');
		if (CurrentPos) {
			s = CurrentPos + 1;
			CurrentPos = strchr(s,'"');
			if (CurrentPos) {
				*CurrentPos = 0;
				CurrentValue->Prefix = strdup(s);
				++CurrentPos;
			}
			else {
				pError("Missing Cycle value Prefix end \"",NULL);
			}
		}
		else {
			pError("Missing Cycle value Prefix start \"",NULL);
		}
	}
}

char
*SkipSpace(char *s) {
	while (s && *s && ((*s == ' ') || (*s == '\t'))) {
		++s;
	}
	return s;
}


#define LEFT 15
#define RIGHT 30

struct Screen *Screen;
struct TextAttr *TextAttr;
APTR VisInfo;
struct Gadget *Context;
struct Window *Window;
struct Requester Requestx;
struct IntuiMessage	*IntuiMsg;
long height = 0;
UWORD width = 0;
BOOL File1 = TRUE;
char Buffer[1024];
char tBuffer[256];

void
RequesterStuff(struct MyCommand *MyCommand) {
	struct MyGadgetPtr *Ptr;
	struct MyGadget *MyGadget,*LoopGadget;
	struct MyValue *MyValue;
	short count;
	short notdone = 1;
	if (Screen = LockPubScreen(NULL)) {
		TextAttr = Screen->Font;
		if (VisInfo = GetVisualInfo(Screen,NULL)) {
			if (CreateContext(&Context)) {
				if (CreateGadgets(MyCommand)) {
					if (Window = OpenWindowTags(NULL,
					  	WA_Flags,  	WFLG_DRAGBAR|
			  		              	WFLG_DEPTHGADGET|
      				         	WFLG_CLOSEGADGET|
         				     	   WFLG_SMART_REFRESH|
            		   		   WFLG_ACTIVATE,
				   	WA_IDCMP,   BUTTONIDCMP|
						            IDCMP_CLOSEWINDOW|
   	   	   		         IDCMP_REFRESHWINDOW,
			  			WA_Width,   width * (LEFT + RIGHT) + (INTERWIDTH * 2) +
				  		  				Screen->WBorLeft +
			  			  				Screen->WBorRight,
			      	WA_Height,  height,
						WA_Title,	MyCommand->Comment,
						WA_AutoAdjust,	TRUE,
						WA_PubScreen,	Screen,
						WA_Gadgets,	Context,
						WA_Zoom, Zoom,
						TAG_END)) {
						GT_RefreshWindow(Window,NULL);
						while (notdone) {
							WaitPort(Window->UserPort);
							while (IntuiMsg = GT_GetIMsg(Window->UserPort)) {
								switch (IntuiMsg->Class) {
								case IDCMP_REFRESHWINDOW:
									GT_BeginRefresh(Window);
									GT_EndRefresh(Window,TRUE);
									break;
								case IDCMP_CLOSEWINDOW:
									if ((MyCommand->OwnType == &Process)) {
										File1 = !File1;
									}
									notdone = 0;
									break;
								case IDCMP_GADGETUP:
									Ptr = (struct MyGadgetPtr *)((struct Gadget *)IntuiMsg->IAddress)->UserData;
								if (!Ptr) {
									sprintf(Buffer,"%s",MyCommand->Command);
									for (LoopGadget = (struct MyGadget *)(MyCommand->GList.lh_Head);
											LoopGadget->GNode.ln_Succ;
											LoopGadget = (struct MyGadget *)(LoopGadget->GNode.ln_Succ)) {
										if (!LoopGadget->OwnCycle || (LoopGadget->OwnCycle->Currenty == LoopGadget->Activey)) {
											switch (LoopGadget->Type) {
											case GAD_LFILE:
											case GAD_SFILE:
											case GAD_FILE:
												sprintf(tBuffer,"%s\"%s\" ",LoopGadget->Prefix,GetString(LoopGadget->Gadget1));
												strcat(Buffer,tBuffer);
												break;
												case GAD_OFILE:
												if (LoopGadget->Currentc) {
													sprintf(tBuffer,"%s\"%s\" ",LoopGadget->Prefix,GetString(LoopGadget->Gadget2));
													strcat(Buffer,tBuffer);
												}
												break;
											case GAD_ONUMBER:
												if (LoopGadget->Currentc) {
													sprintf(tBuffer,"%s%ld ",LoopGadget->Prefix,GetNumber(LoopGadget->Gadget2));
													strcat(Buffer,tBuffer);
												}
												break;
											case GAD_NUMBER:
												sprintf(tBuffer,"%s%ld ",LoopGadget->Prefix,GetNumber(LoopGadget->Gadget1));
												strcat(Buffer,tBuffer);
												break;
											case GAD_CYCLE:
												count = 0;
												for (MyValue = (struct MyValue *)(LoopGadget->VList.lh_Head);
														MyValue->VNode.ln_Succ;
														MyValue = (struct MyValue *)(MyValue->VNode.ln_Succ)){
													if (count == LoopGadget->Currenty) {
														sprintf(tBuffer,"%s ",MyValue->Prefix);
														strcat(Buffer,tBuffer);
													}
													++count;
												}
												break;
											case GAD_STRING:
												sprintf(tBuffer,"%s%s ",LoopGadget->Prefix,GetString(LoopGadget->Gadget1));
												strcat(Buffer,tBuffer);
												break;
											case GAD_OSTRING:
												if (LoopGadget->Currentc) {
													sprintf(tBuffer,"%s%s ",LoopGadget->Prefix,GetString(LoopGadget->Gadget2));
													strcat(Buffer,tBuffer);
												}
												break;
											case GAD_CHECK:
												if (LoopGadget->Currentc) {
													sprintf(tBuffer,"%s ",LoopGadget->Prefix);
													strcat(Buffer,tBuffer);
												}
												break;
											}
										}
									}
									InitRequester(&Requestx);
									SetPointer(Window, BusyPointerData, 16, 16, -6, 0);
									if (Request(&Requestx,Window)) {
										ProcTags[0].ti_Data = Input();
										ProcTags[1].ti_Data = Output();
										ProcTags[2].ti_Data = Output();
										if (SystemTagList(Buffer,ProcTags)) {
											// if command fails then switch back to original
											if ((MyCommand->OwnType == &Process)) {
												File1 = !File1;
											}
										}
										EndRequest(&Requestx,Window);
									}
									ClearPointer(Window);
									notdone = 0;
								}
								else {
									MyGadget = Ptr->MyGadget;
									switch (MyGadget->Type) {
										case GAD_LFILE:
										case GAD_SFILE:
										case GAD_FILE:
											switch (Ptr->Number) {
											case 2:
												if (GetAFile(GetString(MyGadget->Gadget1),
													 (MyGadget->Type == GAD_LFILE)?"Select input file":
													 (MyGadget->Type == GAD_SFILE)?"Select output file":
													 "Select file",
													 (MyGadget->Type == GAD_SFILE)?FILF_SAVE:0)) {
													GT_SetGadgetAttrs(MyGadget->Gadget1,Window,NULL,
														GTST_String,TempFileName,
														TAG_END);
												}
												break;
											}
											break;
										case GAD_OFILE:
											switch (Ptr->Number) {
											case 1:
												MyGadget->Currentc = !MyGadget->Currentc;
												GT_SetGadgetAttrs(MyGadget->Gadget2,Window,NULL,
														GA_Disabled,!MyGadget->Currentc,
														TAG_END);
												GT_SetGadgetAttrs(MyGadget->Gadget3,Window,NULL,
														GA_Disabled,!MyGadget->Currentc,
														TAG_END);
												if (MyGadget->Currentc) {
													ActivateGadget(MyGadget->Gadget2,Window,NULL);
												}
												break;
											case 3:
												if (GetAFile(GetString(MyGadget->Gadget2),
													 "Select file",0)) {
													GT_SetGadgetAttrs(MyGadget->Gadget2,Window,NULL,
														GTST_String,TempFileName,
														TAG_END);
												}
												break;
											}
											break;
										case GAD_ONUMBER:
											switch (Ptr->Number) {
											case 1:
												MyGadget->Currentc = !MyGadget->Currentc;
												GT_SetGadgetAttrs(MyGadget->Gadget2,Window,NULL,
														GA_Disabled,!MyGadget->Currentc,
														TAG_END);
												if (MyGadget->Currentc) {
													ActivateGadget(MyGadget->Gadget2,Window,NULL);
												}
												break;
											}
											break;
										case GAD_NUMBER:
											break;
										case GAD_CYCLE:
											MyGadget->Currenty = IntuiMsg->Code;
											for (LoopGadget = (struct MyGadget *)(MyGadget->OwnCommand->GList.lh_Head);
													LoopGadget->GNode.ln_Succ;
													LoopGadget = (struct MyGadget *)(LoopGadget->GNode.ln_Succ)){
												if (MyGadget == LoopGadget->OwnCycle) {
													GT_SetGadgetAttrs(LoopGadget->Gadget1,Window,NULL,
															GA_Disabled,MyGadget->Currenty != LoopGadget->Activey,
															TAG_END);
													if (LoopGadget->Gadget2) {
														GT_SetGadgetAttrs(LoopGadget->Gadget2,Window,NULL,
																GA_Disabled,(MyGadget->Currenty != LoopGadget->Activey) |
																				(((LoopGadget->Type == GAD_ONUMBER) |
																				  (LoopGadget->Type == GAD_OSTRING) |
																				  (LoopGadget->Type == GAD_OFILE)) & (!LoopGadget->Currentc)),
																TAG_END);
													}
													if (LoopGadget->Gadget3) {
														GT_SetGadgetAttrs(LoopGadget->Gadget3,Window,NULL,
																GA_Disabled,(MyGadget->Currenty != LoopGadget->Activey) |
																				  ((LoopGadget->Type == GAD_OFILE) & (!LoopGadget->Currentc)),
																TAG_END);
													}
												}
											}
											break;
										case GAD_STRING:
											break;
										case GAD_OSTRING:
											switch (Ptr->Number) {
											case 1:
												MyGadget->Currentc = !MyGadget->Currentc;
												GT_SetGadgetAttrs(MyGadget->Gadget2,Window,NULL,
														GA_Disabled,!MyGadget->Currentc,
														TAG_END);
												if (MyGadget->Currentc) {
													ActivateGadget(MyGadget->Gadget2,Window,NULL);
												}
												break;
											}
											break;
										case GAD_CHECK:
											MyGadget->Currentc = !MyGadget->Currentc;
											break;
									}
								}
									break;
								default:
									break;
								}
								GT_ReplyIMsg(IntuiMsg);
							}
						}
						CloseWindow(Window);
					}
				}
				FreeGadgets(Context);
			}
			FreeVisualInfo(VisInfo);
		}
		UnlockPubScreen(NULL,Screen);
	}
}

BOOL
CreateGadgets(struct MyCommand *MyCommand) {
	struct MyGadget *MyGadget;
	struct Gadget *Gadget;
	struct NewGadget NewGadget = {
		0,0,
		0,0,
		NULL,
		NULL,
		PLACETEXT_IN,
		NULL,
		NULL
	};
	char *string;
	width = min(Screen->Font->ta_YSize,8);
	Gadget = Context;
	height = Screen->WBorTop + Screen->Font->ta_YSize + 1;
	NewGadget.ng_Height = Screen->Font->ta_YSize + 4;
	NewGadget.ng_VisualInfo = VisInfo;
	NewGadget.ng_TextAttr = TextAttr;
	if (MyCommand) {
		for (MyGadget = (struct MyGadget *)MyCommand->GList.lh_Head;
				MyGadget->GNode.ln_Succ && Gadget;
				MyGadget = (struct MyGadget *)MyGadget->GNode.ln_Succ) {
			height += INTERHEIGHT;
			NewGadget.ng_TopEdge = height;
			switch (MyGadget->Type) {
			case GAD_LFILE:
			case GAD_SFILE:
			case GAD_FILE:
				if (MyGadget->Type == GAD_FILE) {
					string = MyGadget->Defaults;
				}
				else {
					if (MyGadget->Type == GAD_LFILE) {
						if (MyCommand->OwnType != &Load) {
							if (File1) {
								string = "T:PBM_GUI_1";
							}
							else {
								string = "T:PBM_GUI_2";
							}
							if (MyCommand->OwnType == &Process) {
								File1 = !File1;
							}
						}
						else {
							string = "";
						}
					}
					else {
						if (MyCommand->OwnType != &Save) {
							if (File1) {
								string = "T:PBM_GUI_1";
							}
							else {
								string = "T:PBM_GUI_2";
							}
						}
						else {
							string = "";
						}
					}
				}
				MyGadget->Ptr1.MyGadget = MyGadget;
				MyGadget->Ptr1.Number = 1;
				NewGadget.ng_UserData = &(MyGadget->Ptr1);
				NewGadget.ng_LeftEdge = Screen->WBorLeft + INTERWIDTH + width*LEFT;
				NewGadget.ng_Width = width*RIGHT - INTERWIDTH - 26;
				NewGadget.ng_GadgetText = MyGadget->Title;
				MyGadget->Gadget1 = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
											GTST_String, string,
											GTST_MaxChars, 128,
											GA_Disabled, MyGadget->OwnCycle ?((MyGadget->OwnCycle->Currenty == MyGadget->Activey) ? FALSE : TRUE ) : FALSE,
											TAG_END);
				NewGadget.ng_LeftEdge += NewGadget.ng_Width + INTERWIDTH;
				MyGadget->Ptr2.MyGadget = MyGadget;
				MyGadget->Ptr2.Number = 2;
				NewGadget.ng_UserData = &(MyGadget->Ptr2);
				NewGadget.ng_Width = 26;
				NewGadget.ng_GadgetText = "«";
				MyGadget->Gadget2 = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
											GA_Disabled, MyGadget->OwnCycle ?((MyGadget->OwnCycle->Currenty == MyGadget->Activey) ? FALSE : TRUE ) : FALSE,
											TAG_END);
				break;
			case GAD_OFILE:
				MyGadget->Ptr1.MyGadget = MyGadget;
				MyGadget->Ptr1.Number = 1;
				NewGadget.ng_UserData = &(MyGadget->Ptr1);
				NewGadget.ng_LeftEdge = Screen->WBorLeft + INTERWIDTH + width*LEFT;
				NewGadget.ng_Width = 26;
				NewGadget.ng_GadgetText = MyGadget->Title;
				MyGadget->Gadget1 = Gadget = CreateGadget(CHECKBOX_KIND,Gadget,&NewGadget,
											GTCB_Checked, MyGadget->Currentc,
											GA_Disabled, MyGadget->OwnCycle ?((MyGadget->OwnCycle->Currenty == MyGadget->Activey) ? FALSE : TRUE ) : FALSE,
											TAG_END);
				MyGadget->Ptr2.MyGadget = MyGadget;
				MyGadget->Ptr2.Number = 2;
				NewGadget.ng_UserData = &(MyGadget->Ptr2);
				NewGadget.ng_LeftEdge += INTERWIDTH + 26;
				NewGadget.ng_Width = width*RIGHT - ((INTERWIDTH + 26) * 2);
				NewGadget.ng_GadgetText = NULL;
				MyGadget->Gadget2 = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
											GTST_String, MyGadget->Defaults,
											GTST_MaxChars, 128,
											GA_Disabled,MyGadget->Currentc ? (MyGadget->OwnCycle ?((MyGadget->OwnCycle->Currenty == MyGadget->Activey) ? FALSE : TRUE ) : FALSE) : TRUE,
											TAG_END);
				NewGadget.ng_LeftEdge += NewGadget.ng_Width + INTERWIDTH;
				MyGadget->Ptr3.MyGadget = MyGadget;
				MyGadget->Ptr3.Number = 3;
				NewGadget.ng_UserData = &(MyGadget->Ptr3);
				NewGadget.ng_Width = 26;
				NewGadget.ng_GadgetText = "«";
				MyGadget->Gadget3 = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
											GA_Disabled,MyGadget->Currentc ? (MyGadget->OwnCycle ?((MyGadget->OwnCycle->Currenty == MyGadget->Activey) ? FALSE : TRUE ) : FALSE) : TRUE,
											TAG_END);
				break;
			case GAD_ONUMBER:
				MyGadget->Ptr1.MyGadget = MyGadget;
				MyGadget->Ptr1.Number = 1;
				NewGadget.ng_UserData = &(MyGadget->Ptr1);
				NewGadget.ng_LeftEdge = Screen->WBorLeft + INTERWIDTH + width*LEFT;
				NewGadget.ng_Width = 26;
				NewGadget.ng_GadgetText = MyGadget->Title;
				MyGadget->Gadget1 = Gadget = CreateGadget(CHECKBOX_KIND,Gadget,&NewGadget,
											GTCB_Checked, MyGadget->Currentc,
											GA_Disabled, MyGadget->OwnCycle ?((MyGadget->OwnCycle->Currenty == MyGadget->Activey) ? FALSE : TRUE ) : FALSE,
											TAG_END);
				MyGadget->Ptr2.MyGadget = MyGadget;
				MyGadget->Ptr2.Number = 2;
				NewGadget.ng_UserData = &(MyGadget->Ptr2);
				NewGadget.ng_LeftEdge += INTERWIDTH + 26;
				NewGadget.ng_Width = width*RIGHT - 26 - INTERWIDTH;
				NewGadget.ng_GadgetText = NULL;
				MyGadget->Gadget2 = Gadget = CreateGadget(INTEGER_KIND,Gadget,&NewGadget,
											GTIN_Number, MyGadget->Defaultn,
											GA_Disabled,MyGadget->Currentc ? (MyGadget->OwnCycle ?((MyGadget->OwnCycle->Currenty == MyGadget->Activey) ? FALSE : TRUE ) : FALSE) : TRUE,
											TAG_END);
				break;
			case GAD_NUMBER:
				MyGadget->Ptr1.MyGadget = MyGadget;
				MyGadget->Ptr1.Number = 1;
				NewGadget.ng_UserData = &(MyGadget->Ptr1);
				NewGadget.ng_LeftEdge = Screen->WBorLeft + INTERWIDTH + width*LEFT;
				NewGadget.ng_Width = width*RIGHT;
				NewGadget.ng_GadgetText = MyGadget->Title;
				MyGadget->Gadget1 = Gadget = CreateGadget(INTEGER_KIND,Gadget,&NewGadget,
											GTIN_Number, MyGadget->Defaultn,
											GA_Disabled, MyGadget->OwnCycle ?((MyGadget->OwnCycle->Currenty == MyGadget->Activey) ? FALSE : TRUE ) : FALSE,
											TAG_END);
				break;
			case GAD_CYCLE:
				MyGadget->Ptr1.MyGadget = MyGadget;
				MyGadget->Ptr1.Number = 1;
				NewGadget.ng_UserData = &(MyGadget->Ptr1);
				NewGadget.ng_LeftEdge = Screen->WBorLeft + INTERWIDTH + width*LEFT;
				NewGadget.ng_Width = width*RIGHT;
				NewGadget.ng_GadgetText = MyGadget->Title;
				MyGadget->Gadget1 = Gadget = CreateGadget(CYCLE_KIND,Gadget,&NewGadget,
											GTCY_Labels, MyGadget->VStrings,
											GTCY_Active, MyGadget->Currenty,
											TAG_END);
				break;
			case GAD_STRING:
				MyGadget->Ptr1.MyGadget = MyGadget;
				MyGadget->Ptr1.Number = 1;
				NewGadget.ng_UserData = &(MyGadget->Ptr1);
				NewGadget.ng_LeftEdge = Screen->WBorLeft + INTERWIDTH + width*LEFT;
				NewGadget.ng_Width = width*RIGHT;
				NewGadget.ng_GadgetText = MyGadget->Title;
				MyGadget->Gadget1 = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
											GTST_String, MyGadget->Defaults,
											GA_Disabled, MyGadget->OwnCycle ?((MyGadget->OwnCycle->Currenty == MyGadget->Activey) ? FALSE : TRUE ) : FALSE,
											TAG_END);
				break;
			case GAD_OSTRING:
				MyGadget->Ptr1.MyGadget = MyGadget;
				MyGadget->Ptr1.Number = 1;
				NewGadget.ng_UserData = &(MyGadget->Ptr1);
				NewGadget.ng_LeftEdge = Screen->WBorLeft + INTERWIDTH + width*LEFT;
				NewGadget.ng_Width = 26;
				NewGadget.ng_GadgetText = MyGadget->Title;
				MyGadget->Gadget1 = Gadget = CreateGadget(CHECKBOX_KIND,Gadget,&NewGadget,
											GTCB_Checked, MyGadget->Currentc,
											GA_Disabled, MyGadget->OwnCycle ?((MyGadget->OwnCycle->Currenty == MyGadget->Activey) ? FALSE : TRUE ) : FALSE,
											TAG_END);
				MyGadget->Ptr2.MyGadget = MyGadget;
				MyGadget->Ptr2.Number = 2;
				NewGadget.ng_UserData = &(MyGadget->Ptr2);
				NewGadget.ng_LeftEdge += INTERWIDTH + 26;
				NewGadget.ng_Width = width*RIGHT - 26 - INTERWIDTH;
				NewGadget.ng_GadgetText = NULL;
				MyGadget->Gadget2 = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
											GTST_String, MyGadget->Defaults,
											GA_Disabled,MyGadget->Currentc ? (MyGadget->OwnCycle ?((MyGadget->OwnCycle->Currenty == MyGadget->Activey) ? FALSE : TRUE ) : FALSE) : TRUE,
											TAG_END);
				break;
			case GAD_CHECK:
				MyGadget->Ptr1.MyGadget = MyGadget;
				MyGadget->Ptr1.Number = 1;
				NewGadget.ng_UserData = &(MyGadget->Ptr1);
				NewGadget.ng_LeftEdge = Screen->WBorLeft + INTERWIDTH + width*LEFT;
				NewGadget.ng_Width = 26;
				NewGadget.ng_GadgetText = MyGadget->Title;
				MyGadget->Gadget1 = Gadget = CreateGadget(CHECKBOX_KIND,Gadget,&NewGadget,
											GTCB_Checked, MyGadget->Currentc,
											GA_Disabled, MyGadget->OwnCycle ?((MyGadget->OwnCycle->Currenty == MyGadget->Activey) ? FALSE : TRUE ) : FALSE,
											TAG_END);
				break;
			}
			height += Screen->Font->ta_YSize + 2;
		}
		height += INTERHEIGHT;
		NewGadget.ng_TopEdge = height;
		NewGadget.ng_UserData = NULL;
		NewGadget.ng_LeftEdge = Screen->WBorLeft + INTERWIDTH;
		NewGadget.ng_Width = width * (LEFT+RIGHT);
		NewGadget.ng_GadgetText = "Perform";
		Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
								TAG_END);
		height += Screen->Font->ta_YSize + 2;
	}
	height += Screen->WBorBottom + INTERHEIGHT;
	return (BOOL)Gadget;
}

/* Shows ASL file requester for a file
 * name	: current file name
 * Prompt: Title
 * flags	: e.g. for save flag
 * Returns: TRUE if file selected, name is TempFileName
 */
BOOL
GetAFile(UBYTE *name,char *Prompt,ULONG flags) {
	// Split of directory name
	strncpy(TempFileName,name,(UBYTE *)PathPart(name) - (UBYTE *)name);
	TempFileName[(UBYTE *)PathPart(name) - (UBYTE *)name] = 0;
	// Show requesters
	InitRequester(&Requestx);
	SetPointer(Window, BusyPointerData, 16, 16, -6, 0);
	if (Request(&Requestx,Window)) {
		if (AslRequestTags((APTR) filereq,
								ASL_Hail,(Tag) Prompt,
								ASL_FuncFlags,flags,
								ASL_Dir, (Tag) TempFileName,
								ASL_File,(Tag) FilePart(name),
								ASL_Window, Window,
								TAG_DONE)) {
			// rejoin name
			strncpy(TempFileName,filereq->rf_Dir,256);
			AddPart(TempFileName,filereq->rf_File,256);
			ClearPointer(Window);
			EndRequest(&Requestx,Window);
			return TRUE;
		}
		else {
			ClearPointer(Window);
			EndRequest(&Requestx,Window);
			return FALSE;
		}
	}
	else {
		return FALSE;
	}
}
