Der Makro CMDVAL prüft, ob ein Wert zu einer SDF-Datentyp-Beschreibung passt. Der Makro übergibt das Resultat der Überprüfung und, wenn angefordert, eine SDF-Fehlermeldung in den Puffer PROT. Die Fehlermeldungen werden nicht auf SYSOUT ausgegeben. Zusätzlich kann überprüft werden, ob die Eingabezeichenfolge zu einem vorgegebenen Wildcard-Suchmuster passt.
Operation | Operanden |
CMDVAL | INPUT = addr [ ,DATATYP = NOCHECK / INTEGER / INT64 / XSTRING / CSTRING / NAME / ALPHANAME / STRUCNAME / FILENAME / PARTFILE / TIME / DATE / COMPNAME / TEXT / CATID / KEYWORD / KEYNUMBER / VSN / XTEST / FIXED / DEVICE / PRODVERS / PPOSIXPATH / POSIXFILE ][ ,SHORTST = *ANY / integer] [ ,LONGEST = *ANY / integer] [ ,WCLOGL = *NONE / integer] [ ,LOWDEC = 0 / integer] [ ,HIGDEC = 0 / integer] [ ,CONST = *NO / addr / (addr, ...)] [ ,PATTERN = *NO / addr] [ ,ATTRIB = { *NONE / ([NOCATID] [,NOUSERID] [,NOGENERATION] | [,NOVERSION] [,WILDCARD] [,KEYSTAR][,NOSEPERATORS] [,UNDERSCORE] [,NOODD] [,NOALIAS] [,VOLUMEONLY] [,NOUSERINT] | [,NOCORSTATE] [,ANYCORSTATE] [,WILDCONST] [,LOWERCASE] [,TEMPFILE] [,QUOTESMAND] [,ANYUSERINT] [,STDDISK])][ ,DEVCLAS = list-poss(2): DISK / TAPE ] [ ,EXCDISK = *NONE / addr / (text8,...) ] [ ,EXCTAPE = *NONE / addr / (text8,...) ] [ ,PROT = *NO / addr] [ ,PREFIX = C / p ] [ ,MACID = MDV / mac] [ ,MF = D / C / L / E ] [ ,PARAM = addr ] |
INPUT = addr
Zeichenfolge eines Wertes im variablen Satzformat (erstes Halbwort: Länge des Satzes, zweites Halbwort: Zeichen, mit dem auf die angegebene Satzlänge aufgefüllt wurde). Leerzeichen als Teil des Eingabewerts sind nicht erlaubt (Ausnahme: Leerzeichen innerhalb eines Wertes vom Typ <c-string> oder <text>).
addr muss auf Wortgrenze ausgerichtet sein.
DATATYP =
Angabe des Datentyps, auf den der Wert überprüft wird (siehe auch Anweisung ADD-VALUE TYPE=...).
NOCHECK
Keine Datentypüberprüfung erfolgt. Es soll nur geprüft werden, ob die eingegebene Zeichenfolge zu einem Wildcard-Suchmuster passt. Der Parameter PATTERN ist bei Angabe von NOCHECK Pflichtparameter.
Die folgende Tabelle zeigt die möglichen Datentypüberprüfungen:
DATATYP = | Datentyp, auf den der Wert überprüft wird |
INTEGER | <integer> |
INT64 | <long-integer> |
XSTRING | <x-string> |
CSTRING | <c-string> |
NAME | <name> |
ALPHANAME | <alphanum-name> |
STRUCNAME | <structured-name> |
FILENAME | <filename> |
PARTFILE | <partial-filename> |
TIME | <time> |
DATE | <date> |
COMPONAME | <composed-name> |
CATID | <cat-id> |
TEXT | Auf den Datentyp <text> wird der Wert geprüft, wenn er in einer Operation als Stellungsoperand eingegeben wurde. Falls Trennzeichen im Wert an falscher Stelle stehen, ist er unzulässig. |
KEYWORD | <keyword> |
KEYNUMBER | <keyword-number> |
VSN | <vsn> |
XTEXT | <x-text> |
FIXED | <fixed> |
DEVICE | <device> |
PRODVERS | <product-version> |
POSIXPATH | <posix-pathname> |
POSIXFILE | <posix-filename> |
SHORTST =
Bestimmt, ob die Zeichenfolge eine Mindestlänge haben muss (siehe ADD-VALUE
TYPE=...,(SHORTEST-LENGTH=...)). Für die Datentypen DATE, TIME, CATID, KEY-WORD und KEYNUMBER hat dieser Parameter keine Bedeutung. Beim Datentyp XST-RING ist SHORTST die Anzahl von Bytes im Wert, der bei INPUT angegeben ist. Beim Datentyp INTEGER oder INT64 gibt SHORTST die untere Grenze des Wertebereiches an, beim Datentyp FIXED wird SHORTST mit dem Parameter LOWDEC kombiniert. Für diese beiden Datentypen kann eine Integer-Zahl mit Vorzeichen angegeben werden.
*ANY
Die von SDF vorgegebenen Grenzen gelten für den Datentyp.
integer
Explizite Angabe der Mindestlänge.
LONGEST =
Bestimmt, ob die Zeichenfolge eine Maximallänge nicht überschreiten darf (siehe ADD-VALUE TYPE=... (LONGEST-LENGTH=...)). Für die Datentypen DATE, TIME, CATID, KEYWORD und KEYNUMBER hat dieser Parameter keine Bedeutung. Beim Datentyp XSTRING ist LONGEST die Anzahl von Bytes im Wert, der bei INPUT angegeben ist. Beim Datentyp INTEGER gibt LONGEST die obere Grenze des Wertebereiches an, beim Datentyp FIXED wird LONGEST mit dem Parameter HIGDEC kombiniert. Für diese beiden Datentypen kann eine Integer-Zahl mit Vorzeichen angegeben werden.
*ANY
Die von SDF vorgegebenen Grenzen gelten für den Datentyp.
integer
Explizite Angabe der Maximallänge.
WCLOGL =
Nur relevant für ATTRIB=WILDCARD. Der bei INPUT angegebene Wert kann Wildcards enthalten. WCLOGL gibt die maximale Länge der Werte an, zu dem das Wildcard-Suchmuster passt, während LONGEST die tatsächliche Länge des Eingabewertes festlegt. Für die Datentypen POSIXPATH und POSIXFILE hat dieser Parameter keine Bedeutung.
*NONE
Die von SDF vorgegebenen Grenzen gelten.
integer
Explizite Angabe der Maximallänge.
LOWDEC= 0 / integer
Gibt die Anzahl von Dezimalstellen beim Parameter SHORTST an und ist nur relevant beim Datentyp FIXED.
HIGDEC = 0 / integer
Gibt die Anzahl von Dezimalstellen beim Parameter LONGEST an und ist nur relevant beim Datentyp FIXED.
CONST = *NO / addr / (addr,...)
Der INPUT-Wert wird mit den hier festgelegten Konstanten verglichen. CONST ist nur für DATATYP=NOCHECK relevant. Die Konstantenwerte müssen in Sätzen mit variabler Satzlänge abgelegt sein. Ist der INPUT-Wert vom Datentyp KEYWORD oder KEYNUMBER, so kann er auch eine Abkürzung einer der Konstanten sein. Listen werden jedoch nicht unterstützt. Es können maximal 2000 Konstanten angegeben werden. Die Minimal- und Maximallänge der Konstanten richtet sich nach den Standardvorgaben für die SDF-Datentypen.
addr
Die Satzadressen sind in einem Feld zusammengefasst, das an der Adresse addr beginnt. Das Feld muss auf Wortgrenze ausgerichtet sein und es muss folgendes Format haben:
Byte | Bedeutung |
0 | Anzahl der Elemente im Feld (N, 2 Byte lang) |
2 | Füllzeichen |
4 | Adresse des 1. Satzes (auf Wortgrenze ausgerichtet) |
8 | Adresse des 2. Satzes (auf Wortgrenze ausgerichtet) |
... | |
N*4 | Adresse des N. Satzes (auf Wortgrenze ausgerichtet) |
(addr,...)
Die Satzadressen werden in einer Liste angegeben.
PATTERN = *NO / addr
Der INPUT-Wert wird mit einem Wildcard-Suchmuster verglichen.
Falls eine Überprüfung auf einen Datentyp verlangt ist, müssen die Syntaxregeln für Wildcards für diesen Datentyp eingehalten werden (u.a. die maximale Länge des Wildcard-Ausdruckes).
Bei DATATYP=NOCHECK wird nur überprüft, ob der INPUT-Wert zum angegebenen Wild-card-Suchmuster passt (keine Überprüfung auf einen Datentyp). Die Länge des Wildcard-Suchmusters ist hierfür nicht begrenzt. Die Angabe von Wildcards ist nicht für alle Datentypen erlaubt (siehe Anweisung ADD-VALUE TYPE=...).
PATTERN darf nicht zusammen mit ATTRIB=(...,WILDCARD,...) angegeben werden.
Für DATATYPE=POSIXPATH oder POSIXFILE gilt nicht die BS2000-Wildcardsyntax, sondern eine spezielle POSIX-Wildcardsyntax. Für diese beiden Datentypen darf PATTERN nicht angegeben werden.
PATTERN = addr
Gibt die Adresse eines Satzes mit variabler Satzlänge an, in dem das Wildcard-Suchmuster abgelegt ist. addr muss auf Wortgrenze ausgerichtet sein. Der Wert im Satzlängenfeld des V-Record ist die Summe aus der exakten Länge des Suchmusters und der Länge des Satzfeldes (z.B. für „ABC*“ hat das Satzlängenfeld den Wert 4+4=8). Leerzeichen sind im Suchmuster nicht erlaubt.
ATTRIB = (...)
Gibt eine Liste von Attributen an, die für den Datentyp gelten soll. Unzulässige Kombinationen werden mit einer Fehlermeldung abgewiesen. Die Attribute müssen in runden Klammern eingeschlossen sein. Das gilt auch dann, wenn die Liste nur ein Attribut enthält. Nähere Informationen siehe Anweisung ADD-VALUE. Folgende Attribute sind möglich:
Attribut | Bedeutung und möglicher Datentyp |
*NONE | Für die Attribute gelten die SDF-Standardvorgaben. |
NOCATID | Die Angabe der Katalogkennung ist nicht erlaubt |
NOUSERID | Die Angabe der Benutzerkennung ist nicht erlaubt |
NOGENERATION | Die Angabe der Generationsnummer ist nicht erlaubt (Datentyp <filename>). |
NOVERSION | Die Angabe der Versionsbezeichnung ist nicht erlaubt (Datentyp <filename>). |
WILDCARD | Wildcards dürfen angegeben werden. Das Attribut WILDCARD darf nicht |
KEYSTAR | Ein Stern muss der Eingabezeichenfolge vorangestellt sein |
NOSEPERATORS | Trennzeichen sind nicht erlaubt (Datentyp <text>). |
UNDERSCORE | Der Unterstrich ’_’ ist erlaubt (<name>, <composed-name>). |
NOODD | Eine ungerade Anzahl von Zeichen darf eingegeben werden (<x-text>). |
NOALIAS | Die Angabe des Alias-Namens ist nicht erlaubt (Datentyp <device>). |
VOLUMEONLY | Der Volumetyp wird akzeptiert (Datentyp <device>). |
NOUSERINT | Die Angabe der Benutzerschnittstelle ist nicht erlaubt |
NOCORSTATE | Die Angabe des Korrekturstandes ist nicht erlaubt |
ANYCORSTATE | Der Korrekturstand kann bei <product-version> angegeben werden. |
WILDCONST | Der Wert kann ein Wildcard-Konstruktor sein (siehe ADD-VALUE |
LOWERCASE | Kleinbuchstaben bleiben erhalten (Datentyp <name>). |
NOTEMPFILE | Temporäre Dateinamen sind nicht erlaubt (Datentyp <filename>). |
QUOTESMAND | POSIX-Pfad- und Dateinamen müssen in Hochkommas eingeschlossen sein. |
ANYUSERINT | Der Freigabestand der Benutzerschnittstelle kann angegeben werden |
STDDISK | Nur Standard-Plattengeräte verwenden (Datentyp <device>). |
DEVCLAS = DISK / TAPE
gibt die Geräteklasse an (Datentyp <device>, siehe Anweisung ADD-VALUE TYPE=*DEVICE(...)).
EXCDISK = *NONE / addr / (text8,...)
gibt die verbotenen Plattengeräte an (Datentyp <device>). Maximal 50 Namen können angegeben werden.
addr
gibt die Adresse eines auf Wortgrenze ausgerichteten Feldes an, in dem die Gerätenamen zusammengefasst sind. Das erste Halbwort im Feld enthält die Anzahl der Elemente im Feld, das zweite Halbwort enthält das Füllzeichen. Die Gerätenamen, die daran anschließen, sind jeweils 8 Byte lang und dürfen keine Trennzeichen enthalten. Sind die realen Gerätenamen kürzer als 8 Zeichen, so müssen sie linksbündig eingetragen und mit Leerzeichen auf die volle Länge aufgefüllt werden.
EXCDISK = (text8,...)
gibt eine Liste von 8 Zeichen langen Gerätenamen an. Für die Gerätenamen müssen die Syntaxregeln des Datentyps <text-without-sep> eingehalten werden.
EXCTAPE = *NONE / addr / (text8,...)
gibt die verbotenen Bandgeräte an. Der Parameter wird nur zusammen mit DEVICE=TAPE verwendet (siehe ADD-VALUE TYPE=*DEVICE(...)). Maximal 50 Namen können angegeben werden.
addr
gibt die Adresse eines auf Wortgrenze ausgerichteten Feldes an, in dem die Gerätenamen zusammengefasst sind. Das erste Halbwort im Feld enthält die Anzahl der Elemente im Feld, das zweite Halbwort enthält das Füllzeichen. Die Gerätenamen, die daran anschließen, sind jeweils 8 Byte lang und dürfen keine Trennzeichen enthalten. Sind die realen Gerätenamen kürzer als 8 Zeichen, so müssen sie linksbündig eingetragen und mit Leerzeichen auf die volle Länge aufgefüllt werden.
EXCTAPE = (text8,...)
gibt eine Liste von 8 Zeichen langen Gerätenamen an. Für die Gerätenamen müssen die Syntaxregeln des Datentyps <text-without-sep> eingehalten werden.
PROT = *NO / addr
Satz mit variabler Satzlänge, in den SDF die Fehlermeldung für den überprüften Wert ablegt. addr muss auf Wortgrenze ausgerichtet sein. Zum Inhalt des Satzes siehe Makro
CMDRST, Parameter BUFFER ("CMDRST Anweisung lesen und analysieren").
Zur Beschreibung der Parameter PREFIX, MACID, MF und PARAM siehe Typen von Makroaufrufen.
Mögliche Aufrufe
[label] CMDVAL MF=D [,PREFIX=p][,MACID=mac] [label] CMDVAL MF=C [,PREFIX=p][,MACID=mac] [label] CMDVAL MF=L,... [label] CMDVAL MF=E,PARAM=addr
Der Makro CMDVAL ist mit Standardheader implementiert. Die Form MF=S wird deshalb nicht angeboten.
Registerverwendung
Register 1: Adresse der Parameterliste
Register 15: Returncode, der zusätzlich auch im Standardheader übergeben wird
Rückinformation und Fehleranzeigen
Der Returncode wird im Standardheader des Parameterbereiches übergeben.
Standardheader | cc: Subcode 2 (SC2) |
(SC2) | SC1 | Maincode | Bedeutung |
---|---|---|---|
00 | 00 | 0000 | Überprüfter Wert passt zu Datentyp und/oder Wildcard-Suchmuster |
01 | 01 | 0008 | Der Parameter INPUT ist fehlerhaft |
02 | 01 | 0008 | Eine Adresse ist fehlerhaft (nicht zugewiesen,nicht auf Wortgrenze ausgerichtet,...) |
03 | 01 | 0008 | Fehlerhafte Angaben für:
|
04 | 01 | 0008 | Fehlerhafte Angaben für Wertebereiche:
|
05 | 01 | 0008 | Der Parameter PATTERN ist fehlerhaft (Länge=0, Syntax fehlerhaft) |
06 | 01 | 0008 | Fehler im Parameter CONST |
xx | 40 | 001C | Überprüfter Wert passt nicht zum Datentyp und/oder zum Wildcard- Suchmuster. Im Puffer PROT wurde eine SDF-Fehlermeldung hinterlegt. Der Eingabewert war: |
01 | 40 | 001C |
|
02 | 40 | 001C |
|
03 | 40 | 001C |
|
04 | 40 | 001C |
|
05 | 40 | 001C |
|
Hinweise
Ist der Puffer PROT zu klein, so werden die SDF-Fehlermeldungen abgeschnitten. Es liegt in der Verantwortung des Aufrufers, diese Situation zu erkennen und darauf zu reagieren.
Bei Überprüfung von Dateinamen mit Dateigenerationsnummer auf Übereinstimmung mit einem Wildcard-Suchmuster ist die folgende Tabelle zu beachten. Die Tabelle enthält die zurzeit geltenden Möglichkeiten, bei denen eine Übereinstimmung möglich ist. Zu Dateigenerationsgruppen (fgg, file generation group) siehe Benutzerhandbuch „Einführung in das DVS“ [7].
INPUT-Zeichenfolge
PATTERN-Zeichenfolge
Übereinstimmung möglich?
ohne fgg
ohne fgg
mit fggja
neinmit absoluter fgg
(abs_fgg (*nnnn))ohne fgg
mit abs_fgg (*nnnn)
mit rel_fgg (+/-nn)ja
ja, wenn (*nnnn) übereinstimmt
neinmit relativer fgg
(rel_fgg (+/-nn)ohne fgg
mit abs_fgg (*nnnn)
mit rel_fgg (+/-nn)ja
nein
ja, wenn (+/-nn) übereinstimmtabs_fgg:
absolute Generationsnummer (*nnnn), 0001
<=
nnnn<=
9999rel_fgg:
relative Generationsnummer (+/-nn), 0
<=
nn<=
99Diese Tabelle kann bei zukünftigen Systemerweiterungen ihre Gültigkeit verlieren und ist deshalb nicht als garantierte Schnittstelle zu betrachten.
Suchmuster für einen Dateinamen können vom Datentyp <filename> oder <partial-filename> sein.
Ein teilqualifizierter Dateiname kann ebenfalls als Wildcard-Suchmuster verwendet werden.
Beispiele
Überprüfung eines Wertes auf Datentyp:
... CMDVAL MF=E,PARAM=MYPL * returncode must be X'0140001C' LA 1,MYPL USING MYPLD,1 LH 2,DMDVMRET LTR 2,2 BNE ERRPROC ... MYPL CMDVAL MF=L,INPUT=BUFF@,DATATYP=FILENAME,ATTRIB=(NOCATID,WILDCARD) ... BUFF@ DS 0F BUFFL DC Y(BUFFEND-BUFF@) BUFFFIL DS XL2 BUFFCT DC C':OY:$TSOS.SDF-A' BUFFEND EQU * ... MYPLD CMDVAL MF=D,PREFIX=D ...
Überprüfung eines Eingabewertes auf Übereinstimmung mit einem Wildcard-Suchmuster:
... CMDVAL MF=E,PARAM=MYPL2 LA 1,MYPL2 USING MYPLD,1 LH 2,DMDVMRET LTR 2,2 BNE ERRPROC ... MYPL2 CMDVAL MF=L,INPUT=BUFF@,PATTERN=PATT@ ... BUFF@ DS 0F BUFFL DC Y(BUFFEND-BUFF@) BUFFFIL DS XL2 BUFFCT DC C':OY:$TSOS.SDF-A' BUFFEND EQU * ... PATT@ DS 0F PATTL DC Y(PATTEND-PATT@) PATTFIL DS XL2 PATTCT DC C':OY:$TSOS.SD/-*' PATTEND EQU * ... MYPLD CMDVAL MF=D,PREFIX=D ...