Der Makro CLIEXPR wertet arithmetische, logische und String-Ausdrücke aus. Der Ausdruck wird in einem Input-Feld übergeben, das Ergebnis wird in ein Output-Feld zurückgeschrieben. Es kann spezifiziert werden, wie das Ergebnis zurückgeliefert werden soll (Dualzahl, boolsche Konstante, String).
Der Makro kann auch mit MF=M aufgerufen werden. Nähere Erläuterungen zum Operanden MF=... siehe Handbuch „Makroaufrufe an den Ablaufteil“ [7].
Operation | Operanden |
CLIEXPR | MF = E |
MF = D [,PREFIX = C / prefix ] | |
MF = C ,PREFIX = C / prefix [,MACID = LIE / macid] | |
MF = L ,INPUT@ = <pointer> ,INPUTL = <integer 0..2147483647> ,OUTPUT@ = <pointer> ,OUTPUTL = <integer 0..2147483647> ,VFORM = *BY-VALUE / *STRING ,OTYPE = <pointer> ,OACTL = <pointer> ,PROT@ = NULL / <pointer> ,PROTL = 0 / <integer 0..2147483647> ,OPROTL = NULL / <pointer> |
Operandenbeschreibung
Die in der Beschreibung benutzte Bezeichnung <pointer> bedeutet immer eine Adressangabe in der Form A(symbolische Adresse) oder Register mit der Adresse. Diese Registerangabe ist nur in Verbindung mit MF=M möglich.
MF = E
E-Form; erzeugt einen SVC.
PARAM
Bezeichnet die Adresse der Operandenliste. (Makroaufruf mit MF=L).
= <name 1..27>
Bezeichnet die symbolische Adresse der Operandenliste
= (<integer 1..15>)
Register, das die Adresse der Operandenliste enthält.
MF = D
DSECT-Form; es wird eine DSECT zur Operandenliste generiert. Jedes Feld hat einen Feldnamen und erläuternde Equates, falls erforderlich.
PREFIX = C / prefix
Bezeichnet das erste Zeichen der Feldnamen; Voreinstellung = C.
MF = C
C-Form; es wird nur der Datenbereich (Operandenliste) generiert. Jedes Feld hat einen Feldnamen und erläuternde Equates, falls erforderlich. Der Standardheader muss vom Anwender initialisiert werden.
PREFIX = C / prefix
Bezeichnet das erste Zeichen der Feldnamen; Voreinstellung = C.
MACID = LIE / macid
Bezeichnet das zweite, dritte und vierte Zeichen der Feldnamen; Voreinstellung = LIE.
MF = L
List-Form; es wird nur der Datenbereich (Operandenliste) generiert, unter Beachtung der im Makroaufruf angegebenen Operandenwerte. Der Datenbereich enthält keine Feldnamen und keine erläuternden Equates. Der Standardheader ist initialisiert.
INPUT@ = <pointer>
Adresse des Feldes, das den auszuwertenden Ausdruck enthält. Der Ausdruck muss als String-Ausdruck angegeben werden. Das Feld muss auf Wortgrenze ausgerichtet sein.
INPUTL = <integer 0..2147483647>
Länge des Feldes mit dem auszuwertenden Ausdruck.
OUTPUT@ = <pointer>
Adresse des Feldes, in das das Ergebnis der Auswertung geschrieben werden soll. Das Feld muss auf Wortgrenze ausgerichtet sein.
OUTPUTL = <integer 0..2147483647>
Länge des Feldes für das Ergebnis. Die (wirkliche) Länge des Ergebnisses wird in das bei OACTL=... angegebene Feld eingetragen.
VFORM =
Bezeichnet die Art, wie das Ergebnis dargestellt werden soll (Dualzahl, boolsche Konstante oder String).
VFORM = *BY-VALUE
Integer-Zahlen werden als Dualzahl (4 Byte - Zahl) dargestellt.
Boolsche Konstanten werden durch X'00' (für FALSE) oder X'01' (für TRUE) dargestellt.
VFORM = *STRING
Integer-Zahlen werden als Folge von Dezimalziffern dargestellt.
Boolsche Konstanten werden durch den String 'FALSE' oder 'TRUE' dargestellt.
PROT@ = NULL / <pointer>
Adresse des Feldes, in das SDF-P-Meldungen geschrieben werden sollen. Mehrere Meldungen werden hintereinander geschrieben. Jeder Eintrag beginnt mit einem 2-Byte-Längenfeld, gefolgt von 2 Byte mit Füllzeichen und dem anschließenden Meldungstext. Voreinstellung: Ausgabe nach SYSOUT
Hinweis
Es werden nur Meldungen der Meldungsklasse SDP eingetragen; alle anderen Meldungen werden nach SYSOUT ausgegeben.
Die Meldungsform (Sprache, Kurz- oder Langform, usw.) ist abhängig von den Einstellungen des Kommandos /MODIFY-MSG-ATTRIBUTES.
PROTL = 0 / <integer 0..2147483647>
Länge des Feldes für die Meldungen. Überschreitet die Meldungsausgabe die angegebene Feldlänge, wird die Meldung nicht abgeschnitten, sondern die letzte Meldung nicht eingetragen. Voreinstellung: kein Eintrag.
Die (real) benötigte Länge wird in das bei OPROTL=... angegebene Feld eingetragen.
OACTL = <pointer>
Adresse eines Feldes, in das die wirkliche Länge des Ergebnisses eingetragen wird. Das Feld muss 4 Byte lang und auf Wortgrenze ausgerichtet sein.
OTYPE = <pointer>
Adresse eines Feldes, in das der Typ des Ergebnisses eingetragen wird. Das Feld muss 1 Byte lang sein. Die Einträge beginnen mit dem bei PREFIX=.. und MACID=.. angegebenen Zeichen. Bedeutung der Einträge:
Eintrag | Bedeutung (Typ) |
<prefix, macid>VSTR | String |
<prefix, macid>VINT | Integerzahl |
<prefix, macid>VBOO | boolsche Konstante |
OPROTL = NULL / <pointer>
Adresse eines Feldes, in das die wirkliche Meldungslänge eingetragen wird. Das Feld muss 4 Byte lang sein. Voreinstellung: kein Eintrag.
Hinweise
Die Ergebnisse sind immer einfache Werte (Basisterme). Es werden keine zusammengesetzten Ausdrücke zurückgeliefert.
Der auszuwertende Ausdruck darf keine &-Ersetzungen enthalten.
In das bei OTYPE=.. angegebene Feld wird immer der wirkliche Ergebnistyp eingetragen, auch wenn VFORM=*STRING angegeben wurde. Der Benutzer kann dadurch eine Ziffernfolge von einer Integerzahl oder den String „FALSE“ von dem boolschen Wert FALSE unterscheiden.
Returncodes
Die folgende Tabelle listet die Returncodes in hexadezimaler Schreibweise auf
Subcode2 | Subcode1 | Maincode | Bedeutung |
00 | 00 | 0000 | Normale Ausführung |
01 | 00 | 0000 | Überlauf: PROT-Feld (Warnung) |
00 | 40 | 0001 | Syntaxfehler im auszuwertenden Ausdruck |
01 | 40 | 0001 | Überlauf PROT-Feld |
00 | 40 | 0002 | Fehler beim Auswerten des Ausdrucks |
01 | 40 | 0002 | Überlauf: PROT-Feld |
00 | 40 | 0003 | OUTPUT-Feld zu klein |
00 | 01 | 0004 | INPUT-Feld nicht spezifiziert oder nicht ausgerichtet |
01 | 01 | 0004 | OUTPUT-Feld nicht spezifiziert oder nicht ausgerichtet |
02 | 01 | 0004 | Protokoll-Feld (nicht ausgerichtet) |
03 | 01 | 0004 | andere Felder (nicht ausgerichtet) |
04 | 01 | 0004 | Feldadresse angegeben, aber kein Zugriff möglich |
00 | 40 | 0005 | Kein ausreichend freier Platz im Adressraum des Aufrufers |
01 | 20 | 0006 | Systemfehler |
00 | 40 | 0007 | Ungültiges Prozedurformat; Makroausführung abgebrochen |
00 | 01 | FFFF | Falsche Angabe für UNIT oder FUNCTION im Standardheader |
00 | 02 | FFFF | Die angeforderte Funktion wird nicht unterstützt |
00 | 03 | FFFF | Falsche Versionsangabe im Standardheader |
Layout der Dsect (Operandenliste)
CLIEXPR MF=D,PREFIX=N 1 MFTST MF=D,PREFIX=N,MACID=LIE,ALIGN=F, 1 DMACID=LIE,SUPPORT=(E,D,C,M,L),DNAME=LIEMDL 2 NLIEMDL DSECT , 2 *,##### PREFIX=N, MACID=LIE ##### 1 * Which type has the output 1 NLIEVSTR EQU 1 *STRING 1 NLIEVINT EQU 2 *INTEGER 1 NLIEVBOO EQU 3 *BOOLEAN 1 * 1 * parameterarea description 1 NLIEHDR FHDR MF=(C,NLIE),EQUATES=NO Standardheader 2 NLIEHDR DS 0A 2 NLIEFHE DS 0XL8 0 GENERAL PARAMETER AREA HEADER 2 * 2 NLIEIFID DS 0A 0 INTERFACE IDENTIFIER 2 NLIEFCTU DS AL2 0 FUNCTION UNIT NUMBER 2 * BIT 15 HEADER FLAG BIT, 2 * MUST BE RESET UNTIL FURTHER NOTICE 2 * BIT 14-12 UNUSED, MUST BE RESET 2 * BIT 11-0 REAL FUNCTION UNIT NUMBER 2 NLIEFCT DS AL1 2 FUNCTION NUMBER 2 NLIEFCTV DS AL1 3 FUNCTION INTERFACE VERSION NUMBER 2 * 2 NLIERET DS 0A 4 GENERAL RETURN CODE 2 NLIESRET DS 0AL2 4 SUB RETURN CODE 2 NLIESR2 DS AL1 4 SUB RETURN CODE 2 2 NLIESR1 DS AL1 5 SUB RETURN CODE 1 2 NLIEMRET DS 0AL2 6 MAIN RETURN CODE 2 NLIEMR2 DS AL1 6 MAIN RETURN CODE 2 2 NLIEMR1 DS AL1 7 MAIN RETURN CODE 1 2 NLIEFHL EQU 8 8 GENERAL OPERAND LIST HEADER LENGTH 2 * 1 * main return codes 1 NLIESUCC EQU 0 No error detected 1 NLIESYNT EQU 1 Syntax error 1 NLIEEVAL EQU 2 Semantic error 1 NLIETRUN EQU 3 Output buffer too small 1 NLIEAREA EQU 4 Buffer missing or not aligned 1 * or not accessible 1 NLIEREQM EQU 5 Out of memory 1 NLIEDUMP EQU 6 Invalid SDF-P-BASYS 1 * processing 1 NLIECTXT EQU 7 Old procedure context 1 * 1 NLIEIPTR DS A SDF-P expression 1 NLIEOPTR DS A Resulting Value 1 NLIEPPTR DS A Resulting Protocol 1 NLIEILEN DS F SDF-P expression 1 NLIEOMAX DS F Value attribute (maximum 1 * length) 1 NLIEPMAX DS F Protocol attribute (maximum 1 * length) 1 NLIEFORM DS FL1 Value attribute ( string 1 * generation ) 1 * Wished output form 1 NLIEFVAL EQU 0 *BY-VALUE 1 NLIEFSTR EQU 1 *STRING 1 * 1 NLIERES1 DS CL7 Alignement 1 NLIEOLEN DS A Value length as FW-aligned 4 1 * bytes field 1 NLIEOTYP DS A Value type as 1 byte field 1 NLIEPLEN DS A Protocol length as FW-aligned 1 * 4 bytes field 1 NLIE# EQU *-NLIEHDR
Beispiel
CLIEXPR START BALR 3,0 USING *,3 CLIEXPR MF=E,PARAM=OPLISTE WROUT WROUT AUSG,TERM,PARMOD=31 TERM TERM ***** DEFINITIONEN ***** OPLISTE CLIEXPR MF=L,INPUT@=A(IF),INPUTL=10,OUTPUT@=A(OF),OUTPUTL=10,V- FORM=*BY-VALUE,OACTL=A(H1),OTYPE=A(H2) DS 0F IF DC CL10'(8+3)' DS 0F AUSG DC Y(AUSGE-AUSG) DS 3X DC C'AUSGABE: ' OF DS cl10 AUSGE EQU * DS CL10 DS 0F H1 DS CL4 DS 0F H2 DS CL1 END