Der Makro CMDRST bewirkt, dass SDF
eine Programmanweisung von SYSSTMT einliest (Für die Systemdatei SYSSTMT gilt die gleiche Zuweisung, die für die Systemdatei SYSDTA getroffen ist. Bezüglich Folgezeilen, Fortsetzungszeichen und Angabe von Bemerkungen gelten für die Anweisungseingabe von SYSSTMT die gleichen Regeln wie für die Kommandoeingabe von SYSCMD.)
die eingelesene Anweisung analysiert und
das Analyseergebnis an das Programm übergibt.
Voraussetzung ist, dass eine aktivierte Syntaxdatei die Definition des Programms und seiner Anweisungen enthält.
Die Eingabelänge einer über CMDRST eingelesenen Anweisung beträgt 16348 Byte.
Neben dem normalen Lesen und Analysieren von Anweisungen kann CMDRST auch Datensätze lesen. Diese Funktionalität ist jedoch nur zu Migrationszwecken vorgesehen. SDF reicht die Datensätze nur durch, d.h. es wird keinerlei Formatierung darauf angewendet.
Bild 12: Wirkung des Makros CMDRST
Operation | Operanden |
CMDRST | PROGRAM = <c-string 1..8> / <var: char:8> ,OUTPUT = <var: pointer> ,STMT = *ALL / <var: pointer> ,PREFER = *ALL / <c-string 1..8> / <var: char:8> ,DEFAULT = *NO / <var: pointer> ,MESSAGE = *NO / <var: pointer> ,PROT = *YES / *NO / <var: bit:1> ,BUFFER = *NO / <var: pointer> ,INVAR = *NO / <var: pointer> ,SPIN = *NO / *YES / <var: bit:1> ,ERRSTMT = *STEP / *NEXT / <var: bit:1> ,CALLID = *NO / <var: pointer> ,CCSNAME = *NO / *EXTEND / <c-string 1..8> / <var: char:8> ,DATA_RECORD = *NO / <var: pointer> ,STMTRC = *NO / <var: pointer> ,OUTFORM = *NEW / *OLD / <var: bit:1> ,MF = C / D / L / M / E |
PROGRAM = <c-string 1..8> / <var: char:8>
interner Name des Programms, das den Makroaufruf absetzt. In der Syntaxdatei ist dieser Name in der Programmdefinition abgelegt (siehe ADD-PROGRAM). Er ist mindestens 1 und maximal 8 Byte lang und kann als C-String-Konstante oder als String-Variable übergeben werden.
OUTPUT = <var: pointer>
Adresse des normierten Übergabebereichs, der auf Wortgrenze beginnen muss. Der Übergabebereich wird mit dem Makro CMDTA generiert (oder bei OUTFORM=*OLD mit CMD-
STRUC, siehe Kapitel „Anhang“).
STMT =
bestimmt, welche Anweisungen als Eingabe zulässig sind.
Nur die Anweisungen, deren interner Anweisungsname angegeben ist, sind zulässig. Der interne Anweisungsname ist in der Syntaxdatei in der Anweisungsdefinition abgelegt (siehe ADD-STMT). Er ist mindestens ein und maximal acht Byte lang. Die SDF-Standardanweisungen sind unabhängig von der hier getroffenen Festlegung immer zulässig.
*ALL
Alle Anweisungen sind zulässig.
<var: pointer>
Adresse der Liste der zulässigen Anweisungen. Diese Liste kann mit dem Makro CMDALLW generiert worden sein.
Die Liste muss auf Halbwortgrenze ausgerichtet und wie folgt aufgebaut sein:
2 Byte: | Anzahl der internen Namen in der Liste (n) |
8 Byte: | erster interner Anweisungsname . . . |
8 Byte: | n-ter interner Anweisungsname |
PREFER =
ist nur für den geführten Dialog relevant und bestimmt, ob als nächste Eingabe eine bestimmte Anweisung erwartet wird.
*NO
Es wird keine bestimmte Anweisung erwartet. SDF fragt mit dem Anweisungsmenü beim Benutzer ab, welche Anweisung er eingeben will.
<c-string 1..8>
interner Name der Anweisung, deren Eingabe mit hoher Wahrscheinlichkeit zu erwarten ist. SDF gibt kein Anweisungsmenü aus, in dem der Benutzer die einzugebende Anweisung auswählt, sondern direkt den Operandenfragebogen für die erwartete Anweisung. Der Benutzer kann allerdings statt der erwarteten eine andere Anweisung eingeben.
Beispiel:
Nach MODIFY-OPERAND erwartet SDF-A als nächste Anweisung MODIFY-VALUE. Der interne Anweisungsname ist in der Syntaxdatei in der Anweisungsdefinition abgelegt (siehe ADD-STMT). Er ist mindestens 1 und maximal 8 Byte lang.
<var: char:8>
Adresse eines 8 Byte langen Bereiches, das den internen Namen der zu erwartenden Anweisung enthält. Der Name muss linksbündig ausgerichtet und mit Leerzeichen
(X’40’) aufgefüllt sein.
DEFAULT =
bestimmt, ob SDF folgende Werte durch vom Programm dynamisch erzeugte Werte ersetzt:
eingegebene Operandenwerte oder
Default-Werte der Operanden
In der Syntaxdatei müssen die Operanden bzw. Operandenwerte entsprechend definiert sein (siehe ADD-OPERAND...,OVERWRITE-POSSIBLE=*YES),... bzw. ADD-VALUE..., VALUE=<c-string> (OVERWRITE-POSSIBLE=*YES),...). Der vom Programm erzeugte Default-Wert muss gültiger Operandenwert sein. Im geführten Dialog zeigt SDF die vom Programm erzeugten Werte im Fragebogen.
Beispiel:
SDF ersetzt in den eingegebenen MODIFY-Anweisungen den Wert *UNCHANGED durch den aktuellen Wert.
*NO
SDF soll die eingegebenen Operandenwerte nicht durch vom Programm dynamisch erzeugte Werte ersetzen.
<var: pointer>
Adresse einer auf Wortgrenze ausgerichteten Liste, die Adressen von Umsetzbeschreibungen für Anweisungen enthält. Als Umsetzbeschreibung wird ein formatierter Übergabebereich mit dem Typ 'Struktur' verwendet (siehe Abschnitt „Aufbau des normiertenÜbergabebereichs“). Je Anweisung kann nur eine Umsetzbeschreibung angegeben werden. Eine Umsetzbeschreibung enthält u.a. den internen Anweisungsnamen und die Information, welche Operanden mit welchen Werten zu belegen sind. Die Liste der Adressen von Umsetzbeschreibungen ist wie folgt aufgebaut:
2 Byte: | Anzahl der Umsetzbeschreibungen in der Liste (n) |
2 Byte: | (reserviert) |
4 Byte: | Adresse der ersten Umsetzbeschreibung . . . |
4 Byte: | Adresse der n-ten Umsetzbeschreibung |
Die Bereiche für die Umsetzbeschreibungen, die für die Default-Werte des Programms übergeben werden, müssen auf Wortgrenze ausgerichtet sein. Dies gilt ebenso für den Ausgabebereich der Makros (OUTPUT-Operand).
Stehen die zu defaultierenden Operanden in einer Struktur, deren Einleiter mit LIST-ALLOWED=*YES definiert ist (siehe ADD-VALUE), so kann folgender Fall eintreten: Die Umsetzbeschreibung enthält mehrere Listenelemente, an denen eine Struktur mit zu defaultierenden Operanden hängt. Auf der anderen Seite gibt der Anwender ebenfalls mehrere Listenelemente ein, an denen eine Struktur mit zu defaultierenden Operanden hängt. SDF versucht zunächst, die vom Benutzer eingegebenen und die in der Umsetzbeschreibung angegebenen Strukturen einander über den Wert des Struktureinleiters zuzuordnen. Ist über den struktureinleitenden Wert keine eindeutige
Zuordnung möglich, weil keiner der eingegebenen Werte mit denen in der Umsetzbeschreibung übereinstimmt oder weil der Benutzer den übereinstimmenden Wert mehrfach eingegeben hat, so erfolgt die Zuordnung über die Position des Struktureinleiters in der Liste.
MESSAGE =
bestimmt, ob SDF bei der Aufforderung zur Anweisungseingabe eine Meldung ausgeben soll. Diese wird im geführten Dialog in das Anweisungsmenü integriert.
*NO
SDF soll keine Meldung ausgeben.
<var: pointer>
Adresse des auszugebenden Meldungstextes, auf Halbwortgrenze ausgerichtet. Der Text wird als Satz variabler Länge erwartet:
2 Byte: | absolute Länge des Satzes (n+4) |
2 Byte: | (reserviert) |
n Byte: | Meldungstext |
Der Meldungstext darf maximal 400 Zeichen lang sein. In SDF-formatierten Bildschirmen werden jedoch nur die ersten 280 Zeichen dargestellt. Enthält der Text Bildschirmsteuerzeichen, so kann die Menü-Maske zerstört werden.
PROT =
bestimmt, ob SDF zu protokollierende Eingaben und Meldungen nach SYSOUT schreibt. Falls nicht nach SYSOUT geschrieben wird, sollte der Benutzer des Programms in der Programmdokumentation darüber informiert werden. Ein Protokollpuffer kann bereitgestellt werden.
*YES
SDF soll zu protokollierende Eingaben und Meldungen nach SYSOUT schreiben.
*NO
SDF soll keine Protokollierung durchführen. Folgendes Verhalten kann erwartet werden:
Ergebnis der Analyse | PROT-Parameter | |
*YES | *NO | |
Kein Fehler: | Eingabeanweisung | – / – |
Syntaxfehler: | 1. Eingabeanweisung | Spin-off-Meldung |
BUFFER =
Das Protokoll der Anweisung und die Fehlermeldungen können in einen vom Benutzer bereitgestellten Bereich geschrieben werden.
*NO
Es wird kein Puffer bereitgestellt.
<var: pointer>
Adresse eines Bereichs, in dem das Protokoll der angegebenen Anweisung und die Meldungen, unabhängig vom Wert, der bei PROT angegeben wurde, abgelegt wird. Der Bereich muss auf Halbwortgrenze ausgerichtet sein und wird wie folgt belegt:
2 Byte: | maximale Länge des Protokollbereiches |
2 Byte: | tatsächlich genutzte Länge des Protokollbereiches |
n Byte: | Protokollsätze |
Jeder einzelne Protokollsatz hat folgendes Format:
2 Byte: | absolute Länge des Protokollsatzes (m+4) |
2 Byte: | (reserviert) |
m Byte: | Inhalt des Protokollsatzes |
Wenn der Puffer nicht leer ist, ist der erste Datensatz normalerweise das Protokoll des Eingabe-Kommandos. Die weiteren Datensätze enthalten Meldungen. Wenn kein Eingabeprotokoll zur Verfügung steht oder ausgegeben werden kann, wird ein doppelter Schrägstrich („//“) in den Ausgabebereich geschrieben.
INVAR =
Legt fest, ob die INVARIANT-INPUT-Form der Anweisung abgespeichert wird. Das heißt, dass die Anweisung mit allen eingegebenen Operanden, allen durch Default-Werte vorbelegten Operanden und mit allen Operandenwerten abgelegt wird, die für die Task zu dieser Zeit erlaubt sind. Im Gegensatz zur Protokollierungsform LOGGING=*INVARIANT-FORM (Anweisung MODIFY-SDF-OPTIONS) werden Kennwörter und geheime Operanden
jedoch nicht ausgeblendet. Mehr dazu finden Sie auf "CMDRST Anweisung lesen und analysieren".
*NO
Die INVARIANT-INPUT-Form der Anweisung wird nicht abgespeichert.
<var: pointer>
Gibt die Adresse eines Puffers an, in den SDF die INVARIANT-INPUT-FORM der Anweisung schreibt. Der Puffer muss auf Wortgrenze ausgerichtet sein und das erste Halbwort muss die Länge des Puffers enthalten. SDF legt die INVARIANT-INPUT-Form ab dem zweiten Halbwort als Satz mit variabler Satzlänge ab. Der Puffer hat dann folgenden Inhalt:
2 Byte: | maximale Länge des Puffers |
2 Byte: | Ausgabelänge, die SDF schreibt (n+4) |
2 Byte: | (reserviert) |
n Byte: | INVARIANT-INPUT-Form der Anweisung, ab 7. Byte |
SPIN =
bestimmt, welche Anweisung SDF im Stapelbetrieb als nächste liest und analysiert.
*NO
SDF soll die nächste Anweisung der Anweisungsfolge lesen und bearbeiten.
*YES
SDF soll alle Anweisungen bis zur nächsten STEP-Anweisung bzw. bis zur END-Anweisung überlesen und ggf. die Bearbeitung mit der Anweisung fortsetzen, die der STEP-Anweisung folgt.
<var: bit:1>
Bitvariable: | bit = 0: wie *NO |
ERRSTMT =
Bestimmt, welche Anweisung den Spin-off-Mechanismus abbricht, wenn SDF einen Syntaxfehler für die Leseanweisung feststellt.
*STEP
SDF leitet Spin-off ein bis STEP (oder END) erkannt wird.
Der Returncode ist X’1C’, X’34’, ...
*NEXT
SDF leitet keinen Spin-off ein: Die nächste Anweisung wird beim nächsten CMDRST-Aufruf gelesen. Returncode ist dann X’50’.
<var: bit:1>
Bitvariable: | bit = 0: wie *STEP |
CALLID =
Diese Funktion bezieht sich auf den Gebrauch der Makros OPNCALL und CLSCALL. CALLID benennt den Programmkontext (=Syntaxdateihierarchie, durch einen OPNCALL-Makro eröffnet), in dem die Anweisung gelesen und analysiert werden muss. Der Name der Syntaxdateihierarchie (CALLID) muss den 4 Byte langen Wert haben, der von SDF an das Feld zurückgegeben wird, das durch den Operanden CALLID im OPNCALL-Makro bezeichnet wurde.
*NO
Die aktuelle Syntaxdateihierarchie (Kontext) der Task wird für die Analyse der Anweisung verwendet. Das kann z.B. die für die Task beim LOGON-Vorgang eröffnetet Syntaxdateihierarchie sein.
<var: pointer>
Adresse des Aufrufprüfungsfeldes. Der Bereich muss auf Wortgrenze ausgerichtet sein.
CCSNAME =
Gibt den Namen des Zeichensatzes an, der für den Korrekturdialog auf 8-bit-Terminals und für die Konvertierung von Klein- in Großbuchstaben verwendet wird. Jedes Terminal arbeitet mit einem bestimmten Zeichensatz. Ein codierter Zeichensatz (CCS, Coded Character Set) ist die eindeutige Darstellung der Zeichen eines Zeichensatzes in binärer Form. Jeder codierte Zeichensatz wird durch seinen Namen (Coded Character Set Name, CCSN) bestimmt (siehe Handbuch „XHCS“ [11]). Die Ausgabe von Meldungen wird durch diesen Parameter nicht beeinflusst.
*NO
Der 7-bit-Standard-Code wird für Ein-/Ausgabeoperationen verwendet.
*EXTEND
Der 8-bit-Standard-Code wird für Ein-/Ausgabeoperationen verwendet.
<c-string 1..8> / <var: char:8>
Gibt den Namen eines speziellen 8-bit-Code an, der für Ein-/Ausgabeoperationen verwendet wird. Der Name muss 8 Byte lang sein und kann als C-String-Konstante oder als String-Variable übergeben werden.
DATA_RECORD =
bestimmt, ob SDF Daten speichert, die an Stelle von Anweisungen eingegeben wurden.
Wenn dieser Fall eintritt, gibt SDF einen speziellen Returncode zurück (siehe „Rückinformation und Fehleranzeigen“). Der Parameter darf nur zur Migration von RDATA zu CMDRST verwendet werden (nicht für Programme, die schon RDSTMT- oder CMDRST-Aufrufe enthalten). Damit kann ein Programm, das im Dialog nur die SDF-Schnittstelle anbietet, kompatibel in Prozeduren und Stapelaufträgen aufgerufen werden. Den SDF-Anweisungen des Programms muss in den Prozeduren und Stapelaufträgen „//“ vorangestellt werden.
*NO
Keine Datenspeicherung. Das Resultat des CMDRST-Aufrufes ist abhängig von der Eingabe:
Eingabe von: | Art der Eingabe | Ausgabe von CMDRST |
Terminal | //<stmt> | im OUTPUT-Parameter |
Terminal | <data> | nicht möglich |
Prozedur/Batch | //<stmt> | im OUTPUT-Parameter |
Prozedur/Batch | <data> | im OUTPUT-Parameter 1) |
S-Prozedur | //<stmt> | im OUTPUT-Parameter |
S-Prozedur | <data> | Fehler 2) |
1)Daten werden wie Anweisung behandelt
2)in S-Prozeduren ist „//“ vor Anweisungen Pflicht
<var: pointer>
Adresse eines auf Wortgrenze ausgerichteten Bereiches, in dem SDF die Daten ablegt, die an Stelle von Anweisungen gelesen wurden.
Der Bereich hat folgendes Layout:
2 Byte: | maximale Länge des Bereiches |
2 Byte: | tatsächlich genutzte Ausgabelänge (n+4) |
2 Byte: | (reserviert) |
n Byte: | Datensätze |
Das Resultat des CMDRST-Aufrufes ist abhängig von der Eingabe:
Eingabe von: | Art der Eingabe | Ausgabe von CMDRST |
Terminal | //<stmt> | im OUTPUT-Parameter |
Terminal | <data> | nicht möglich |
Prozedur/Batch | //<stmt> | im OUTPUT-Parameter |
Prozedur/Batch | <data> | im DATA_RECORD-Parameter |
S-Prozedur | //<stmt> | im OUTPUT-Parameter |
S-Prozedur | <data> | im DATA_RECORD-Parameter |
STMTRC =
Legt fest, ob die Anweisung einen Returncode liefert. Dieser Returncode kann mit SDF-P-Funktionen in S-Prozeduren wie ein Kommando-Returncode ausgewertet werden.
*NO
Die Anweisung liefert keinen Returncode. SDF übergibt einige Standard-Returncodes entsprechend der bei ERRSTMT und SPIN getroffenen Festlegungen:
(SC2) | Maincode | Bedeutung |
0 | CMD0001 | kein Fehler |
<var: pointer>
Adresse einer Struktur, die den Returncode der Anweisung enthält. Damit der Benutzer sinnvolle Returncodes erhält, prüft SDF die folgenden Returncode-Bedingungen. Wenn diese nicht eingehalten werden, liefert SDF eigene Returncodes.
Bei einem Fehler in der gelesenen Anweisung sollte CMDRST als Nächstes mit SPIN=*YES und einem Anweisungs-Returncode mit SC1 ungleich null aufgerufen werden.
Bei fehlerfreier Abarbeitung sollte CMDRST als Nächstes mit SPIN=*NO und einem Anweisungs-Returncode mit SC1 gleich null aufgerufen werden.
Bei semantischen Fehlern sollte CMDRST als Nächstes mit SPIN=*YES und SC1 ungleich null aufgerufen werden. Wenn kein Returncode übergeben wird oder der SC1 gleich null ist, setzt SDF den Returncode CMD0230 ein.
Wenn CMDRST mit ERRSTMT=*NEXT aufgerufen wird und der Makro-Returncode X'50' zurückkommt, kann der nächste CMDRST ohne Spin-off und mit SC1 gleich null aufgerufen werden. Das Programm sollte keinen Spin-off starten, da es selbst den Spin-off von SDF unterdrückt hat.
OUTFORM =
Legt fest, welches Format des normierten Übergabebereiches SDF ausgibt. Bei der Angabe von Default-Werten (siehe Parameter DEFAULT) identifiziert SDF das Format des Übergabebereiches selbst.
*NEW
Der normierte Übergabebereich hat das neue Format (siehe Aufbau des normierten Übergabebereichs).
*OLD
Der Übergabebereich hat das bis SDF V4.0 verwendete Format (siehe Kapitel„Anhang“).
<var: bit:1>
Bitvariable: | bit = 0: wie *NEW |
Beschreibung der Parameter MF, PARAM, MACID und PREFIX siehe Benutzerhandbuch
„Makroaufrufe an den Ablaufteil“ [8].
Rückinformation und Fehleranzeigen
Der Aufbau des Übergabebereichs ist auf den Aufbau des normierten Übergabebereichs beschrieben. Das bis SDF V4.0 verwendete Format des Übergabebereiches finden Sie im Kapitel „Anhang“.
In der INVARIANT-INPUT-Form wird die Anweisung mit allen eingegebenen Operanden, allen durch Default-Werte vorbelegten Operanden und mit allen Operandenwerten abgelegt, die für die Task zu dieser Zeit erlaubt sind. Die INVARIANT-INPUT-Form ist damit die größtmögliche Eingabeform für eine Anweisung, die für einen Benutzer mit bestimmten Privilegien und im gewählten Dialogmodus zulässig ist. Kennwörter und geheime Operanden werden nicht ausgeblendet. Die INVARIANT-INPUT-Form ist nicht das Gleiche wie die Protokollierungsform LOGGING=*INVARIANT-FORM (siehe MODIFY-SDF-OPTIONS).
Die INVARIANT-INPUT-Form liefert ein portables Format für SDF-Eingaben. Da nur Standardnamen verwendet werden, kann die INVARIANT-INPUT-Form ohne Probleme zu einem fernen Partner übertragen werden, auch wenn dort andere externe Namen oder andere Default-Werte verwendet werden.
Kommandos, Operanden usw. dort entfernt wurden (Anweisung REMOVE) oder auf Grund der Privilegien nicht erlaubt sind. Default-Werte, die in der lokalen Umgebung nicht erlaubt sind, werden auch nicht zum fernen Partner übertragen. Bei der Ausführung der Anweisung im fernen System werden die Default-Werte eingesetzt, die in dieser Umgebung gelten.
Der Returncode wird im Standardheader der Parameterliste übergeben.
Standardheader | cc: Subcode 2 (SC2) |
(SC2) | SC1 | Maincode | Bedeutung |
00 | 00 | 0000 | erfolgreiche Beendigung |
00 | 20 | 0004 | nicht behebbarer Systemfehler |
01 | 0008 | Parameterfehler: | |
00 |
| ||
01 |
| ||
02 |
| ||
03 |
| ||
04 |
| ||
05 |
| ||
06 |
| ||
07 |
| ||
08 |
| ||
10 |
| ||
00 | 40 | 000C | Übergabebereich zu klein |
00 | 40 | 0010 | Eingabeende erkannt |
00 | 40 | 0014 | Anweisung fehlerhaft, Kommando wurde erkannt |
00 | 40 | 0018 | Anweisung ist zwar in Ordnung, die vom Programm übergebenen Default-Werte sind jedoch fehlerhaft |
00 | 40 | 001C | Anweisung fehlerhaft, //STEP wurde erkannt |
00 | 40 | 0028 | Puffer zu klein, Protokoll abgeschnitten |
00 | 40 | 002C | END-Anweisung wurde gelesen |
00 | 40 | 0034 | Anweisung fehlerhaft, die nächste zu bearbeitende Anweisung ist END |
00 | 40 | 003C | Programm nicht in Syntaxdatei bekannt |
00 | 40 | 0040 | angegebene CALLID nicht gefunden |
00 | 40 | 0044 | im DSSM-Katalog eingetragene Syntaxdatei nicht gefunden |
00 | 40 | 0050 | Anweisung fehlerhaft, Spin-off wurde nicht eingeleitet |
00 | 40 | 005C | INVAR-Puffer zu klein, INVARIANT-INPUT abgeschnitten |
00 | 40 | 0064 | XHCS-Fehler bei Anweisungseingabe |
02 | 00 | 0068 | Datensatz wurde an Stelle einer Anweisung gelesen und im DATA_RECORD-Puffer gespeichert |
CMDRST liefert auch die Herkunft der Anweisung. Bei fehlerfreier Parameterliste wird die SYSSTMT-Zuweisung im Feld <prefix><macid>SYSSTMT_STATE der Parameterliste abgelegt.
Folgende Werte können auftreten:
Wert | SYSSTMT = |
X’01’ X’02’ X’03’ X’04’ X’05’ X’06’ | Datensichtstation SYSCMD in Nicht-S-Prozedur oder Datei Kartenleser Diskette SYSCMD in S-Prozedur S-Variable |
Migration von RDSTMT zu CMDRST
Die Migration von RDSTMT nach CMDRST ist nur dann notwendig, wenn Sie die neue Funktionalität von CMDRST nutzen wollen. Folgende Punkte sollten Sie dabei beachten:
Beim CMDRST-Aufruf muss immer der MF-Parameter angegeben werden. Die Parameterliste von CMDRST muss immer, getrennt vom ausführenden Code, deklariert und mit MF=L initialisiert werden. Die DSECT für die Parameterliste muss mit MF=D generiert werden. Direkte Modifkationen (über ein Offset vom Beginn der Parameterliste) sind nicht erlaubt. Mehr zu den Parametern MF und PARAM finden Sie im Benutzerhandbuch „Makroaufrufe an den Ablaufteil“ [8].
Gegenüberstellung von RDSTMT und CMDRST
RDSTMT
CMDRST
<Programmcode> . . .
<Code zur Manipulieren der
Parameterliste mittels
LABEL+Offset>
RDSTMT MF=(E,(LABEL))
<Programmcode> . . .
<Daten>
LABEL RDSTMT MF=L,<params>
<Programmcode> . . .
LA 1,LABEL
USING D,1
<Code zum Manipulieren der Parameter-
liste mit den Namen aus DSECT D>
CMDRST MF=M,PARAM=(1),<params>
CMDRST MF=E,PARAM=LABEL
<Programmcode> . . .
<Daten>
LABEL CMDRST MF=L,<params>
<dsect>
D CMDRST MF=D
Der Makro-Returncode wird im Standardheader der Parameterliste übergeben. Der Maincode von CMDRST entspricht den Werten, die bei RDSTMT im rechtsbündigen Byte im Register 15 übergeben wurden. Die Erzeugung von EQUATES für Returncodes mit dem Makro CMDANALY ist nicht mehr notwendig, da diese mit CMDRST MF=D automatisch erzeugt werden. Im Folgenden finden Sie eine Gegenüberstellung der alten (RDSTMT-) und neuen (CMDRST-)Feldnamen:
RDSTMT
CMDRST
&P.NOERR
&P.SYERR
&P.PAERR
&P.TRUNC
&P.EOF
&P.SCMD
&P.DFLT
&P.STEP
&P.PTRC
&P.END
&P.EERR
&P.NOPRG
&P.INCID
&P.NOFND
&P.NEXT
&P.ITRC
&P.XHCS&PREFIX.MDRSUCCESSFUL
&PREFIX.MDRSYSTEM_ERROR
&PREFIX.MDRPARAMETER_ERROR
&PREFIX.MDRAREA_TOO_SMALL
&PREFIX.MDREOF
&PREFIX.MDRSTMTERROR_CMD
&PREFIX.MDRWRONG_DEFAULTS
&PREFIX.MDRSTMTERROR_STEP
&PREFIX.MDRPROTOCOL_TRUNCATION
&PREFIX.MDREND_STMT
&PREFIX.MDRSTMTERROR_END
&PREFIX.MDRPROGRAM_NOT_IN_SYNTAX_FILE
&PREFIX.MDRINVALID_CALLID
&PREFIX.MDRSYNTAX_FILE_NOT_FOUND
&PREFIX.MDRSTMTERROR_NEXT
&PREFIX.MDRINVARIANT_INPUT_TRUNCATED
&PREFIX.MDRXHCS_ERRORDie Syntax der Parameter von CMDRST ist nur in folgenden Punkten anders als bei RDSTMT:
Schlüsselwörter sind mit führendem Stern einzugeben (z.B. *YES)
Zeichenketten müssen in Hochkommas eingeschlossen werden (z.B. 'test')
Der Parameterwert *ADDR ist nicht mehr erlaubt ; es können nur Identifikatoren angegeben werden.
Beispiele für unterschiedliche Angaben
RDSTMT
CMDRST
PROGRAM = name
OUTPUT= addr/(r)
STMT
= *ALL/(name,...)/ (1))*ADDR(addr/(r))
PREFER = *NO/name/
*ADDR(addr/(r))
DEFAULT = *NO/(addr,...)
MESSAGE = *NO/addr/(r)
PROT = YES/NO
BUFFER = *NO/addr|(r)
INVAR = *NO/addr|(r)
SPIN = NO/YES
ERRSTMT = STEP/NEXT
CALLID = *NO/addr/(r)
CCSNAME = *NO/*EXTEND/name
MF = L
MF = (E,(1))/(E,param)
MF nicht angegeben (Standard-Form)
PROGRAM = 'name'
OUTPUT = identifier (2))
STMT = *ALL/identifier
PREFER = *NO/'name'/identifier
DEFAULT = *NO/identifier
MESSAGE = *NO/identifier
PROT = *YES/*NO
BUFFER = *NO/identifier
INVAR = *NO/identifier
SPIN = *YES/*NO
ERRSTMT = *STEP/*NEXT
CALLID = *NO/id
CCSNAME = *NO/*EXTEND/'name'/
identifier
MF = L
MF = E,PARAM=identifier
(nicht unterstützt)
1)Die Listenangabe bei STMT und DEFAULT ist nicht mehr möglich
2)identifier kann ein Label im Programm sein (Adresse), oder bei MF=M ein Register
Gleichzeitig mit der Einführung von CMDRST wurde das Format des normierten Übergabebereiches geändert. Im neuen Übergabebereich können wesentlich mehr Informationen abgelegt werden und die Ausrichtung der Daten ist gewährleistet. Deshalb sollten möglichst nur noch Übergabebereiche im neuen Format bei OUTPUT und auch bei DEFAULT angegeben werden. Aus Kompatibilitätsgründen unterstützt SDF natürlich weiterhin das alte Format des Übergabebereiches (siehe Parameter OUTFORM).
Wenn das Programm eigene Default-Werte an SDF übergibt, identifiziert SDF das Format des Übergabebereiches selbst:
Bei OUTFORM=*OLD muss der Programmteil zur Analyse des Übergabebereiches nicht geändert werden. Der Übergabebereich muss jedoch weiterhin mit CMDSTRUC generiert werden (siehe Kapitel „Anhang“).
Bei OUTFORM=*NEW ist es in manchen Fällen ausreichend, CMDSTRUC durch CMDTA zu ersetzen und das Programm erneut zu übersetzen. Die Felder in den DSECTs, die von CMDSTRUC generiert werden, sind zum Teil auch in CMDTA-generierten DSECTs enthalten. Sie finden eine Gegenüberstellung der alten und neuen DSECT beim Makro CMDTA („Migration von CMDSTRUC zu CMDTA“ (CMDTA Übergabebereich für eine analysierte Anweisung generieren)).