/* A test program to demonstrate the direct variable interface to ARexx.
 * Opens a public port called "VarTest" and then waits for REXX messages.
 * The port stays open until a "CLOSE" command is received.
 * Usage:  run vartest
 * Then send commands from within ARexx by "address 'VarTest' command"
 */

#include "exec/types.h"

#include "rexx/storage.h"
#include "rexx/rxslib.h"

#include <stdio.h>

#define VALUE "A-OK"

struct RexxLib *RexxSysBase;

extern LONG  CheckRexxMsg(struct RexxMsg *);
extern LONG  GetRexxMsg(struct RexxMsg *,STRPTR,STRPTR *);
extern LONG  SetRexxMsg(struct RexxMsg *,STRPTR,STRPTR,LONG);

main(argc,argv)
int argc;
char **argv;
{
   struct MsgPort MyPort;
   struct RexxMsg *rmptr;
   LONG           test,error;
   STRPTR         value;

   RexxSysBase = OpenLibrary("rexxsyslib.library",(LONG) RXSVERS);
   if (RexxSysBase == 0) {
      printf("Bad News -- no REXX library\n");
      return(20L);
      }

   /* Initialize our message port   */
   InitPort(&MyPort,"VarTest");

   /* Make the port public          */
   AddPort(&MyPort);

   for (;;) {                          /* wait for messages             */
      Wait(1L<<MyPort.mp_SigBit);
      rmptr = (struct RexxMsg *) GetMsg(&MyPort);

      /* Show what we got           */
      printf("VarTest: received command %s\n",rmptr->rm_Args[0]);

      /* Make sure it's a valid context */
      if (CheckRexxMsg(rmptr)) {
         printf("VarTest: valid REXX context\n");

         if ((error = GetRexxVar(rmptr,"A.1",&value)) == 0)
            printf("VarTest: value of A.1 is %s\n",value);
         else printf("VarTest: error from get %ld\n",error);

         error = SetRexxVar(rmptr,"STATUS",VALUE,strlen(VALUE));
         if (error != 0) printf("VarTest: error from 7                                                                                    