/*************************************************************************/
/* Autor      : RTA                                                      */
/* Computer   : Amiga                                                    */
/* Sprache    : Ansi C                                                   */
/* Compiler   : SAS C-Compiler Version 5.1a                              */
/* Dateiname  : arexx.c                                                  */
/* Projekt    : OnlineHelp                                               */
/* Erstellt am: 10 Nov 1991,19:5                                         */
/*************************************************************************/

#include "online.h"

/* Liste aller AREXX-Befehle */
static struct rexxCommandList
	{
	char *name;
	char *(*userdata)(char *args,int *ret);
	}
    rcl[] =
    {
	{ "docadd",rx_docadd},
	{ "docdel",rx_docdel},
	{ "doclist",rx_doclist},
	{ "docdelall",rx_docdelall},
	{ "search",rx_search},
	{ "openwin",rx_openwin},
	{ "closewin",rx_closewin},
	{ "makeindex",rx_makeindex},
	{ "ongad",rx_ongad},
	{ "offstatus",rx_offstatus},
	{ "ohquit",rx_quit},
	{ NULL,		NULL }
    };

/*************************************************************************/
/*           Wartet, bis alle AREXX-Kommandos beendet sind und           */
/*                     schließt dan den AREXX-Port                       */
/*************************************************************************/
void wait_rexx(void)
{
	struct RexxMsg *rexxmessage;

	if(rexx_port)
		{
		while(rexxmessage=(struct RexxMsg *)GetMsg(rexx_port))reply_rexx_command(rexxmessage,1,0,NULL);
		RemPort(rexx_port);
		DeletePort(rexx_port); rexx_port=NULL;
		}
}

/*************************************************************************/
/*                         Öffnet den AREXX-Port                         */
/*************************************************************************/
struct MsgPort *setup_rexx_port(void)
{
	struct MsgPort *the_port;

	Forbid();

	/* allocate the port */
	the_port = CreatePort(HOST_PORT_NAME,0L);

	Permit();

	return(the_port);
}

void free_rexx_command(struct RexxMsg *rexxmessage)
{
	/* delete the argument that we originally sent */
	DeleteArgstring(rexxmessage->rm_Args[0]);

	/* delete the extended message */
	DeleteRexxMsg(rexxmessage);

}

void reply_rexx_command(struct RexxMsg *rexxmessage,
                        long primary,
                        long secondary,
                        char *result)
{
   /* set an error code */
   if (primary == 0 && (rexxmessage->rm_Action & 1<<RXFB_RESULT)) {
      secondary = result ? (long) CreateArgstring(result,strlen(result))
                         : (long) NULL;
      }
   rexxmessage->rm_Result1 = primary;
   rexxmessage->rm_Result2 = secondary;
   ReplyMsg((struct Message *)rexxmessage);
}

void execute_command(struct RexxMsg *rexxmessage)
{
	long primary=0;
	struct rexxCommandList *tmprcl;
	char rexxstr[256];
	char *resultstr=NULL;
	int i;

	sscanf(rexxmessage->rm_Args[0],"%s",rexxstr);

	for(tmprcl=rcl;tmprcl->name;tmprcl++)
		{
		if(!stricmp(tmprcl->name,rexxstr))
			{
			rexxstr[0]='\0';

			if(strlen(rexxmessage->rm_Args[0])<=strlen(tmprcl->name)) i=0;
			else i=1; /* argument vorhanden */

			resultstr=tmprcl->userdata(rexxmessage->rm_Args[0]+strlen(tmprcl->name)+i,&primary);
			break;
			}
		}

	if(!tmprcl->name)	primary = RXERRORNOCMD ;
	reply_rexx_command(rexxmessage,primary,0,resultstr);
}