/*
 *	File:					test.c
 *	Description:	Small program to show how easy EasyRexx.library makes
 *								the AREXX handling.  Show how to handle AREXX messages
 *								checking the ID in the commandTable.
 *
 *	(C) 1994-1995, Ketil Hunn
 *
 *	Set tab to 2 for best readability
 *
 */

#include <stdio.h>

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

#define	AREXX_CLEAR			1
#define	AREXX_OPEN			2
#define	AREXX_SAVEAS		3
#define	AREXX_HELP			4
#define	AREXX_TEXT			5
#define	AREXX_ROW				6
#define	AREXX_QUIT			7
#define	AREXX_VERSION		8
#define	AREXX_NAME			9

/* This application supports these AREXX commands */
struct ARexxCommandTable commandTable[]=
{
/*    ID          CMD       ARGUMENT TEMPLATE             USERDATA  */

	AREXX_CLEAR,		"CLEAR",		"FORCE/S",										NULL,
	AREXX_OPEN,			"OPEN",			"PROJECT/S,TEXT/S,NAME/F",		NULL,
	AREXX_SAVEAS,		"SAVEAS",		"NAME/K",											NULL,
	AREXX_HELP,			"HELP",			"AMIGAGUIDE/S,TOPIC/F",				NULL,
	AREXX_TEXT,			"TEXT",			"TEXT/A/F",										NULL,
	AREXX_ROW,			"ROW",			"ROWNUMBER/A/N",							NULL,
	AREXX_QUIT,			"QUIT",			NULL,													NULL,
	AREXX_VERSION,	"VERSION",	NULL,													NULL,
	AREXX_NAME,			"NAME",			NULL,													NULL,
	TABLE_END,
};


BYTE myHandleARexx(struct ARexxContext *c)
{
	LONG	result	=RC_OK;
	UBYTE *resultstring=NULL,
				myversion[]="EasyREXX.library demonstration";
	BYTE	done		=FALSE;
	ULONG resultint=0L;

	if(GetARexxMsg(c))
	{
		printf("Received: ");
		switch(c->id)
		{
			case AREXX_CLEAR:
				printf("CLEAR");
				break;
			case AREXX_OPEN:
				printf("OPEN");
				if(ARG(c, 1))
					printf(" TEXT");
				else
					printf(" PROJECT");
				if(ARG(c, 2))
					printf(" '%s'", ARGSTRING(c,2));
				break;
			case AREXX_SAVEAS:
				printf("SAVEAS '%s'", ARGSTRING(c,0));
				break;
			case AREXX_HELP:
				printf("HELP");
				if(ARG(c, 0))
					printf(" AMIGAGUIDE");
				if(ARG(c, 1))
					printf(" '%s'", ARGSTRING(c,1));
				break;
			case AREXX_TEXT:
				printf("TEXT '%s'", ARGSTRING(c,0));
				break;
			case AREXX_ROW:
				printf("ROW %ld", ARGNUMBER(c,0));
				break;
			case AREXX_QUIT:
				printf("QUIT");
				done=TRUE;
				break;
			case AREXX_VERSION:
				printf("VERSION");
				resultint=105L;
				break;
			case AREXX_NAME:
				printf("NAME");
				resultstring=myversion;
				break;
		}
		printf("\n");

		ReplyARexxMsg(c,
									ER_Result,				result,
									ER_ResultLong,		resultint,
									ER_ResultString,	resultstring,
									TAG_DONE);
	}
	return done;
}

void main(int argc, char **argv)
{
	if(EasyRexxBase=OpenLibrary(EASYREXXNAME, EASYREXXVERSION))
	{
		struct ARexxContext	*context;

		if(context=AllocARexxContext(	ER_Portname,			"EASYREXX_TEST",
																	ER_CommandTable,	commandTable,
																	TAG_DONE))
		{
			ULONG signal;
			BYTE done=FALSE;

			printf(	"Welcome to a small EasyRexx demonstration\n"
							"-----------------------------------------\n"
							"Open another shell and start the small\n"
							"AREXX script: rx test\n"
							"or doubleclick on the test.rexx icon.\n");
			while(!done)
			{
				signal=Wait(ER_SIGNAL(context));

				if(signal & ER_SIGNAL(context))
					done=myHandleARexx(context);
			}
			FreeARexxContext(context);
		}
		CloseLibrary(EasyRexxBase);
	}
}
