/*
 * Source generated with ARexxBox 1.13 (Dec  4 1993)
 * which is Copyright (c) 1992,1993 Michael Balzer
 */

#ifndef _md_rexx_H
#define _md_rexx_H

#include <string.h>

#define RXIF_INIT   1
#define RXIF_ACTION 2
#define RXIF_FREE   3

#define ARB_CF_ENABLED     (1L << 0)

#define ARB_HF_CMDSHELL    (1L << 0)
#define ARB_HF_USRMSGPORT  (1L << 1)
#define ARB_HF_USRMEMPOOL  (1L << 2)

struct RexxHost
{
	struct MsgPort *port;
	char portname[ 80 ];
	long replies;
	struct RDArgs *rdargs;
	long flags;
	APTR userdata;
	
	void *mempool;
	struct SignalSemaphore *poolsem;
};

struct rxs_command
{
	char *command, *args, *results;
	long resindex;
	void (*function)( struct RexxHost *, void **, long, struct RexxMsg * );
	long flags;
};

struct arb_p_link
{
	char	*str;
	int		dst;
};

struct arb_p_state
{
	int		cmd;
	struct arb_p_link *pa;
};

#ifndef NO_GLOBALS
extern char RexxPortBaseName[80];
extern struct rxs_command rxs_commandlist[];
extern struct arb_p_state arb_p_state[];
extern int command_cnt;
extern char *rexx_extension;
#endif

void ReplyRexxCommand( struct RexxMsg *rxmsg, long prim, long sec, char *res );
void FreeRexxCommand( struct RexxMsg *rxmsg );
struct RexxMsg *CreateRexxCommand( struct RexxHost *host, char *buff, BPTR fh );
struct RexxMsg *CommandToRexx( struct RexxHost *host, struct RexxMsg *rexx_command_message );
struct RexxMsg *SendRexxCommand( struct RexxHost *host, char *buff, BPTR fh );

void CloseDownARexxHost( struct RexxHost *host );
struct RexxHost *SetupARexxHost( char *basename, struct MsgPort *usrport,
	void *usrmempool, struct SignalSemaphore *usrmempoolsemaphore );
struct rxs_command *FindRXCommand( char *com );
char *ExpandRXCommand( struct RexxHost *host, char *command );
char *StrDup( struct RexxHost *host, char *s );
void ARexxDispatch( struct RexxHost *host );
void *ARBAlloc( struct RexxHost *host, size_t size );
void ARBFree( struct RexxHost *host, void *start );

void DoShellCommand( struct RexxHost *host, char *comline, BPTR fhout );
void CommandShell( struct RexxHost *host, BPTR fhin, BPTR fhout, char *prompt );

/* rxd-Strukturen dürfen nur AM ENDE um lokale Variablen erweitert werden! */

struct rxd_choose
{
	long rc, rc2;
	struct {
		char *var, *stem;
		long off;
		long toggle;
		long allon;
		long alloff;
		long test;
		long enter;
	} arg;
	struct {
		long *rc;
	} res;
};

void rx_choose( struct RexxHost *, struct rxd_choose **, long, struct RexxMsg * );

struct rxd_crunch
{
	long rc, rc2;
};

void rx_crunch( struct RexxHost *, struct rxd_crunch **, long, struct RexxMsg * );

struct rxd_editor
{
	long rc, rc2;
	struct {
		char *var, *stem;
		char *file;
	} arg;
	struct {
		long *rc;
	} res;
};

void rx_editor( struct RexxHost *, struct rxd_editor **, long, struct RexxMsg * );

struct rxd_extractcurrentmail
{
	long rc, rc2;
	struct {
		char *var, *stem;
		char *file;
		long header;
		long comment;
	} arg;
	struct {
		long *rc;
	} res;
};

void rx_extractcurrentmail( struct RexxHost *, struct rxd_extractcurrentmail **, long, struct RexxMsg * );

struct rxd_getcurrentboard
{
	long rc, rc2;
	struct {
		char *var, *stem;
	} arg;
	struct {
		char *name;
		long *mails;
		long *newmails;
		long *unreadmails;
		long *holddays;
		long *nodelete;
		long *subpm;
		long *selected;
		long *updatetime;
	} res;
};

void rx_getcurrentboard( struct RexxHost *, struct rxd_getcurrentboard **, long, struct RexxMsg * );

struct rxd_getcurrentmail
{
	long rc, rc2;
	struct {
		char *var, *stem;
	} arg;
	struct {
		char *from;
		char *fromreal;
		char *subject;
		long *midhash;
		long *refhash;
		long *length;
		long *new;
		long *read;
		long *hold;
		long *del;
		long *bin;
		long *show;
		long *selected;
		long *sendtime;
		long *incometime;
		long *rx1;
		long *rx2;
	} res;
};

void rx_getcurrentmail( struct RexxHost *, struct rxd_getcurrentmail **, long, struct RexxMsg * );

struct rxd_getcurrentmailheader
{
	long rc, rc2;
	struct {
		char *var, *stem;
		char *header;
		long *index;
	} arg;
	struct {
		char *data;
	} res;
};

void rx_getcurrentmailheader( struct RexxHost *, struct rxd_getcurrentmailheader **, long, struct RexxMsg * );

struct rxd_getmdpubscreenname
{
	long rc, rc2;
	struct {
		char *var, *stem;
	} arg;
	struct {
		char *pubscreenname;
	} res;
};

void rx_getmdpubscreenname( struct RexxHost *, struct rxd_getmdpubscreenname **, long, struct RexxMsg * );

struct rxd_getmode
{
	long rc, rc2;
	struct {
		char *var, *stem;
	} arg;
	struct {
		long *mode;
	} res;
};

void rx_getmode( struct RexxHost *, struct rxd_getmode **, long, struct RexxMsg * );

struct rxd_getpos
{
	long rc, rc2;
	struct {
		char *var, *stem;
	} arg;
	struct {
		long *rc;
	} res;
};

void rx_getpos( struct RexxHost *, struct rxd_getpos **, long, struct RexxMsg * );

struct rxd_getprefs
{
	long rc, rc2;
	struct {
		char *var, *stem;
	} arg;
	struct {
		char *username;
		char *userrealname;
		char *pointname;
		char *servername;
		char *serverdomain;
	} res;
};

void rx_getprefs( struct RexxHost *, struct rxd_getprefs **, long, struct RexxMsg * );

struct rxd_gotoboard
{
	long rc, rc2;
	struct {
		char *name;
	} arg;
};

void rx_gotoboard( struct RexxHost *, struct rxd_gotoboard **, long, struct RexxMsg * );

struct rxd_help
{
	long rc, rc2;
	struct {
		char *var, *stem;
		char *command;
		long prompt;
	} arg;
	struct {
		char *commanddesc;
		char **commandlist;
	} res;
};

void rx_help( struct RexxHost *, struct rxd_help **, long, struct RexxMsg * );

struct rxd_mdversion
{
	long rc, rc2;
	struct {
		char *var, *stem;
	} arg;
	struct {
		char *version;
	} res;
};

void rx_mdversion( struct RexxHost *, struct rxd_mdversion **, long, struct RexxMsg * );

struct rxd_netcall
{
	long rc, rc2;
	struct {
		char *var, *stem;
	} arg;
	struct {
		long *rc;
	} res;
};

void rx_netcall( struct RexxHost *, struct rxd_netcall **, long, struct RexxMsg * );

struct rxd_norequest
{
	long rc, rc2;
	struct {
		long off;
	} arg;
};

void rx_norequest( struct RexxHost *, struct rxd_norequest **, long, struct RexxMsg * );

struct rxd_quit
{
	long rc, rc2;
};

void rx_quit( struct RexxHost *, struct rxd_quit **, long, struct RexxMsg * );

struct rxd_reorg
{
	long rc, rc2;
	struct {
		long merge;
	} arg;
};

void rx_reorg( struct RexxHost *, struct rxd_reorg **, long, struct RexxMsg * );

struct rxd_request
{
	long rc, rc2;
	struct {
		char *var, *stem;
		char *text;
		char *gadgets;
	} arg;
	struct {
		long *rc;
	} res;
};

void rx_request( struct RexxHost *, struct rxd_request **, long, struct RexxMsg * );

struct rxd_rx
{
	long rc, rc2;
	struct {
		char *var, *stem;
		long console;
		long async;
		char *command;
	} arg;
	struct {
		long *rc;
		char *result;
	} res;
};

void rx_rx( struct RexxHost *, struct rxd_rx **, long, struct RexxMsg * );

struct rxd_sendmail
{
	long rc, rc2;
	struct {
		char *var, *stem;
		char **to;
		char *bodyfile;
		char *commentfile;
		long bin;
		char *subject;
		char *shortcomment;
		char *referenceid;
		char *followup_to;
		long wait;
	} arg;
	struct {
		long *rc;
	} res;
};

void rx_sendmail( struct RexxHost *, struct rxd_sendmail **, long, struct RexxMsg * );

struct rxd_sendshortmail
{
	long rc, rc2;
	struct {
		char *to;
		char *text;
		char *referenceid;
		char *subject;
	} arg;
};

void rx_sendshortmail( struct RexxHost *, struct rxd_sendshortmail **, long, struct RexxMsg * );

struct rxd_setcurrentmailflags
{
	long rc, rc2;
	struct {
		long *new;
		long *read;
		long *hold;
		long *del;
		long *show;
		long *selected;
		long *rx1;
		long *rx2;
	} arg;
};

void rx_setcurrentmailflags( struct RexxHost *, struct rxd_setcurrentmailflags **, long, struct RexxMsg * );

struct rxd_setpos
{
	long rc, rc2;
	struct {
		char *var, *stem;
		long *gotopos;
		long up;
		long down;
	} arg;
	struct {
		long *rc;
	} res;
};

void rx_setpos( struct RexxHost *, struct rxd_setpos **, long, struct RexxMsg * );

#endif
