ClassAct/Examples/ARexx/ARexxExample.c

293 lines
6.2 KiB
C

#include <dos/dos.h>
#include <dos/datetime.h>
#include <libraries/gadtools.h>
#include <clib/alib_protos.h>
#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/dos.h>
#include <proto/utility.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <classact.h>
#include <classact_macros.h>
#ifdef _DCC
#define SAVEDS __geta4
#define ASM
#define REG_A0 __A0
#define REG_A1 __A1
#else
#define SAVEDS __saveds
#define ASM __asm
#define REG_A0 register __a0
#define REG_A1 register __a1
#endif
#ifdef _DCC
extern __stkargs ULONG HookEntry();
#else
extern __stdargs ULONG HookEntry();
#endif
/* Gadget IDs.
*/
#define GAD_QUIT 1
/* ARexx command IDs.
*/
enum { REXX_NAME, REXX_VERSION, REXX_AUTHOR, REXX_SEND, REXX_DATE };
/* Protos for the reply hook and ARexx command functions.
*/
VOID SAVEDS reply_callback(struct Hook *, Object *, struct RexxMsg *);
VOID ASM rexx_Name(REG_A0 struct ARexxCmd *, REG_A1 struct RexxMsg *);
VOID ASM rexx_Version(REG_A0 struct ARexxCmd *, REG_A1 struct RexxMsg *);
VOID ASM rexx_Author(REG_A0 struct ARexxCmd *, REG_A1 struct RexxMsg *);
VOID ASM rexx_Send(REG_A0 struct ARexxCmd *, REG_A1 struct RexxMsg *);
VOID ASM rexx_Date(REG_A0 struct ARexxCmd *, REG_A1 struct RexxMsg *);
/* Buffer for the system date.
*/
UBYTE systemDate[32];
/* Our reply hook function.
*/
struct Hook reply_hook;
/* The following commands are valid for this demo.
*/
struct ARexxCmd Commands[] =
{
{ "NAME", REXX_NAME, rexx_Name, NULL, NULL, },
{ "VERSION", REXX_VERSION, rexx_Version, NULL, NULL, },
{ "AUTHOR", REXX_AUTHOR, rexx_Author, NULL, NULL, },
{ "SEND", REXX_SEND, rexx_Send, "TEXT/F", NULL, },
{ "DATE", REXX_DATE, rexx_Date, "SYSTEM/S", NULL, },
{ NULL, NULL, NULL, NULL, NULL, }
};
/* Starting point.
*/
int main(int argc, char *argv[])
{
Object *arexx_obj;
if (!ButtonBase) return(20);
/* Create host object.
*/
if (arexx_obj = ARexxObject,
AREXX_HostName, "AREXXDEMO",
AREXX_Commands, Commands,
AREXX_NoSlot, TRUE,
AREXX_ReplyHook, &reply_hook,
End)
{
Object *win_obj;
/* Create the window object.
*/
if (win_obj = WindowObject,
WA_Title, "ClassAct arexx.class Demo",
WA_DragBar, TRUE,
WA_CloseGadget, TRUE,
WA_DepthGadget, TRUE,
WINDOW_ParentGroup, LayoutObject,
LAYOUT_AddChild, ButtonObject,
GA_Text, "_Quit",
GA_ID, GAD_QUIT,
GA_RelVerify, TRUE,
ButtonEnd,
LayoutEnd,
EndWindow)
{
struct Window *window;
/* try to open the window.
*/
if (window = (struct Window *)CA_OpenWindow(win_obj))
{
ULONG wnsig = 0, rxsig = 0, signal, result, Code;
BOOL running = TRUE;
/* Setup the reply callback hook.
*/
reply_hook.h_Entry = HookEntry;
reply_hook.h_SubEntry = reply_callback;
reply_hook.h_Data = NULL;
/* Try to start the macro "Demo.rexx". Note that the
* current directory and REXX: will be searched for this
* macro. Our reply hook will get the results of our
* efforts to start this macro. To be totally robust, we
* should have also passed pointers for the various result
* variables.
*/
DoMethod(arexx_obj, AM_EXECUTE, "Demo.rexx", NULL, NULL, NULL, NULL, NULL);
/* Obtain wait masks.
*/
GetAttr(WINDOW_SigMask, win_obj, &wnsig);
GetAttr(AREXX_SigMask, arexx_obj, &rxsig);
/* Event loop...
*/
do
{
signal = Wait(wnsig | rxsig | SIGBREAKF_CTRL_C);
/* ARexx event?
*/
if (signal & rxsig)
CA_HandleRexx(arexx_obj);
/* Window event?
*/
if (signal & wnsig)
{
while ((result = CA_HandleInput(win_obj, &Code)) != WMHI_LASTMSG)
{
switch (result & WMHI_CLASSMASK)
{
case WMHI_CLOSEWINDOW:
running = FALSE;
break;
case WMHI_GADGETUP:
switch(result & WMHI_GADGETMASK)
{
case GAD_QUIT:
running = FALSE;
break;
}
break;
default:
break;
}
}
}
if (signal & SIGBREAKF_CTRL_C)
{
running = FALSE;
}
}
while (running);
}
else
puts ("Could not open the window");
DisposeObject(win_obj);
}
else
puts("Could not create the window object");
DisposeObject(arexx_obj);
}
else
puts("Could not create the ARexx host.");
return(0);
}
#ifdef _DCC
int wbmain(struct WBStartup *wbs)
{
return(main(0, NULL));
}
#endif
/* Note the use of SAVEDS, it is required for the callback
* ARexx command functions if access the global data such as
* systemData[] made in the callback.
*/
/* This function gets called whenever we get an ARexx reply. In this example,
* we will see a reply come back from the REXX server when it has finished
* attempting to start the Demo.rexx macro.
*/
VOID SAVEDS reply_callback(struct Hook *hook, Object *o, struct RexxMsg *rxm)
{
Printf("Args[0]: %s\nResult1: %ld Result2: %ld\n",
rxm->rm_Args[0], rxm->rm_Result1, rxm->rm_Result2);
}
/* NAME
*/
VOID SAVEDS ASM rexx_Name(REG_A0 struct ARexxCmd *ac, REG_A1 struct RexxMsg *rxm)
{
/* return the program name.
*/
ac->ac_Result = "ARexxTest";
}
/* VERSION
*/
VOID SAVEDS ASM rexx_Version(REG_A0 struct ARexxCmd *ac, REG_A1 struct RexxMsg *rxm)
{
/* return the program version.
*/
ac->ac_Result = "1.0";
}
/* AUTHOR
*/
VOID SAVEDS ASM rexx_Author(REG_A0 struct ARexxCmd *ac, REG_A1 struct RexxMsg *rxm)
{
/* return the authors name.
*/
ac->ac_Result = "Phantom Development LLC";
}
/* SEND
*/
VOID SAVEDS ASM rexx_Send(REG_A0 struct ARexxCmd *ac, REG_A1 struct RexxMsg *rxm)
{
/* Print some text
*/
if (ac->ac_ArgList[0])
Printf("%s\n", (STRPTR)ac->ac_ArgList[0]);
}
/* DATE
*/
VOID SAVEDS ASM rexx_Date(REG_A0 struct ARexxCmd *ac, REG_A1 struct RexxMsg *rxm)
{
struct DateTime dt;
/* SYSTEM switch specified?
*/
if (!ac->ac_ArgList[0])
{
/* return the compilation date.
*/
ac->ac_Result = "11-10-95";
}
else
{
/* compute system date and store in systemDate buffer
*/
DateStamp((struct DateStamp *)&dt);
dt.dat_Format = FORMAT_USA;
dt.dat_Flags = 0;
dt.dat_StrDay = NULL;
dt.dat_StrDate = systemDate;
dt.dat_StrTime = NULL;
DateToStr(&dt);
/* return system date
*/
ac->ac_Result = systemDate;
}
}