/*
** Source machine generated by the AREXX Interface Designer for EasyREXX
** which is (c) copyrighted 1995 to Ketil Hunn
** Set TAB=2 for best readability
**
*/

#ifndef AREXX_INTERFACE
#define AREXX_INTERFACE

#include <stdio.h>
#include <libraries/easyrexx.h>
struct Library *EasyRexxBase=NULL;

UBYTE helloworld[]="Hello World! :)", errormessage[]="Error: Because you asked for it ;)";


#define AREXX_CLEAR				1
#define AREXX_GETVAR			2
#define AREXX_HELP				3
#define AREXX_OPEN				4
#define AREXX_QUIT				5
#define AREXX_ROW					6
#define AREXX_SAVE				7
#define AREXX_TEXT				8
#define AREXX_RX					9
#define AREXX_CAUSEERROR	10


struct ARexxCommandTable commandTable[]=
{
	AREXX_CLEAR,	"CLEAR",	"FORCE/S",	NULL,
	AREXX_GETVAR,	"GETVAR",	"HELLOWORLD/S",	NULL,
	AREXX_HELP,	"HELP",	"AMIGAGUIDE/S,TOPIC/F",	NULL,
	AREXX_OPEN,	"OPEN",	"PROJECT/S,TEXT/S,NAME/F",	NULL,
	AREXX_QUIT,	"QUIT",	"",	NULL,
	AREXX_ROW,	"ROW",	"NUMBER/A/N",	NULL,
	AREXX_SAVE,	"SAVE",	"AS/S,NAME/F",	NULL,
	AREXX_TEXT,	"TEXT",	"TEXT/A/F",	NULL,
	AREXX_RX,		"RX",		"COMMAND/A/F",	NULL,
	AREXX_CAUSEERROR,	"CAUSEERROR",		"",	NULL,
	TABLE_END,
};


BYTE myHandleARexx(struct ARexxContext *c)
{
	BYTE done=FALSE;
	UBYTE *resultstring=NULL, *error=NULL;
	LONG result1=RC_OK;

	if(GetARexxMsg(c))
	{
		printf("Received: ");
		switch(c->id)
		{
			case AREXX_CLEAR:
				printf("CLEAR");
				if(ARG(c, 0))
					printf(" FORCE=on");
				break;
			case AREXX_GETVAR:
				printf("GETVAR");
				if(ARG(c, 0))
				{
					printf(" HELLOWORLD");
					resultstring=helloworld;
				}
				break;
			case AREXX_HELP:
				printf("HELP");
				if(ARG(c, 0))
					printf(" AMIGAGUIDE");
				if(ARG(c, 1))
					printf(" TOPIC=%s", ARGSTRING(c,1));
				break;
			case AREXX_OPEN:
				printf("OPEN");
				if(ARG(c, 1))
					printf(" TEXT");
				else
					printf(" PROJECT"); /* defaults to PROJECT */
				if(ARG(c, 2))
					printf(" '%s'", ARGSTRING(c,2));
				break;
			case AREXX_QUIT:
				printf("QUIT");
				done=TRUE;
				break;
			case AREXX_ROW:
				printf("ROW");
				if(ARG(c, 0))
					printf(" %ld", ARGNUMBER(c,0));
				break;
			case AREXX_SAVE:
				printf("SAVE");
				if(ARG(c, 0))
					printf(" AS");
				if(ARG(c, 1))
					printf(" '%s'", ARGSTRING(c,1));
				break;
			case AREXX_TEXT:
				printf("TEXT");
				if(ARG(c, 0))
					printf(" '%s'", ARGSTRING(c,0));
				break;
			case AREXX_RX:
				printf(	"RX '%s'\n"
								"* Sending command asynchronously: '%s' to the '%s' port",
								ARGSTRING(c,0),
								ARGSTRING(c,0),
								c->portname);
				SendARexxCommand(ARGSTRING(c,0),
													ER_Port,		c->port,
													ER_Context,	c,
													ER_Asynch,	TRUE,
													TAG_DONE);
				break;
			case AREXX_CAUSEERROR:
				printf("CAUSEERROR");
				error=errormessage;
				result1=RC_ERROR;
				break;
		}
		ReplyARexxMsg(c,
				ER_ReturnCode, 	result1,
				(error ? ER_ErrorMessage:TAG_IGNORE),	error,
				(resultstring ? ER_ResultString:TAG_IGNORE),	resultstring,
				TAG_DONE);
		printf("\n");
	}
	return done;
}

void main(void)
{
	BYTE done=FALSE;
	struct ARexxContext *context=NULL;

	if(EasyRexxBase=OpenLibrary(EASYREXXNAME, EASYREXXVERSION))
		context=AllocARexxContext(ER_CommandTable,	commandTable,
															ER_Author,				"Ketil Hunn",
															ER_Copyright,			"© 1995 Ketil Hunn",
															ER_Version,				"2",
															ER_Portname,			"EASYREXX_TEST",
															TAG_DONE);
	else
		printf("easyrexx.library not found\n");
	if(context)
	{
		ARexxCommandShell(context,
											WA_Title,					"AREXX Commandline Interface",
											WA_Left,					0,
											WA_Width,					320,
											WA_Height,				100,
											WA_DragBar,				TRUE,
											WA_DepthGadget,		TRUE,
											WA_SizeGadget,		TRUE,
											WA_CloseGadget,		TRUE,
											WA_MinWidth,			50,
											WA_MinHeight,			50,
											WA_MaxWidth,			~0,
											WA_MaxHeight,			~0,
											WA_SizeBBottom,		TRUE,
											TAG_DONE);

		while(done==FALSE)
		{	
			ULONG signals=Wait(ER_SIGNAL(context));
			ER_SETSIGNALS(context, signals);

			if(signals & ER_SIGNAL(context))
				done=myHandleARexx(context);

			/* Needed here because this program only handles an ARexxCommandShell */
			if(ER_ISSHELLOPEN(context)==FALSE)
				done=TRUE;
		}
	}
	if(EasyRexxBase)
	{
		FreeARexxContext(context);
		CloseLibrary(EasyRexxBase);
	}
}

#endif
