(**************************************************************************

     $RCSfile: Rexx.mod $
  Description: Interface to rexxsyslib.library

   Created by: fjc (Frank Copeland)
    $Revision: 1.2 $
      $Author: fjc $
        $Date: 1994/05/12 19:11:02 $

  Copyright © 1994, Frank Copeland.
  This file is part of the Oberon-A Library.
  See Oberon-A.doc for conditions of use and distribution.

  Log entries are at the end of the file.

***************************************************************************)

MODULE Rexx;

(* $P- allow non-portable code *)

IMPORT T := Types, E := Exec, SYS := SYSTEM;

TYPE

  NexxStrPtr * = CPOINTER TO NexxStr;
  NexxStr * = RECORD
    nsIvalue * : LONGINT;
    nsLength * : T.UWORD;
    nsFlags *  : T.BSET;
    nsHash *   : T.UBYTE;
    nsBuff *   : ARRAY 8 OF SHORTINT;
  END;

CONST

  nxAddLen * = 9;

  nsKeep     * = 0;
  nsString   * = 1;
  nsNotNum   * = 2;
  nsNumber   * = 3;
  nsBinary   * = 4;
  nsFloat    * = 5;
  nsExt      * = 6;
  nsSource   * = 7;

  nsIntNum   *   = { nsNumber, nsBinary, nsString };
  nsDPNum    *   = { nsNumber, nsFloat };
  nsAlpha    *   = { nsNotNum, nsString };
  nsOwned    *   = { nsSource, nsExt, nsKeep };
  KeepStr      * = { nsString, nsSource, nsNotNum };
  KeepNum      * = { nsString, nsSource, nsNumber, nsBinary };

TYPE

  RexxArgPtr * = CPOINTER TO RexxArg;
  RexxArg * = RECORD
    raSize *   : LONGINT;
    raLength * : T.UWORD;
    raFlags *  : T.BSET;
    raHash *   : T.UBYTE;
    raBuff *   : ARRAY 8 OF SHORTINT;
  END;

TYPE

  RexxMsgPtr * = CPOINTER TO RexxMsg;
  RexxMsg * = RECORD (E.Message)

    rmTaskBlock * : T.APTR;
    rmLibBase *  : T.APTR;
    rmAction *   : LONGINT;
    rmResult1 *  : LONGINT;
    rmResult2 *  : LONGINT;
    rmArgs *     : ARRAY 16 OF T.STRPTR;
    rmPassPort * : E.MsgPortPtr;
    rmCommAddr * : T.STRPTR;
    rmFileExt *  : T.STRPTR;
    rmStdin *    : LONGINT;
    rmStdout *   : LONGINT;
    rmavail *    : LONGINT;
  END;

CONST

  MaxRmArg  * = 15;

  rxComm    * = 01000000H;
  rxFunc    * = 02000000H;
  rxClose   * = 03000000H;
  rxQuery   * = 04000000H;
  rxAddFH   * = 07000000H;
  rxAddLib  * = 08000000H;
  rxRemLib  * = 09000000H;
  rxAddCon  * = 0A000000H;
  rxRemCon  * = 0B000000H;
  rxTcOpn   * = 0C000000H;
  rxTcCls   * = 0D000000H;

  rxNoIO    * = 16;
  rxResult  * = 17;
  rxString  * = 18;
  rxToken   * = 19;
  rxNonRet  * = 20;

  rxCodeMask   * = 0FF000000H;
  rxArgMask    * = 0000000FH;

TYPE

  RexxRsrcPtr * = CPOINTER TO RexxRsrc;
  RexxRsrc * = RECORD (E.Node)

    rrFunc * : INTEGER;
    rrBase * : T.APTR;
    rrSize * : LONGINT;
    rrArg1 * : LONGINT;
    rrArg2 * : LONGINT;
  END;

CONST

  rrtAny      * = 0;
  rrtLib      * = 1;
  rrtPort     * = 2;
  rrtFile     * = 3;
  rrtHost     * = 4;
  rrtClip     * = 5;

CONST

  GlobalSz  * = 200;

TYPE

  RexxTaskPtr * = CPOINTER TO RexxTask;
  RexxTask * = RECORD
    rtGlobal *   : ARRAY GlobalSz OF SHORTINT;
    rtMsgPort *  : E.MsgPort;
    rtFlags *    : T.BSET;
    rtSigBit *   : SHORTINT;

    rtClientID * : T.APTR;
    rtMsgPkt *   : T.APTR;
    rtTaskID *   : T.APTR;
    rtRexxPort * : T.APTR;

    rtErrTrap *  : T.APTR;
    rtStackPtr * : T.APTR;

    rtHeader1 *  : E.List;
    rtHeader2 *  : E.List;
    rtHeader3 *  : E.List;
    rtHeader4 *  : E.List;
    rtHeader5 *  : E.List;
  END;

CONST

  rtTrace   * = 0;
  rtHalt    * = 1;
  rtSusp    * = 2;
  rtTcUse   * = 3;
  rtWait    * = 6;
  rtClose   * = 7;

  memQuant  * = 16;
  memMask   * = 0FFFFFFF0H;

  memQuick  * = 0;
  memClear  * = 16;

TYPE

  SrcNodePtr * = CPOINTER TO SrcNode;
  SrcNode * = RECORD
    snSucc * : SrcNodePtr;
    snPred * : SrcNodePtr;
    snPtr *  : T.APTR;
    snSize * : LONGINT;
  END;

CONST

  rxBuffSz  * = 204;

TYPE

  IoBuffPtr * = CPOINTER TO IoBuff;
  IoBuff * = RECORD (RexxRsrc)

    iobRpt *  : T.APTR;
    iobRct *  : LONGINT;
    iobDFH *  : LONGINT;
    iobLock * : T.APTR;
    iobBct *  : LONGINT;
    iobArea * : ARRAY rxBuffSz OF SHORTINT;
  END;

CONST

  rxIoExist   * = -1;
  rxIoStrF    * = 0;
  rxIoRead    * = 1;
  rxIoWrite   * = 2;
  rxIoAppend  * = 3;

  rxIoBegin   * = -1;
  rxIoCurr    * = 0;
  rxIoEnd     * = 1;

TYPE

  RexxMsgPortPtr * = CPOINTER TO RexxMsgPort;
  RexxMsgPort * = RECORD (RexxRsrc)

    rmpPort *      : E.MsgPort;
    rmpReplyList * : E.List;
  END;

CONST

  dtDev    * = 0;
  dtDir    * = 1;
  dtVol    * = 2;

  actionStack * = 2002;
  actionQueue * = 2003;

CONST

  errcMsg  * = 0;
  err10001 * = errcMsg+1;
  err10002 * = errcMsg+2;
  err10003 * = errcMsg+3;
  err10004 * = errcMsg+4;
  err10005 * = errcMsg+5;
  err10006 * = errcMsg+6;
  err10007 * = errcMsg+7;
  err10008 * = errcMsg+8;
  err10009 * = errcMsg+9;

  err10010 * = errcMsg+10;
  err10011 * = errcMsg+11;
  err10012 * = errcMsg+12;
  err10013 * = errcMsg+13;
  err10014 * = errcMsg+14;
  err10015 * = errcMsg+15;
  err10016 * = errcMsg+16;
  err10017 * = errcMsg+17;
  err10018 * = errcMsg+18;
  err10019 * = errcMsg+19;

  err10020 * = errcMsg+20;
  err10021 * = errcMsg+21;
  err10022 * = errcMsg+22;
  err10023 * = errcMsg+23;
  err10024 * = errcMsg+24;
  err10025 * = errcMsg+25;
  err10026 * = errcMsg+26;
  err10027 * = errcMsg+27;
  err10028 * = errcMsg+28;
  err10029 * = errcMsg+29;

  err10030 * = errcMsg+30;
  err10031 * = errcMsg+31;
  err10032 * = errcMsg+32;
  err10033 * = errcMsg+33;
  err10034 * = errcMsg+34;
  err10035 * = errcMsg+35;
  err10036 * = errcMsg+36;
  err10037 * = errcMsg+37;
  err10038 * = errcMsg+38;
  err10039 * = errcMsg+39;

  err10040 * = errcMsg+40;
  err10041 * = errcMsg+41;
  err10042 * = errcMsg+42;
  err10043 * = errcMsg+43;
  err10044 * = errcMsg+44;
  err10045 * = errcMsg+45;
  err10046 * = errcMsg+46;
  err10047 * = errcMsg+47;
  err10048 * = errcMsg+48;

  rcOK     * = 0;
  rcWarn   * = 5;
  rcError  * = 10;
  rcFatal  * = 20;

CONST

  Name  *    = "rexxsyslib.library";
  rxsDir   * = "REXX";
  rxsTName * = "ARexx";

TYPE

  RxsLibPtr * = CPOINTER TO RxsLib;
  RxsLib * = RECORD (E.Library)

    rlFlags *      : T.BSET;
    rlShadow *     : T.BSET;
    rlSysBase *    : T.APTR;
    rlDOSBase *    : T.APTR;
    rlIeeeDPBase * : T.APTR;
    rlSegList *    : LONGINT;
    rlNIL *        : LONGINT;
    rlChunk *      : LONGINT;
    rlMaxNest *    : LONGINT;
    rlNULL *       : NexxStrPtr;
    rlFALSE *      : NexxStrPtr;
    rlTRUE *       : NexxStrPtr;
    rlREXX *       : NexxStrPtr;
    rlCOMMAND *    : NexxStrPtr;
    rlSTDIN *      : NexxStrPtr;
    rlSTDOUT *     : NexxStrPtr;
    rlSTDERR *     : NexxStrPtr;
    rlVersion *    : T.STRPTR;

    rlTaskName *   : T.STRPTR;
    rlTaskPri *    : LONGINT;
    rlTaskSeg *    : LONGINT;
    rlStackSize *  : LONGINT;
    rlRexxDir *    : T.STRPTR;
    rlCTABLE *     : T.STRPTR;
    rlNotice *     : T.STRPTR;

    rlRexxPort *   : E.MsgPort;
    rlReadLock *   : T.UWORD;
    rlTraceFH *    : LONGINT;
    rlTaskList *   : E.List;
    rlNumTask *    : INTEGER;
    rlLibList *    : E.List;
    rlNumLib *     : INTEGER;
    rlClipList *   : E.List;
    rlNumClip *    : INTEGER;
    rlMsgList *    : E.List;
    rlNumMsg *     : INTEGER;
    rlPgmList *    : E.List;
    rlNumPgm *     : INTEGER;

    rlTraceCnt *   : T.UWORD;
    rlavail *      : INTEGER;
  END;

CONST

  rlTrace * = rtTrace;
  rlHalt  * = rtHalt;
  rlSusp  * = rtSusp;
  rlStop  * = 6;
  rlClose * = 7;

  rlfMask    * = { rlTrace, rlHalt, rlSusp };

  rxsChunk   * = 1024;
  rxsNest    * = 32;
  rxsTPri    * = 0;
  rxsStack   * = 4096;

  ctSpace   * = 0;
  ctDigit   * = 1;
  ctAlpha   * = 2;
  ctRexxSym * = 3;
  ctRexxOpr * = 4;
  ctRexxSpc * = 5;
  ctUpper   * = 6;
  ctLower   * = 7;

(*-- Library Base variable --------------------------------------------*)

VAR

  Base *  : RxsLibPtr;
  cleanup : PROCEDURE (rc : LONGINT);

(*-- Library Functions ------------------------------------------------*)

LIBCALL (base : RxsLibPtr) CreateArgstring*
  ( string {8} : ARRAY OF CHAR;
    length {0} : T.ULONG )
  : T.STRPTR;
  -126;
LIBCALL (base : RxsLibPtr) DeleteArgstring*
  ( argstring {8} : ARRAY OF CHAR );
  -132;
LIBCALL (base : RxsLibPtr) LengthArgstring*
  ( argstring {8} : ARRAY OF CHAR )
  : T.ULONG;
  -138;
LIBCALL (base : RxsLibPtr) CreateRexxMsg*
  ( port      {8} : E.MsgPortPtr;
    extension {9} : T.STRPTR;
    host      {0} : T.STRPTR )
  : RexxMsgPtr;
  -144;
LIBCALL (base : RxsLibPtr) DeleteRexxMsg*
  ( packet {8} : RexxMsgPtr );
  -150;
LIBCALL (base : RxsLibPtr) ClearRexxMsg*
  ( msgptr {8} : RexxMsgPtr;
    count  {0} : T.ULONG );
  -156;
LIBCALL (base : RxsLibPtr) FillRexxMsg*
  ( msgptr {8} : RexxMsgPtr;
    count  {0} : T.ULONG;
    mask   {1} : T.WSET )
  : BOOLEAN;
  -162;
LIBCALL (base : RxsLibPtr) IsRexxMsg*
  ( msgptr {8} : RexxMsgPtr )
  : BOOLEAN;
  -168;

LIBCALL (base : RxsLibPtr) LockRexxBase*
  ( resource {0} : T.ULONG );
  -450;
LIBCALL (base : RxsLibPtr) UnlockRexxBase*
  ( resource {0} : T.ULONG );
  -456;

(*-- Library Base variable --------------------------------------------*)
(* $L- Address globals through A4 *)

(*-----------------------------------*)
PROCEDURE* CloseLib (rc : LONGINT);

BEGIN
  IF Base # NIL THEN E.Base.CloseLibrary (Base) END;
  IF cleanup # NIL THEN cleanup (rc) END
END CloseLib;

(*-----------------------------------*)
PROCEDURE OpenLib * ();

BEGIN
  IF Base = NIL THEN
    Base := E.Base.OpenLibrary (Name, E.libraryMinimum);
    IF Base = NIL THEN HALT (100) END;
    SYS.SETCLEANUP (CloseLib, cleanup)
  END;
END OpenLib;

BEGIN
  Base := NIL; cleanup := NIL
END Rexx.

(**************************************************************************

  $Log: Rexx.mod $
  Revision 1.2  1994/05/12  19:11:02  fjc
  - Prepared for release

  Revision 1.1  1994/01/15  20:49:58  fjc
  - Start of revision control

***************************************************************************)

 

(* Comments stripped by StripComments 1.0 *)
