/*
** rexxhost.library - ARexx host management support library
**
** Copyright © 1990-1992 by Olaf `Olsen' Barthel
**    All Rights Reserved
*/

#ifndef _REXXHOSTBASE_H
#define _REXXHOSTBASE_H 1

#ifndef REXX_RXSLIB_H
#include <rexx/rxslib.h>
#endif   /* !REXX_RXSLIB_H */

   /* Main library structure (note: RexxSysBase can be reused
    * by opening program).
    */
#ifdef REXXHOST
struct RexxHostBase
{
   struct Library  LibNode;
   struct RxsLib  *RexxSysBase;

   /* Everything below this point is considered PRIVATE and
    * subject to change without notice (even though there isn't
    * very much yet).
    */
};
#endif
   /* This is an extended MsgPort structure which includes
    * a special ID CreateRexxHost/DeleteRexxHost/SendRexxCommand
    * rely on.
    */

struct RexxHost
{
   /* Exec link. */

   struct MsgPort rh_Port;

   /* Never touch the tags below, hands off - this may change soon. */

   ULONG    rh_Private0;
   ULONG    rh_Private1[4];
};

   /* This macro can be used to turn the signal bit
    * contained in a RexxHost into a Wait-mask.
    * Note: Argument must be a pointer.
    */

#define HOSTMASK(Host) (1L << ((struct RexxHost *)Host) -> rh_Port . mp_SigBit)

   /* The library name. */

#define REXXHOSTNAME "rexxhost.library"

   /* Use this value rather than REXXHOSTVERSION to open
    * rexxhost.library.
    */

#define REXXHOSTMINIMUM 34L

   /* The compiler version differences require the
    * following preprocessor 'orgy'.
    */

#ifdef __NO_PROTOS
#undef __NO_PROTOS
#endif   /* __NO_PROTOS */

#ifdef AZTEC_C

   /* No version symbol? We'll redefine it. */

#ifndef __VERSION
#define __VERSION 360
#endif   /* __VERSION */

   /* Aztec 'C' 5.0 includes full prototype checking and
    * pragma support.
    */

#if __VERSION < 500
#define __NO_PROTOS  1
#define __NO_PRAGMAS 1
#endif   /* __VERSION */

#endif   /* AZTEC_C */

   /* Now for the prototype handling. */

#ifdef __NO_PROTOS
#define __ARGS(x) ()
#else
#define __ARGS(x) x
#endif   /* __NO_PROTOS */

   /* Prototypes for library functions. */

struct RexxHost * CreateRexxHost __ARGS((STRPTR));
VOID *         DeleteRexxHost __ARGS((struct RexxHost *));
LONG        SendRexxCommand __ARGS((struct RexxHost *,STRPTR,STRPTR,STRPTR));
VOID        FreeRexxCommand __ARGS((struct RexxMsg *));
VOID        ReplyRexxCommand __ARGS((struct RexxMsg *,LONG,LONG,STRPTR));
STRPTR         GetRexxCommand __ARGS((struct RexxMsg *));
STRPTR         GetRexxArg __ARGS((struct RexxMsg *));
LONG        GetRexxResult1 __ARGS((struct RexxMsg *));
LONG        GetRexxResult2 __ARGS((struct RexxMsg *));
STRPTR         GetToken __ARGS((STRPTR,LONG *,STRPTR,LONG));
LONG        GetStringValue __ARGS((STRPTR));
STRPTR         BuildValueString __ARGS((LONG,STRPTR));
LONG        RexxStrCmp __ARGS((UBYTE *,UBYTE *));
struct RexxMsg *  GetRexxMsg __ARGS((struct RexxHost *,LONG));
ULONG       SendRexxMsg __ARGS((STRPTR,STRPTR *,STRPTR,LONG));
VOID        GetRexxString __ARGS((STRPTR,STRPTR));
LONG        GetRexxClip __ARGS((char *Name,LONG WhichArg));

   /* The pragmas, both for Manx & Lattice. */
#ifdef REXXHOST
/* Remove these because we aren't using the library */
#ifndef __NO_PRAGMAS
#ifdef AZTEC_C
#pragma amicall(RexxHostBase, 0x1e, CreateRexxHost(a0))
#pragma amicall(RexxHostBase, 0x24, DeleteRexxHost(a0))
#pragma amicall(RexxHostBase, 0x2a, SendRexxCommand(a0,a1,a2,a3))
#pragma amicall(RexxHostBase, 0x30, FreeRexxCommand(a0))
#pragma amicall(RexxHostBase, 0x36, ReplyRexxCommand(a0,d0,d1,a1))
#pragma amicall(RexxHostBase, 0x3c, GetRexxCommand(a0))
#pragma amicall(RexxHostBase, 0x42, GetRexxArg(a0))
#pragma amicall(RexxHostBase, 0x48, GetRexxResult1(a0))
#pragma amicall(RexxHostBase, 0x4e, GetRexxResult2(a0))
#pragma amicall(RexxHostBase, 0x54, GetToken(a0,a1,a2,d0))
#pragma amicall(RexxHostBase, 0x5a, GetStringValue(a0))
#pragma amicall(RexxHostBase, 0x60, BuildValueString(d0,a0))
#pragma amicall(RexxHostBase, 0x66, RexxStrCmp(a0,a1))
#pragma amicall(RexxHostBase, 0x6c, GetRexxMsg(a0,d0))
#pragma amicall(RexxHostBase, 0x72, SendRexxMsg(a0,a1,a2,d0))
#pragma amicall(RexxHostBase, 0x78, GetRexxString(d0,d1))
#pragma amicall(RexxHostBase, 0x7e, GetRexxClip(a0,d0))
#else /* AZTEC_C */
#pragma libcall RexxHostBase CreateRexxHost 1e 801
#pragma libcall RexxHostBase DeleteRexxHost 24 801
#pragma libcall RexxHostBase SendRexxCommand 2a ba9804
#pragma libcall RexxHostBase FreeRexxCommand 30 801
#pragma libcall RexxHostBase ReplyRexxCommand 36 910804
#pragma libcall RexxHostBase GetRexxCommand 3c 801
#pragma libcall RexxHostBase GetRexxArg 42 801
#pragma libcall RexxHostBase GetRexxResult1 48 801
#pragma libcall RexxHostBase GetRexxResult2 4e 801
#pragma libcall RexxHostBase GetToken 54 a9804
#pragma libcall RexxHostBase GetStringValue 5a 801
#pragma libcall RexxHostBase BuildValueString 60 8002
#pragma libcall RexxHostBase RexxStrCmp 66 9802
#pragma libcall RexxHostBase GetRexxMsg 6c 802
#pragma libcall RexxHostBase SendRexxMsg 72 a9804 
#pragma libcall RexxHostBase GetRexxString 78 1002
#pragma libcall RexxHostBase GetRexxClip 7e 802
#endif   /* AZTEC_C */
#endif   /* __NO_PRAGMAS */
#endif
#endif   /* _REXXHOSTBASE_H */
