(* Source machine generated by the ARexx Interface Designer for EasyRexx
** which is (c) 1994, 1995 to Ketil Hunn
*)

(*#############*)
 MODULE TSTIDS;
(*#############*)
(*
   Mostly "auto-created".
*)

FROM   SYSTEM IMPORT ADDRESS, ADR;
IMPORT EasyRexx, InOut, LongInOut, TagsUtils;
IMPORT Libraries, RexxErrors, Tasks, Utility;

CONST helloworld = "Hello World! :)";
      errormessage = "Error: Because you asked for it ;)";

CONST AREXXCAUSEERROR=1;
      AREXXCLEAR=2;
      AREXXGETVAR=3;
      AREXXHELP=4;
      AREXXOPEN=5;
      AREXXQUIT=6;
      AREXXROW=7;
      AREXXRX=8;
      AREXXSAVE=9;
      AREXXTEXT=10;
      AREXXENDTABLE=11;

VAR commandTable :ARRAY[1..AREXXENDTABLE] OF EasyRexx.ARexxCommandTable;

TYPE  String0Pointer = POINTER TO ARRAY[0..133] OF CHAR;

(*-------------------------------------------------------*)
 PROCEDURE myHandleARexx(c:EasyRexx.ARexxContext):INTEGER;
(*-------------------------------------------------------*)

VAR done         :INTEGER;
    result,
    resultlong   :LONGINT;
    resultstring,
    error        :EasyRexx.CharPointer;
    taglist      :ARRAY[0..5] OF Utility.TagItem;

    liRes        :LONGINT;
    pn           :ARRAY[0..81] OF CHAR;
    sp           :String0Pointer;

BEGIN

  done         := 0;
  result       := RexxErrors.RCOk;
  resultstring := NIL;
  resultlong   := MAX(LONGINT);
  error        := NIL;

  WHILE CHAR(EasyRexx.GetARexxMsg(c)) # 0C DO
    CASE VAL(INTEGER, EasyRexx.Id(c)) OF
      AREXXCAUSEERROR:
         InOut.WriteString( "CAUSEERROR");
         error := ADR(errormessage);
         done := RexxErrors.RCError;
         InOut.WriteLn;
        |
      AREXXCLEAR:
         InOut.WriteString("CLEAR");
         IF EasyRexx.Arg(c, 0) # NIL THEN
            InOut.WriteString(" FORCE=on");
         END;
         InOut.WriteLn;
        |
      AREXXGETVAR:
         InOut.WriteString("GETVAR"); InOut.WriteLn;
         IF EasyRexx.Arg(c, 0) # NIL THEN
            InOut.WriteString(" HELLOWORLD"); InOut.WriteLn;
            InOut.WriteString(" string returned");
            resultstring := ADR(helloworld);
         END;
         InOut.WriteLn;
        |
      AREXXHELP:
         InOut.WriteString("HELP");
         IF EasyRexx.Arg(c, 0) # NIL THEN
            InOut.WriteString(" AMIGAGUIDE");
         END;
         IF EasyRexx.Arg(c, 1) # NIL THEN
            sp := String0Pointer(EasyRexx.ArgString(c,1));
            InOut.WriteString(" TOPIC="); InOut.WriteString(sp^);
         END;
         InOut.WriteLn;
        |
      AREXXOPEN:
         InOut.WriteString("OPEN");
         IF EasyRexx.Arg(c, 1) # NIL THEN
            InOut.WriteString(" TEXT");
         ELSE
            InOut.WriteString(" PROJECT");  (* defaults to PROJECT *)
         END;
         IF EasyRexx.Arg(c, 2) # NIL THEN
            sp := String0Pointer(EasyRexx.ArgString(c,2));
            InOut.WriteString(" '"); InOut.WriteString(sp^); InOut.Write("'");
         END;
         InOut.WriteLn;
        |
      AREXXQUIT:
         InOut.WriteString("QUIT");
        done:=1;
         InOut.WriteLn;
        |
      AREXXROW:
         InOut.WriteString("ROW");
         IF EasyRexx.Arg(c, 0) # NIL THEN
            InOut.Write(' '); LongInOut.WriteLongInt(EasyRexx.ArgNumber(c,0), 0);
         END;
         InOut.WriteLn;
        |
      AREXXRX:
         sp := String0Pointer(EasyRexx.ArgString(c,0));
         InOut.WriteString( "RX '"); InOut.WriteString(sp^); InOut.Write("'");
                         InOut.WriteLn;
         InOut.WriteString(" Sending command asynchronously: '");
InOut.WriteString(sp^);
                         EasyRexx.Portname(c, pn);
                         InOut.WriteString("' to the '"); InOut.WriteString(pn);
InOut.WriteString("' port");
                         InOut.WriteLn;

         TagsUtils.AsgTags3(taglist, EasyRexx.ERPort, ADDRESS(EasyRexx.Port(c)),
                                     EasyRexx.ERContext, ADDRESS(c),
                                     EasyRexx.ERAsynch, ORD(TRUE));

         liRes := EasyRexx.SendARexxCommandA(EasyRexx.ArgString(c,0), ADR(taglist));
         InOut.WriteLn;
        |
      AREXXSAVE:
         InOut.WriteString("SAVE");
         IF EasyRexx.Arg(c, 0) # NIL THEN
            InOut.WriteString(" AS");
         END;
         IF EasyRexx.Arg(c, 1) # NIL THEN
            sp := String0Pointer(EasyRexx.ArgString(c,1));
            InOut.WriteString(" '"); InOut.WriteString(sp^); InOut.Write("'");
         END;
         InOut.WriteLn;
        |
      AREXXTEXT:
         InOut.WriteString("TEXT");
         IF EasyRexx.Arg(c, 0) # NIL THEN
            sp := String0Pointer(EasyRexx.ArgString(c,0));
            InOut.WriteString(" '"); InOut.WriteString(sp^); InOut.Write("'");
         END;
         InOut.WriteLn;
        |
    END;
    TagsUtils.AsgTag(taglist, EasyRexx.ERReturnCode, result);
    IF error # NIL THEN
      TagsUtils.CatTag(taglist, EasyRexx.ERErrorMessage, ADDRESS(error));
    END;
    IF resultstring # NIL THEN
      TagsUtils.CatTag(taglist, EasyRexx.ERResultString, ADDRESS(resultstring));
    END;
    IF resultlong # MAX(LONGINT) THEN
      TagsUtils.CatTag(taglist, EasyRexx.ERResultLong, ADDRESS(resultlong));
    END;
    EasyRexx.ReplyARexxMsgA(c, ADR(taglist));
  END;
  RETURN done;
END myHandleARexx;

(*---------------------*)
 PROCEDURE InitCmdTable;
(*---------------------*)
BEGIN
  WITH commandTable[AREXXCAUSEERROR] DO
    id          := AREXXCAUSEERROR;
    command     := ADR("CAUSEERROR");
    cmdtemplate := ADR("");
    userdata    := NIL;
  END;
  WITH commandTable[AREXXCLEAR] DO
    id          := AREXXCLEAR;
    command     := ADR("CLEAR");
    cmdtemplate := ADR("FORCE/S");
    userdata    := NIL;
  END;
  WITH commandTable[AREXXGETVAR] DO
    id          := AREXXGETVAR;
    command     := ADR("GETVAR");
    cmdtemplate := ADR("HELLOWORLD/S");
    userdata    := NIL;
  END;
  WITH commandTable[AREXXHELP] DO
    id          := AREXXHELP;
    command     := ADR("HELP");
    cmdtemplate := ADR("AMIGAGUIDE/S,TOPIC/F");
    userdata    := NIL;
  END;
  WITH commandTable[AREXXOPEN] DO
    id          := AREXXOPEN;
    command     := ADR("OPEN");
    cmdtemplate := ADR("PROJECT/S,TEXT/S,NAME/F");
    userdata    := NIL;
  END;
  WITH commandTable[AREXXQUIT] DO
    id          := AREXXQUIT;
    command     := ADR("QUIT");
    cmdtemplate := ADR("");
    userdata    := NIL;
  END;
  WITH commandTable[AREXXROW] DO
    id          := AREXXROW;
    command     := ADR("ROW");
    cmdtemplate := ADR("NUMBER/A/N");
    userdata    := NIL;
  END;
  WITH commandTable[AREXXRX] DO
    id          := AREXXRX;
    command     := ADR("RX");
    cmdtemplate := ADR("COMMAND/A/F");
    userdata    := NIL;
  END;
  WITH commandTable[AREXXSAVE] DO
    id          := AREXXSAVE;
    command     := ADR("SAVE");
    cmdtemplate := ADR("AS/S,NAME/F");
    userdata    := NIL;
  END;
  WITH commandTable[AREXXTEXT] DO
    id          := AREXXTEXT;
    command     := ADR("TEXT");
    cmdtemplate := ADR("TEXT/A/F");
    userdata    := NIL;
  END;
  EasyRexx.TableEnd(commandTable[AREXXENDTABLE]);
END InitCmdTable;

(*---------------*)

VAR done    :INTEGER;
    context :EasyRexx.ARexxContext;
    taglist :ARRAY[0..5] OF Utility.TagItem;
    signals :Tasks.SignalSet;

(*---------------*)
 BEGIN (* program*)
(*---------------*)

  done    := 0;
  context := EasyRexx.NULLARexxContext;
  EasyRexx.EasyRexxBase := Libraries.OpenLibrary(ADR(EasyRexx.EasyRexxName),
EasyRexx.EasyRexxVersion);
  IF (EasyRexx.EasyRexxBase # NIL) THEN
    InitCmdTable;
    TagsUtils.AsgTags5(taglist, EasyRexx.ERCommandTable, ADR(commandTable),
                                EasyRexx.ERAuthor,       ADR("Ketil Hunn"),
                                EasyRexx.ERCopyright,    ADR("* 1995 Ketil Hunn"),
                                EasyRexx.ERVersion,      ADR("V2.0"),
                                EasyRexx.ERPortname,     ADR("EASYREXX_TEST"));
    context := EasyRexx.AllocARexxContextA(ADR(taglist));
  END;
  WHILE NOT ((done = 1) AND EasyRexx.ERSafeToQuit(context)) DO
    signals := Tasks.Wait(EasyRexx.ERSignals(context));
    EasyRexx.ERSetSignals(context, signals);
    IF (signals * EasyRexx.ERSignal(context) # Tasks.SignalSet{}) THEN
      done := myHandleARexx(context);
    END;
  END;
  IF EasyRexx.EasyRexxBase # NIL THEN
    EasyRexx.FreeARexxContext(context);
    Libraries.CloseLibrary(EasyRexx.EasyRexxBase^);
  END;
END TSTIDS.
