
De command interface
""""""""""""""""""""
De  ARexx  command  interface  is een public message (bericht) port.  ARexx
compatible  applicaties moeten deze message port hebben.  ARexx programma's
sturen  commando's  door  een opdracht string te plaatsen in een message en
die  message  te sturen naar de message port van een applicatie.  Het ARexx
programma  loopt  niet  verder  tot  de  ontvanger  van de message hem weer
terugstuurt.

Het adres van de ontvanger
""""""""""""""""""""""""""
ARexx onderhoudt 2 onvoorwaardelijke ontvanger (host) adressen, een huidige
en  een  vorige  waarde,  als  een  deel  van  de  opslag  omgeving van het
programma.   Deze  waardes  kunnen  altijd  veranderd worden met de ADDRESS
instructie  (of  met  zijn  synoniem, SHELL).  Het huidige host adres wordt
bekeken  met  de  ingebouwde ADDRESS functie.  De waarde die u krijgt als u
geen  argument  meegeeft is de waarde die u krijgt als u de string REXX zou
geven.   Dit  kan  makkelijk  worden  veranderd  door  een programma aan te
roepen.

Een speciaal host adres wordt herkend.  De string COMMAND geeft aan dat het
commando  rechtstreeks  naar  DOS  moet worden verstuurd.  Alle andere host
adressen  geven  een message port aan.  Een poging om een commando naar een
niet bestaande message port te sturen resulteert in de foutmelding :  "Host
enviroment not found".

Programma  9 laat zien hoe de AmigaDOS editor ED en ARexx met elkaar kunnen
communiceren.   Het  programma kijkt of ED aanwezig is, bepaalt de naam van
de message port en zet wat stem variabelen op.

    programma 9. ED-status.rexx

/* drukt de status van ED af. ED moet lopen voordat dit programma wordt
   gestart. ED ports heten 'Ed', 'Ed_1', 'Ed_2', enz. */
DEFAULT_ED = "Ed" /* let op hoofdletters */
/* procedure als ED niet loopt */
DO WHILE ~ SHOW('P',DEFAULT_ED) /* zoek naar port */
SAY "Kan port niet vinden :" DEFAULT_ED
SAY "Beschikbare ports :"
SAY SHOW ('P') '0a'X
SAY "Geef andere naam voor port of QUIT om te stoppen"
/* laat gebruiker andere port kiezen als dit programma hem niet kan vinden */
DEFAULT_ED = READLN(stdout)
IF STRIP(UPPER(DEFAULT_ED)) = 'QUIT' then exit 10
END
SAY "ED port in gebruik" DEFAULT_ED
ADDRESS VALUE DEFAULT_ED
STEM.0  = 15           /* aantal ED ARexx variabelen */
STEM.1  = 'LEFT'
STEM.2  = 'RIGHT'
STEM.3  = 'TABSTOP'
STEM.4  = 'LMAX'
STEM.5  = 'WIDTH'
STEM.6  = 'X'
STEM.7  = 'Y'
STEM.8  = 'BASE'
STEM.9  = 'EXTEND'
STEM.10 = 'FORCECASE'
STEM.11 = 'LINE'
STEM.12 = 'FILENAME'
STEM.13 = 'CURRENT'
STEM.14 = 'LASTCMD'
STEM.15 = 'SEARCH'
/* vraag ED om waardes in stem variabele 'STEM.' te zetten */
'RV' '/STEM/' /* RV is een ED commando om informatie van ED naar ARexx te
sturen */
DO i = 1 to STEM.0
ED_VAR = STEM.i
SAY STEM.i "=" STEM.ED_VAR
END

Het maken van een macro
"""""""""""""""""""""""
ARexx  kan  worden  gebruikt  om  macros  te  maken  voor  ARexx compatible
applicaties.

De  verwerking  van  de  ontvangen commandos's is geheel afhankelijk van de
applicatie  die  de  commando's  ontvangt.   In het simpelste geval zal een
applicatie  commando's kennen die ook door een gebruiker rechtstreeks in te
geven  zijn.   Andere  commando's  zullen alleen worden geaccepteerd als ze
door  een macro gestuurd worden.  Een gebruiker van een programma zal bijv.
nooit  een  menu  operatie  proberen te simuleren.  Programma 10 kan worden
aangeroepen door ED om twee tekens te verwisselen.

    programma 10. Verwissel.rexx
/*  bij string '123' als de cursor op de 3 staat, converteert dit programma
de string naar '213' */

HOST = ADDRESS()          /* welke Ed heeft ons aangeroepen ? */
ADDRESS VALUE HOST        /* . . . en communiceer met die Ed */
'rv' '/CURR/' /* laat Ed informatie in stem CURR zetten */

/* we hebben 2 stukjes info nodig */
currpos = CURR.X          /* positie van cursor op de regel */
currlin = CURR.CURRENT    /* regelnr waar de cursor is */

if (currpos >2)
THEN currpos = currpos - 1
ELSE DO
'sm /Cursor moet op positie 2 of verder naar rechts zijn/'
EXIT 10
END

DROP CURR. /* stem variabele CURR niet meer nodig */
'd' /* zeg Ed dat hij de actuele regel moet verwijderen */
currlin = swapch(currpos , currlin) /* verwissel 2 tekens */
'i /'||currlin||'/    /* voeg veranderde regel toe */
DO i = 1 to currpos   /* zet cursor weer bij het begin */
    'cr'              /* Ed's cursor naar rechts commando */
    END
EXIT                  /* klaar */

/* functie om 2 tekens te verwisselen */
swapch: procedure
PARSE ARG cpos,clin
    chl = substr (clin,cpos,1)   /* neem teken */
    clin = delstr (clin,cpos,1)  /* verwijder hem uit de string */
    clin = insert (chl,clin,cpos-2,1)
    RETURN clin

Om  dit  voorbeeld  in Ed te gebruiken moet u op de escape toets drukken en
tikken :

RX "verwissel.rexx"

Terugkeer waardes (return codes)
""""""""""""""""""""""""""""""""
Na dat een applicatie klaar is met een commando, geeft de host een antwoord
terug  met  een return code om de status van het commando aan te geven.  De
documentatie  van een host applicatie zal u vertellen welke return codes er
verkregen  kunnen  worden.  Dmv return codes kunt u bepalen of een commando
succesvol is uitgevoerd.

Deze  returncode  wordt  in  de speciale ARexx variabele RC gezet zodat hij
bekeken  kan  worden  door de macro.  De waarde 0 betekent dat het commando
succesvol is uitgevoerd.  Een return code die hoger is dan 0 geeft een fout
aan.  Hoe hoger de return code hoe erger de fout.


Commando's naar de shell
""""""""""""""""""""""""
Hoewel  ARexx het beste werkt met programma's die een ARexx port hebben, is
het  ook  mogelijk  om  programma's  die  alleen in de Shell draaien aan te
sturen.    U  kunt  bijvoorbeeld  een  script  file  (tekst  file  met  DOS
commando's)  op  de  RAM  Disk  maken,  en dan een Shell op starten die dat
script uitvoert.

   programma 11. Shell.rexx
/* start een nieuwe shell */
ADDRESS command
conwindow = "CON:0/0/640/100/Niewe/Close"

/* maak command file */
CALL OPEN out, "ram:temp",write
CALL WRITELN out, 'echo "Dit is een test"'
CALL CLOSE out

/* open nieuwe shell window */
'newshell' conwindow "ram:temp"
EXIT
