/*
** 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

#define NO_RECORDPOINTER

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

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

/* EasyRexx IDs begins at 1 */
#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  result       =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;
        result=RC_ERROR;
        break;
    }
    ReplyARexxMsg(c, ER_ReturnCode,   result,
                     (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");

  /* We only check the context here because this example doesn't do
  ** anything else.  You should always continue without the port and
  ** just discard the ARexx stuff.
  */
  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);
    }
  }
  if(EasyRexxBase)
  {
    FreeARexxContext(context);
    CloseLibrary(EasyRexxBase);
  }
}

#endif
