Anbindung an ein Programm

Im Hauptprogramm m�ssen nur noch wenige Schritte unternommen werden, um das ARexx–Interface in Gang zu bringen.

Es m�ssen die exec.library, dos.library und die rexxsyslib.library ge�ffnet werden. Die ersten beiden werden normalerweise schon vom Startup-Code des Compilers ge�ffnet, so da� nur die Rexx–Library von Hand ge�ffnet werden mu�.

Ein ARexx–Host wird mit SetupARexxHost() initialisiert. Optional kann man einen anderen Basisnamen f�r den MsgPort �bergeben. Dann mu� man nur noch in die normale Event-Wait–Behandlung die Abfrage des Portsignals und den Aufruf des Dispatchers einbauen, und schon l�uft die ARexx–Anbindung.

Einer CommandShell wird ein Eingabe–, ein Ausgabe–FileHandle (nicht notwendigerweise verschieden) und ein Prompt–String �bergeben, dann l�uft sie bis EOF. Es ist z.B.  auch m�glich, eine CommandShell (mit dos.library / CreateNewProc) als eigenen Proze� asynchron laufen zu lassen. Wenn kein Ausgabe-FileHandle (NULL) �bergeben wird, erfolgen keine Ausgaben.

Hier ein (minimales) Beispielprogramm:

#define HOSTSIG(host) (1L << host->port->mp_SigBit)

void main( int argc, char *argv[] )
{
    struct RexxHost *myhost;
    BPTR fh;

    /* Initialisieren */
    
    if( !(RexxSysBase = OpenLibrary( "rexxsyslib.library", 35 )) )
    {
        printf( "No RexxSysLib\n" );
        exit( 20 );
    }
    
    /* Host er�ffnen */
    
    if( !(myhost = SetupARexxHost(NULL)) )
    {
        printf( "No Host\n" );
        exit( 20 );
    }
    
    /* Erst eine CommandShell... */
    
    if( fh = Open( "CON:////CommandShell/AUTO", MODE_NEWFILE ) )
    {
        CommandShell( myhost, fh, fh, "test> " );
        Close( fh );
    }
    else
        printf( "No Console\n" );
    
    /* ...und dann 'richtiger' ARexx-Betrieb */
    
    printf( "Address me on Port %s!\n", myhost->portname );
    printf( "Cancel me with CTRL-C\n" );
    
    while( 1 )
    {
        long s = Wait( SIGBREAKF_CTRL_C | HOSTSIG(myhost) );
        
        if( s == SIGBREAKF_CTRL_C )
            break;
        else
            ARexxDispatch( myhost );
    }
    
    CloseDownARexxHost( myhost );
    CloseLibrary( RexxSysBase );
    exit( 0 );
}