Die ARexx-Kommandoschnittstelle ist ein allgemein zugänglicher Message-Port. Zu ARexx kompatible Anwendungen müssen über diesen Message-Port verfügen. ARexx-Programme geben Kommandos aus, indem sie die Kommandozeichenfolge in ein Message-Paket stellen und dieses Paket an den Message-Port des Hosts (Gastprogramms) senden. Das Programm setzt die Operation aus, solange der Host die Kommandos verarbeitet. Wenn das Nachrichtenpaket zurückgemeldet wird, wird die Operation wieder aufgenommen.
ARexx verwaltet zwei implizite Host (Gastprogramm) - Adressen - einen aktuellen und einen vorhergegangenen Wert - als Bestandteil der Speicherumgebung des Programms. Diese Werte können über den Befehl ADDRESS jederzeit geändert werden (oder über das Synonym SHELL). Die aktuelle Host-Adresse kann mit Hilfe der integrierten Funktion ADDRESS() abgefragt werden. Die Standardzeichenfolge für die Host-Adresse ist REXX, diese kann jedoch bei Aufruf eines Programms neu gesetzt werden. Die meisten Host-Anwendungen liefern den Namen ihres allgemein zugänglichen Ports mit, wenn sie ein Makro-Programm aufrufen, so daß das Makro automatisch Kommandos zurück an den Host ausgeben kann.
Eine spezielle Host-Adresse wird erkannt. Die Zeichenfolge COMMAND gibt an, daß das Makro direkt an AmigaDOS ausgegeben werden sollte. Bei allen anderen Host-Adressen wird davon ausgegangen, daß sie sich auf einen öffentlichen Message-Port beziehen. Der Versuch, ein Kommando an einen nicht existenten Message-Port zu senden, führt zu einem Syntaxfehler ("Host-Umgebung nicht gefunden").
Programm 9 zeigt die Interaktion zwischen ARexx und dem AmigaDOS-Editor, ED. Das Programm stellt fest, ob ED läuft, bestimmt den Namen des Message-Ports und richtet einige Stammvariablen ein.
/*Gibt den Status von ED aus.
ED muß laufen, bevor dieses Programm gestartet wird. ED-Ports heißen `ED', `ED_1', `ED_2' usw.*/
DEFAULT_ED = "ED" /*Groß-/Kleinschreibung ist hier relevant*/
/*Prozedur für den Fall, daß ED nicht oder nur als Zweitaufruf (oder noch höher) läuft.*/
DO WHILE (Tilde) SHOW (`p',DEFAULT_ED) /*Port suchen*/
SAY "Nicht gefunden: Port mit Namen" DEFAULT_ED
SAY "Verfügbare Ports:"
SAY SHOW (`P') `0a'X
SAY "Anderen Port-Namen eingeben oder mit QUIT Programm verlassen"
/*Der Benutzer soll den Port wählen, wenn das Programm ihn nicht findet */
DEFAULT_ED = READLN (stdin)
IF STRIP (UPPER(DEFAULT_ED)) = `QUIT' then exit 10/*Benutzer kann Programm hierdurch verlassen*/
END
SAY "Benutzt wird ED-Port" DEFAULT_ED
/*Nun, da der Port gefunden ist, soll ARexx ihn adressieren.*/
ADDRESS VALUE DEFAULT_ED
/*Einige nützliche Stammvariablen einrichten*/
STEM.0 = 15 /*Anzahl ED-ARexx-Variablen*/
ATEM.1 = `LEFT' /*Linker Rand (SL)*/
STEM.2 = `Right' /*Rechter Rand (SR)*/
STEM3. = `TABSTOP' /*Tabulatoren (ST)*/
STEM.4 = `LMAX' /*Maximal anzeigbare Zeilen*/
STEM.5 = `WIDTH' /*Breite der Anzeige in Zeichen*/
STEM.6 = `X' /*Phys. X-Pos. am Bildschirm ab 1*/
STEM.7 = `Y' /*Phys. Y-Pos. am Bildschirm ab 1*/
STEM.8 = `BASE' /*Fensterbasis*/
/*Basis ist 0, es sei denn, die Anzeige wird*/
/*nach rechts verschoben*/
STEM.9 = `EXTEND' /*Groß-/Kleinschreibung*/
STEM.11 = `LINE' /*Aktuelle Zeilenzahl*/
STEM.12 = `FILENAME' /*Datei wird ediert*/
STEM.13 = `CURRENT' /*Text der aktuellen Zeile*/
STEM.14 = `LASTCMD' /*Letztes erweitertes Kommando*/
STEM.15 = `SEARCH' /*Letzte Suchzeichenfolge*/
/*ED soll Werte in Stammvariablen `STEM.' stellen.*/
`RV' `/STEM/' /*RV ist ein ED-Kommando zum Senden von Infos von ED an ARexx*/
/*STEM.1 ist LEFT, und STEM.LEFT hat nun einen Wert von ED. So können diese D
ten ausgedruckt werden:*/
DO i = 1 to STEM.0
ED_VAR = STEM.i
SAY STEM.1 "=" STEM.ED_VAR /*ED-Variablen und Werte drucken*/
END
ARexx kann zum Schreiben von Programmen für jede Host-Anwendung eingesetzt werden, die über eine kompatible Kommandoschnittstelle verfügt. Manche Anwendungsprogramme sind auf der Basis einer integrierten Makro-Sprache geschrieben und können zahlreiche vordefinierte Makro-Kommandos anbieten.
Überprüfen Sie das Anwendungsprogramm auf "Shortcut"-Kommandos (Tastenbefehle). Manche Programme bieten leistungsstarke Funktionen, die speziell für den Aufruf von Makro-Programmen aus implementiert wurden.
Die Interpretation der empfangenen Kommandos hängt ausschließlich von der jeweiligen Host-Anwendung ab. Im einfachsten Fall entsprechen die Kommandozeichenfolgen exakt den Kommandos, die vom Benutzer eingegeben werden können. So werden z.B. die Positionssteuerkommandos (Auf/Ab) eines Texteditors wahrscheinlich gleich interpretiert. Andere Kommandos sind aber möglicherweise nur gültig, wenn sie von einem Makro aus gegeben werden. Ein Kommando zur Simulation einer Menüoperation würde wohl kaum von einem Benutzer eingegeben. In Beispiel 10 wird das ARexx-Programm von ED zur Vertauschung zweier Zeichen aufgerufen.
/*Gegebene Zeichenfolge `123',
wenn Cursor auf 3 ist, wandelt das Makro die Zeichenkette in `213' um.*/
HOST = ADDRESS () /*Von welchem ED kam der Aufruf?*/
ADDRESS VALUE HOST
/*. . . mit Editor kommunizieren.*/
`rv' `/CURR/' /*ED soll Info in Stamm CURR stellen*/
/*Wir brauchen zwei Angaben:*/
currpos = CURR.X /*Cursorposition in der Zeile*/
currlin = CURR.CURRENT
/*Inhalt der aktuellen Zeile*/
IF (currpos >2) /*Mindestens 3. Schreibstellen*/
THEN currpos = currpos - 1
ELSE DO /*Fehler melden und Programm verlassen*/
`sm /Cursor muß mind. Auf Pos. 3 stehen/'
EXIT 10
END
/*Zeichen CURRPOS und CURRPOS-1
vertauschen und aktuelle Zeile durch neue Zeile ersetzen.*/
DROP CURR. /* STEM-Variable CURR wird nicht mehr gebraucht; Speicherplatz einsparen */
`d' /*ED soll aktuelle Zeile löschen*/
currlin = swapch (currpos,currlin) /*2 Zeichen tauschen*/
`i /'||currlin||'/' /*Geänderte Zeile einfügen*/
DO i = 1 to currpos /*Cursor zurück an alte Stelle*/
`cr' /*ED-Kommando `Cursor nach rechts'*/
END
EXIT /*Alles erledigt*/
/*Funktion zum Austauschen zweier Zeichen*/
swapch: procedure
PARSE ARG cpos,clin
chl = substr (clin, cpos, 1) /*Zeichen holen*/
clin = delstr (clin, cpos, 1) ^/*Löschen aus Zeichenfolge*/
clin = insert (chl,clin,cpos-2,1) /*Einfügen, um Transposition zu komplettieren*/
RETURN clin /*Geänderte Zeichenfolge zurückgeben*/
Zum Aufrufen dieses Beispiels von ED aus drücken Sie bitte ESC und geben folgendes ein:
Hier muß die volle Pfadangabe und die Namenserweiterung angegeben werden.
Diese Zeichenfolge kann natürlich auch einer Funktionstaste zugeordnet werden.
Nach Abschluß der Kommandoverarbeitung meldet der Host den Kommandostatus in Form eines Rückgabecodes. Die bei den einzelnen Kommandos möglichen Rückgabecodes lesen Sie bitte in der Dokumentation zur Host-Anwendung nach. Diese Codes zeigen an, ob die vom Kommando ausgeführte Operation erfolgreich war.
Dieser Rückgabecode wird in die ARexx-Spezialvariable RC gestellt, damit er vom Makro geprüft werden kann. Der Wert Null zeigt an, daß das Kommando erfolgreich ausgeführt wurde. Eine positive ganze Zahl weist auf eine Fehlerbedingung hin. Je höher die Zahl, desto schwerer der Fehler. Aus dem Rückgabecode kann das Makro-Programm schließen, ob das Kommando ausgeführt wurde bzw. ob im Falle des Scheiterns eine Aktion erforderlich ist.