Die Makro-Operanden werden in zwei Gruppen eingeteilt:
Formatoperanden, die die Form und die Generierung des Makros festlegen
Funktionsoperanden, die schnittstellenspezifisch den Inhalt des Parameterbereichs festlegen
Syntax der Formatoperanden
Die Syntax der Formatoperanden entspricht den BS2000-Regeln (siehe Handbuch „Makroaufrufe an den Ablaufteil“ [7]).
MF | steuert die Code-Generierung („Makroform“) |
PREFIX | steuert die Generierung der Namen (erster Buchstabe) |
MACID | steuert die Generierung der Namen (zweiter bis vierter Buchstabe) |
PARAM | steuert die Adressierung des Parameterbereichs |
XPAND | steuert die Expansion einzelner Datenstrukturen; Ist XPAND in der Makrosyntax enthalten, muss ihm ein Wert zugeordnet werden, da er keine Voreinstellung hat (Pflichtoperand). |
Makroformen
Der Operand MF legt die Form des Makros fest. Er kann folgende Werte annehmen:
MF=C / D / L / E / M / S
MF=C | Das Layout der Datenstruktur (in der Regel der Parameterbereich) wird erzeugt, wobei jedes Feld und jedes Equate benannt sind. Diese Datenstruktur wird Teil des aktuellen Programmabschnitts (CSECT/DSECT). Die Funktionsoperanden des Makros werden nicht ausgewertet. |
XPAND | Soweit dies für die Schnittstelle erforderlich ist, kann die Expansion einzelner Datenstrukturen durch Steueroperanden ausgewählt werden - etwa, wenn an einer Schnittstelle verschiedene Ausgabebereiche auswählbar sind (z.B. XPAND=PARAM / out1). |
PREFIX | Der Operand PREFIX dient zur Generierung der zu erzeugenden Namen. PREFIX, der genau ein Buchstabe ist, wird als erster Buchstabe aller Namen verwendet. Default-Wert ist der Kennbuchstabe der Funktionseinheit, dem der Makro angehört. Um Namensgleichheit zu vermeiden, ist PREFIX zu verwenden, wenn dieselbe Datenstruktur mehrfach innerhalb eines Moduls verwendet wird. |
MACID | Der Operand MACID dient zur Generierung der zu erzeugenden Namen und bestimmt das zweite bis vierte Zeichen des Namens. Default-Wert: zwei Zeichen als Entwicklungsgruppenkennzeichen und ein Zeichen als makrospezifisches Kennzeichen. Der Default-Wert garantiert die Kollisionsfreiheit der Namen innerhalb der Komponentengruppe. |
MF=D | Erzeugt das Layout der Datenstruktur wie bei MF=C. Zusätzlich wird ein DSECT-Statement erzeugt. Der MACID-Operand wird ignoriert, der Standard-Wert wird angenommen. |
MF=L | Erzeugt eine Instanz des Parameterbereichs unter Auswertung der Funktionsoperanden. Diese Makroform erzeugt keine Feldnamen. Die Label-Angabe wird zur Benennung der erzeugten Konstanten verwendet. |
MF=E | Erzeugt die zum Aufruf der Funktion notwendigen Befehle. Die Funktionsoperanden werden ignoriert. Die Adressierung des Parameterbereichs muss mit dem Steueroperanden PARAM sichergestellt werden: |
PARAM | Der Operand PARAM steuert die Adressierung des Parameterbereichs. |
=<adr> | Adresse des Parameterbereichs als Name |
=(<reg>) | Adresse des Parameterbereichs ist im Register mit dem Namen <reg> enthalten |
MF=M | Modifiziert einen durch Kopieren einer MF=L - Form vorher initialisierten Parameterbereich unter Auswertung der angegebenen Funktionsoperanden. Nicht angegebene Operanden bleiben im ursprünglichen Zustand. Die Konsistenz des Parameterbereichs liegt in der Verantwortung des Makro-Aufrufers. MF=M setzt voraus, dass die MF=D - Form oder MF=C - Form mit denselben Werten der PREFIX- und MACID-Operanden aufgerufen wurde, und dass vor der Adressierung der DSECT (MF=D - Form) ein USING-Statement abgesetzt worden ist. |
MF=S | Erzeugt eine Instanz des Parameterbereichs unter Auswertung der Funktionsoperanden, wie bei MF=L. Zusätzlich werden Befehle generiert, die - falls erforderlich - die Parameterbereichsinstanz überspringen und die Funktion aufrufen. |
Elemente der Makrosyntax
Kennzeichnung | Bedeutung | Beispiel | |||
GROSSBUCHSTABEN | Großbuchstaben bezeichnen Schlüsselwörter oder Konstanten, die in dieser Form vom Benutzer angegeben werden müssen. Schlüsselwörter müssen mit * beginnen, falls alternativ sowohl Schlüsselwörter als auch Namen von Konstanten oder Variablen angegeben werden können. | DELETE=*NO / *YES | |||
Kleinbuchstaben | Kleinbuchstaben bezeichnen Datentypen der Werte oder Variablen, die vom Benutzer angegeben werden können. | COUNT=<integer 1..8> | |||
= | Das Gleichheitszeichen verbindet einen Operanden mit dem dazugehörigen Operandenwert. | FILE=<c-string> | |||
< > | Spitze Klammern kennzeichnen Variablen, deren Wertevorrat durch die Datentypen beschrieben wird. | REPEAT=<integer> | |||
Unterstreichung | Der Unterstrich kennzeichnet den Standardwert eines Operanden. Hat der Operand keinen Standardwert, ist die Angabe des Operanden Pflicht! | ACTION=*ADD / *MOD | |||
/ | Der Schrägstrich trennt alternative Operandenwerte. | CHECK=*NO / *YES | |||
list-poss(n) | Aus den Operandenwerten, die list-poss folgen, kann eine Liste gebildet werden. Ist n angegeben, können maximal n Elemente in der Liste vorkommen (für den Typ Keylist). Die Liste muss in runden Klammern eingeschlossen werden, falls mehr als ein Element spezifiziert wird. |
|
Tabelle 4:
Makrosyntax: Elemente
Einem Operanden wird durch ein Gleichheitszeichen ein Operandenwert zugewiesen, welcher aus einem definierten Wertevorrat stammt.
Dieser Wertevorrat wird durch einen Datentyp bestimmt. Nachfolgende Tabelle enthält die Datentypen der Operandenwerte.
Datentypen der Operandenwerte
Datentyp | Zeichenvorrat | Anmerkungen |
c-string | EBCDIC-Zeichen | ist in Hochkommata einzuschließen |
integer | [+-] 0..2147483647 | ist eine dezimale Zahl |
var: | leitet eine variable Angabe ein. Nach dem Doppelpunkt folgt der Typ der Variablen (siehe Tabelle 7) | <var:var-type> |
reg: | Register 0..15 | Verwendung: (<reg:var-type>) |
Tabelle 5: Makro-Syntax: Datentypen der Operandenwerte
Zusätze zu Datentypen
Zusatz | Bedeutung |
n..m | für Datentyp integer bedeutet n..m eine Intervallangabe; n: Mindestwert m: Maximalwert |
für Datentyp c-string bedeutet n..m eine Längenangabe in Bytes; n: Mindestlänge m: Maximallänge mit n < m | |
n | bei Datentyp c-string bedeutet n eine Längenangabe in Bytes; n muss exakt eingehalten werden. |
Tabelle 6: Makro-Syntax: Zusätze zu Datentypen
Die Operandenwerte können direkt als Zeichenkette oder Integer-Zahl (siehe Datentypen c-string und integer ) eingegeben werden oder indirekt über eine Variable (siehe Datentyp var:) bezeichnet werden. Die nachfolgende Tabelle enthält die Datentypen, die für Variablen möglich sind.
Datentypen der Variablen
Datentyp | Beschreibung | Definition im Programm |
char:n | Die Variable ist eine Zeichenkette von n Zeichen. Fehlt die Längenangabe, wird n=1 angenommen. | CLn |
int:n | Die Variable ist eine Integer-Zahl, die n Bytes belegt. Fehlt die Längenangabe, wird n=1 angenommen. Bedingung: n ≤ 4 | FLn |
enum-of E:n | Die Variable ist die Aufzählung E, die n Bytes belegt. Fehlt die Längenangabe, wird n=1 angenommen. (n ≤ 4) | XLn |
pointer | Die Variable ist eine Adresse oder ein Adresswert. | A |
Tabelle 7: Makrosyntax: Datentypen der Variablen
Standardheader
Alle Makros benutzen zur Identifikation ihrer Schnittstelle den Standardheader.
Der Standardheader ist ein 8 Byte langes Feld am Beginn des Parameterbereichs mit der (normierten) Bezeichnung der Schnittstelle und 4 Byte zur Aufnahme eines Returncodes.
Der Standardheader wird vom jeweiligen Makro erzeugt und initialisiert. Er wird mit den gültigen Werten für UNIT, FUNCTION und VERSION versorgt.
Aufbau des Standardheaders
Byte | Feldinhalt und Bedeutung |
0 - 1 | Bezeichnung der Funktionseinheit (UNIT) mit der verlangten Funktion |
2 | Bezeichnung der Funktion (FUNCTION) innerhalb der Funktionseinheit |
3 | Bezeichnung des Änderungsstandes (VERSION) der Funktion |
4 | Unterwert 2 des Returncodes (Subcode2) |
5 | Unterwert 1 des Returncodes (Subcode1) |
6 - 7 | Hauptwert des Returncodes (Maincode) |
Folgende Werte des Returncodes gelten für alle Makros:
(SC2) | SC1 | Maincode | Bedeutung / garantierte Meldungen |
X‘00‘ | X‘00‘ | X‘0000‘ | Erfolgreiche Funktionsausführung. Es gibt keine zusätzlichen Informationen zum Maincode. |
X‘01‘ | X‘00‘ | X‘0000‘ | Erfolgreiche Funktionsausführung. Es sind keine weiteren Aktionen erforderlich. |
X‘00‘ | X‘01‘ | X‘FFFF‘ | Die angeforderte Funktion wird nicht unterstützt (falsche Angabe für UNIT oder FUNCTION im Standardheader). Nicht behebbarer Fehler. |
X‘00‘ | X‘02‘ | X‘FFFF‘ | Die angeforderte Funktion ist nicht verfügbar. Nicht behebbarer Fehler. |
X‘00‘ | X‘03‘ | X‘FFFF‘ | Die angegebene Version der Schnittstelle wird nicht unterstützt (falsche Versionsangabe im Standardheader). Nicht behebbarer Fehler. |
X‘00‘ | X‘04‘ | X‘FFFF‘ | Parameterblock nicht auf Wortgrenze ausgerichtet. |
X‘00‘ | X‘41‘ | X‘FFFF‘ | Das Subsystem ist nicht vorhanden; es muss explizit erzeugt werden. |
X‘00‘ | X‘42‘ | X‘FFFF‘ | Die aufrufende Task ist mit dieser Schnittstelle nicht konnektiert; sie muss explizit konnektiert werden. |
X‘00‘ | X‘81‘ | X‘FFFF‘ | Das Subsystem ist zurzeit nicht verfügbar. |
X‘00‘ | X‘82‘ | X‘FFFF‘ | Das Subsystem ist im DELETE- oder HOLD-Zustand. |
Maincode kennzeichnet das Ergebnis der Funktionsausführung. Subcode1 dient der Klassifizierung des Hauptwertes. Subcode2 dient der weiteren Unterteilung des Fehlers in Fehlerklassen oder enthält zusätzliche Diagnoseinformationen.