Der Makro TRSTMT bewirkt, dass SDF
eine Programmanweisung, die im Programm selbst abgelegt ist, analysiert und
das Analyseergebnis an das Programm übergibt.
Bei der Analyse der übergebenen Anweisung können zusätzliche Anweisungen entstehen, indem ein System-Exit die übergebene Anweisung durch mehrere Anweisungen ersetzt. Die Behandlung dieser zusätzlichen Anweisungen liegt in der Verantwortung des Programms.
Voraussetzung ist, dass eine aktivierte Syntaxdatei die Definition des Programms und seiner Anweisungen enthält.
Operation | Operanden | |||||||
TRSTMT | PROGRAM = name ,INPUT = *NO / addr / (r1) ,OUTPUT = addr / (r2) [ ,STMT = *ALL / (name,...) / *ADDR(addr/(r)) ] [ ,DIALOG =NO / YES / ERROR ] [ ,MESSAGE = *NO / addr / (r3) ] [ ,PROT = *NO / *YES / addr / (r4) ] [ ,INVAR = *NO / addr / (r) ] [ ,DEFAULT = *NO / (addr,...) ] [ ,ERROR = NO / YES ] [ ,CALLID = *NO / addr / (r7) ] [ ,EXECUTE = NO / YES ] [ ,PROCMOD = ANY / NO / YES ] [ ,CCSNAME = *NO / *EXTEND / name ] [ ,INPUTSAV = *NO / YES ]
|
PROGRAM = name
interner Name des Programms, das durch den Makroaufruf ausgeführt wird. In der Syntaxdatei ist dieser Name in der Programmdefinition abgelegt (siehe ADD-PROGRAM). Er ist mindestens ein und maximal acht Byte lang.
INPUT =
bestimmt, welche Anweisung SDF analysieren soll.
*NO
SDF soll keine im Programm abgelegte Anweisung analysieren, sondern eine durch System-Exit zusätzlich bereitgestellte Anweisung.
addr / (r1)
SDF soll die Anweisung analysieren, deren Adresse angegeben ist bzw. in dem angegebenen Register steht. SDF erwartet die Anweisung als Satz variabler Länge im üblichen BS2000-Format. Der Satzbereich muss auf Halbwortgrenze ausgerichtet sein.
OUTPUT = addr / (r2)
Adresse des normierten Übergabebereichs bzw. Register, das diese Adresse enthält. Der Bereich muss auf Wortgrenze beginnen. Das Programm muss vor Aufruf des Makros TRSTMT dafür sorgen, dass in den ersten zwei Byte dieses Bereichs die maximal mögliche Bereichslänge steht (siehe Abschnitt „Format des normierten Übergabebereiches bis SDFV4.0“). SDF legt in dem Bereich das Analyseergebnis ab.
STMT =
bestimmt, welche Anweisungen als Eingabe zulässig sind.
*ALL
Alle Anweisungen sind zulässig.
(name,...)
Nur die Anweisungen, deren interner Anweisungsname angegeben ist, sind zulässig. Der interne Anweisungsname ist in der Syntaxdatei in der Anweisungsdefinition abgelegt (siehe Anweisung 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.
*ADDR(addr/(r))
Adresse der Liste der zulässigen Anweisungen. Diese Liste muss mit dem Makro
CMDALLW generiert worden sein.
DIALOG =
bestimmt, ob SDF bei der Anweisungsanalyse einen Dialog führen soll. Dieser Operand ist nur relevant, wenn das Programm in einer interaktiven Task abläuft.
NO
SDF soll keinen Dialog führen.
YES
SDF soll die vom Programm übergebene Anweisung dem Benutzer im Dialog zu einer eventuellen Änderung anbieten, soweit das mit den geltenden SDF-Festlegungen für den Dialog verträglich ist (siehe MODIFY-SDF-OPTIONS und SET-GLOBALS).
ERROR
SDF soll nur beim Erkennen von Syntaxfehlern einen Dialog führen. Falls die Anweisung Semantikfehler enthält, kann das Programm mit CORSTMT einen Semantikfehlerdialog anstoßen.
MESSAGE =
bestimmt, ob SDF eine Meldung ausgeben soll, wenn dem Benutzer die Anweisung zur Überprüfung und ggf. Änderung angeboten wird (nur relevant für DIALOG !=
*NO). SDF integriert diese Meldung in den Fragebogen.
*NO
SDF soll keine Meldung ausgeben.
addr / (r3)
Adresse des auszugebenden Meldungstextes bzw. Register, das diese Adresse enthält. Der Text wird als Satz variabler Länge erwartet, die maximale Länge beträgt 400 Zeichen. In SDF-formatierten Bildschirmen werden jedoch nur die ersten 80 Zeichen dargestellt. Enthält der Text Bildschirmsteuerzeichen, so kann die Menü-Maske zerstört werden. Der Satzbereich muss auf Halbwortgrenze ausgerichtet sein.
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. Dieser Parameter ist im Gegensatz zum RDSTMT-Makro als Ganzzahlwert implementiert (Byte-Feld). Ein Protokollpuffer kann bereitgestellt werden.
*NO
SDF soll keine Protokollierung durchführen.
*YES
SDF soll zu protokollierende Eingaben und Meldungen nach SYSOUT schreiben.
addr / (r4)
Adresse eines Puffers oder Register, das die Adresse enthält. SDF soll die zu protokollierenden Eingaben und Meldungen in diesen Puffer schreiben. Der Puffer muss an einer Halbwortgrenze beginnen. Die Länge des Puffers steht in den Bytes 0 und 1, die Länge des zu protokollierenden Satzes in Byte 2 und 3.
Wenn der Puffer nicht leer ist, ist der erste Datensatz normalerweise das Protokoll des Eingabe-Kommandos. Die weiteren Datensätze enthalten Meldungen aller Art. Wenn kein Eingabeprotokoll zur Verfügung steht oder ausgegeben werden kann, wird ein doppelter Schrägstrich („//“) in den Ausgabebereich geschrieben.
Der PROT-Parameter hat folgende Wirkung:
Ergebnis der Analyse | PROT-Parameter | |
YES (oder addr / reg) | NO | |
Kein Fehler: | Eingabeanweisung | – / – |
Syntaxfehler: | 1. Eingabeanweisung | – / – |
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. 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. Im Gegensatz zur Protokollierungsform LOGGING= INVARIANT-FORM (siehe MODIFY-SDF-OPTIONS) werden Kennwörter und geheime Operanden jedoch nicht ausgeblendet.
INVAR = *NO
Die INVARIANT-INPUT-Form der Anweisung wird nicht abgespeichert.
INVAR = addr / (r)
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:
1. HW
2. HW 3. HW (Halbwort)
buflen | reclen | filler | invariant-input |
buflen: | Länge des Puffers |
reclen: | Länge des Satzes, den SDF schreibt |
filler: | Füllzeichen |
invariant-input: | INVARIANT-INPUT-Form der Anweisung, beginnt beim 7. Byte. |
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 Wert muss gültiger Operandenwert sein. Im geführten Dialog zeigt SDF die vom Programm erzeugten Werte im Fragebogen.
Beispiel:
In den eingegebenen MODIFY-Anweisungen für SDF-A wird der Wert *UNCHANGED durch den aktuellen Wert ersetzt. Stehen die mit einem Standardwert zu versehenden 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 Operanden hängt, die mit einem Standardwert zu versehen sind. Auf der anderen Seite gibt der Anwender ebenfalls mehrere Listenelemente ein, an denen eine Struktur mit eben solchen Operanden hängt.
SDF versucht zunächst, die vom Anwender 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 Anwender den übereinstimmenden Wert mehrfach eingegeben hat, so erfolgt die Zuordnung über die Position des Struktureinleiters in der Liste.
*NO
SDF soll die angegebenen Operandenwerte nicht durch vom Programm dynamisch erzeugte Werte ersetzen.
(addr,...)
In einer oder in mehreren der möglichen Anweisungen soll SDF angegebene Operandenwerte durch vom Programm dynamisch erzeugte Werte ersetzen. Unter den angegebenen Adressen (adr51,...) stehen in dem Programm die Umsetzbeschreibungen für diese Anweisungen (siehe Abschnitt „Format des normierten Übergabebereiches bisSDF V4.0“). Je Anweisung kann nur eine einzige Umsetzbeschreibung angegeben werden. Eine Umsetzbeschreibung enthält u.a. den internen Anweisungsnamen und die Information, welche angegebenen Operandenwerte in welche Werte umzusetzen sind. Die Bereiche für die Umsetzbeschreibungen, die für die Default-Werte des Programms übergeben werden, müssen auf Wortgrenze ausgerichtet sein. Dies gilt auch für den Ausgabebereich der Makros (Operand OUTPUT).
ERROR =
bestimmt, wie der beim Operanden MESSAGE angegebene Meldungstext ausgegeben wird.
NO
SDF soll den Meldungstext als Meldung ausgeben.
YES
SDF soll den Meldungstext als Fehlermeldung ausgeben.
CALLID =
bestimmt, welcher Kontext von SDF benutzt wird, um das Kommando zu analysieren.
*NO
Die gegenwärtig aktivierte Syntaxdateihierarchie wird verwendet.
addr / (r7)
Adresse eines 4 Byte langen Feldes oder Register, das diese Adresse enthält. Der Aufrufende übermittelt die CALLID des Kontextes, den er verwenden will. Dieses Feld muss auf Wortgrenze ausgerichtet sein.
EXECUTE = NO / YES
bestimmt, ob SDF-Standardanweisungen ausgeführt werden. EXECUTE ist ohne Bedeutung, wenn der TRSTMT-Makro keinen Bezug auf eine neue Syntaxdateihierarchie nimmt (CALLID=*NO), z.B. wenn die aktuelle Syntaxdateihierarchie verwendet wird. Dann werden die SDF-Standardanweisungen immer von TRSTMT ausgeführt (vorausgesetzt, sie sind in der aktuellen Syntaxdateihierarchie vorhanden). Der Operand gehört zum multihierarchischen Merkmal, das mit dem vorangehenden Operanden CALLID eingeleitet wird. Bezieht sich TRSTMT auf eine parallel eröffnete Syntaxdateihierarchie (CALLID= adr7 / (r7)), werden die SDF-Standardanweisungen bei EXECUTE=ES ausgeführt.
PROCMOD =
bestimmt, in welcher Umgebung der Benutzer arbeitet. SDF führt eine Prüfung durch: Anweisungen, die in der angegebenen Umgebung nicht erlaubt sind, werden von SDF nicht akzeptiert. Der Operand nimmt Bezug auf die Möglichkeit, mehrere Syntaxdateihierarchien zu eröffnen. Er ist nur von Bedeutung, wenn der Makro-Aufruf sich auf eine neue Syntaxdateihierarchie bezieht, die zusätzlich zur aktuellen eröffnet wurde. Ist keine CALLID bestimmt (CALLID=*NO), hat PROCMOD keine Bedeutung; z.B. wird der Wert ANY automatisch gesetzt und auf den aktuellen Prozedurmodus Bezug genommen.
ANY
Es wird keine Überprüfung vorgenommen. Anweisungen werden immer analysiert.
YES
Anweisungen werden so behandelt, als würden sie aus einer Prozedurdatei gelesen. Sie werden z.B. analysiert, wenn sie in der Syntaxdatei mit DIALOG-PROC-ALLO-WED=YES definiert sind und wenn das Programm im Dialog arbeitet, oder bei BATCH-PROC-ALLOWED=YES in Stapelaufträgen.
NO
Anweisungen werden so behandelt, als würden sie von einer Hauptebene (primary level) gelesen, z.B. von der Bildschirmeingabe oder aus einem Stapelauftrag. Sie werden analysiert, wenn sie in der Syntaxdatei mit DIALOG-ALLOWED=*YES definiert wurden und wenn das Programm im Dialog läuft, oder bei BATCH-ALLOWED=*YES in Stapelaufträgen.
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.
name
Gibt den Namen eines speziellen 8-bit-Code an, der für Ein-/Ausgabeoperationen verwendet wird. Der Name muss 8 Byte lang sein.
INPUTSAV =
gibt an, ob die letzten Eingaben in einer Liste gespeichert werden. Auf diese Liste kann mit Hilfe eines RESTORE-Mechanimus erneut zugegriffen werden (siehe Anweisungen MODIFY-SDF-OPTIONS und RESTORE-SDF-INPUT).
*NO
Die Eingaben werden nicht gespeichert.
*YES
Die Eingaben werden in einem Puffer gespeichert.
MF =
definiert besondere Anforderungen an die Makroauflösung (siehe Benutzerhandbuch
„Makroaufrufe an den Ablaufteil“ [8]).
L
Es wird nur der Datenteil der Makroauflösung (Operandenliste) generiert. Das erfordert, dass im Makroaufruf keine Operandentypen mit ausführbarem Code auftreten. Der generierte Datenteil hat die im Namensfeld des Makroaufrufs angegebene
Adresse.
(E,(1)) / (E,opadr)
Es wird nur der Befehlsteil der Makroauflösung generiert. Auf den zugehörigen Datenteil (Operandenliste) wird mit der Adresse „opadr“ verwiesen. Diese steht entweder in Register 1 oder wird direkt angegeben.
Rückinformation und Fehleranzeigen
Der Aufbau des Übergabebereichs ist auf den Format des normierten Übergabebereiches bis SDF V4.0 beschrieben.
Register 15 enthält im rechtsbündigen Byte einen Returncode, im linksbündigen Byte einen Indikator über die Existenz zusätzlicher Anweisungen. EQUATE-Anweisungen dafür können mit dem Makro CMDANALY generiert werden.
X’00’ X’04’ X’08’ X’0C’ X’18’ | normale Beendigung nicht behebbarer Systemfehler Operandenfehler im Makroaufruf Übergabebereich zu klein Anweisung ist zwar in Ordnung, die vom Programm übergebenen Default-Werte |
X’1C’ X’20’ X’24’ X’28’ X’2C’ X’38’ X’3C’ X’44’ X’48’ X’4C’ | Anweisung fehlerhaft Fehlerdialog nicht möglich Fehlerdialog wurde abgelehnt Fehler- oder Protokollbereich zu klein END-Anweisung wurde gelesen SDF ist nicht verfügbar Programm in Syntaxdatei nicht bekannt Syntaxdatei nicht gefunden SDF-Kommando (oder -Anweisung) ausgeführt Das Programm ist oberhalb der 16 MByte-Grenze nicht ablauffähig, weil SDF nicht |
X’5C’ X’64’ | INVAR-Puffer zu klein, INVARIANT-INPUT abgeschnitten XHCS-Fehler |
Indikator für zusätzliche Anweisungen (durch System-Exit):
X’00’ X’01’ | es existieren keine weiteren Anweisungen es existieren weitere Anweisungen |