Normierte Übergabebereiche werden für drei Zwecke benötigt.
SDF übergibt an das Programm eine analysierte Anweisung. Im Programm ist Speicherplatz für mindestens einen solchen Bereich zu reservieren. Der Bereich ist so groß anzulegen, dass er jede mögliche Anweisungseingabe, die SDF für das Programm analysiert hat, aufnehmen kann. Die Adresse dieses Bereichs ist bei den Makros CMDRST und CMDTST im Operanden OUTPUT anzugeben, beim Makro CMDCST im Operanden INOUT.
Das Programm gibt an SDF eine semantisch fehlerhafte Anweisung zurück. Im Programm ist dafür kein besonderer Speicherplatz zu reservieren. Das Programm nimmt denselben Bereich, in den SDF zuvor die analysierte Anweisung geschrieben hat. Nachdem das Programm in dieser Anweisung Semantikfehler erkannt hat, ergänzt es die Anweisung um Informationen für den Semantikfehlerdialog und gibt sie an SDF zurück. Die Adresse dieses Bereichs ist beim Makro CMDCST im Operanden INOUT anzugeben.
Das Programm übergibt an SDF Werte, die eingegebene Operandenwerte oder den Default-Wert ersetzen sollen. Für jede Anweisung, in der derartige Operandenwerte vorkommen können (siehe ADD-VALUE...,VALUE=<string>(OVERWRITE-POSSIBLE=*YES),... bzw. ADD-OPERAND...,OVERWRITE-POSSIBLE=*YES) ist im Programm genau ein solcher Bereich anzulegen und vom Programm zu versorgen. Die Adressen dieser Bereiche sind bei den Makros CMDRST und CMDTST im Operanden DEFAULT anzugeben.
Das neue Layout wird mit dem Makro CMDTA erzeugt und muss mit den neuen Makros CMDRST, CMDTST und CMDCST verwendet werden.
Für alle drei Fälle hat der Übergabebereich den gleichen formalen Aufbau (siehe Bild 7).
Der normierte Übergabebereich beginnt auf Wortgrenze. In Byte 0 bis 39 liegt das Kopffeld. Es enthält u.a. den internen Anweisungsnamen und die Version der Anweisung (siehe ADD-STMT ...,INTERNAL-NAME=...,STMT-VERSION=...).
Ab Byte 40 beginnt das Array für anweisungsglobale Operanden, d.h. für Operanden, die mit RESULT-OPERAND-LEVEL=1 definiert sind (siehe ADD-OPERAND). In ihm steht für jeden dieser Operanden eine 8 Byte lange Beschreibung. Die Operandenbeschreibungen sind in der Reihenfolge angeordnet, die sich aus den in der Anweisungsdefinition festgelegten Operandenpositionen ergibt (siehe ADD-OPERAND ...,RESULT-OPERAND-NAME=*POSITION(POSITION=<integer>)). Jede Operandenbeschreibung enthält u.a. die Absolutadresse, unter der der zugehörige Operandenwert bzw. die Beschreibung der zugehörigen Liste oder nichtlinearisierten Struktur im Übergabebereich abgelegt ist. In der Beschreibung einer nichtlinearisierten Struktur steht ein Operanden-Array, das die in der Struktur enthaltenen Operanden beschreibt. Es ist genauso aufgebaut, wie das Array für die anweisungsglobalen Operanden.
Im einfachsten Fall hat ein Operand lediglich einen einfachen Wert (siehe Bild 8). Eine Operandenbeschreibung mit einfachem Wert enthält auch die Syntax-Attribute für diesen Wert.
Leitet der Operandenwert eine Struktur ein (Bild 9), so gibt es für ihn eine Strukturbeschreibung. Diese enthält ein Operanden-Array mit Beschreibungen für alle Operanden der Struktur sowie für die Operanden aus linearisierten Unterstrukturen. Die Operandenbeschreibungen sind in der Reihenfolge angeordnet, die sich aus den in der Anweisungsdefinition festgelegten strukturrelativen Operandenpositionen ergibt (siehe ADD-OPERAND ...,RESULT-OPERAND-NAME=*POSITION(POSITION=<integer>)). Die zu den Operanden der Struktur gehörenden Operandenwerte können eine weitere Struktur einleiten und/oder aus einer Liste von Werten bestehen.
Bild 9: anweisungsglobaler Operand mit Struktur
Von Operanden, die mit ADD-OPERAND...,LIST-POSSIBLE=*YES(...,FORM=*NORMAL) definiert sind, werden die Werte in der in Bild 10 gezeigten Form übergeben. An einem Listenelement kann eine Struktur hängen. In diesem Fall ist „Wert des Listenelements“ eine Strukturbeschreibung.
Kopffeld des normierten Übergabebereichs
Byte | Inhalt | Feldinhalt kommt im Fall ... von | ||
analysierte | fehlerhafte | Default- | ||
0 bis 7 | Standardheader | Programm | unverändert | Programm |
8 bis 11 | Länge des Übergabebereichs | Programm | unverändert | Programm |
12 bis 19 | interner Anweisungsname | SDF | unverändert | Programm |
20 bis 23 | reserviert | |||
24 bis 26 | Version der Anweisung | SDF | unverändert | Programm |
27 bis 35 | reserviert | |||
36 bis 37 | Anzahl der Positionen im | SDF | unverändert | Programm |
38 bis 39 | reserviert |
Der interne Anweisungsname, die Version der Anweisung und die Anzahl der Positionen in dem Operanden-Array sind in der Syntaxdatei in der Anweisungsdefinition abgelegt (siehe ADD-STMT...,INTERNAL-NAME=...,MAX-STRUC-OPERAND=...,STMT-VERSION=...). Wenn die tatsächliche Anzahl von Operanden größer ist als der bei MAX-STRUC-OPERAND angegebene Wert, dann wird die tatsächliche Anzahl im Übergabebereich vermerkt.
Übergibt das Programm Default-Werte für eine Anweisung, so muss die Version der Anweisung im Übergabebereich mit der Version der Anweisung in der Syntaxdatei übereinstimmen. Wenn in der Syntaxdatei keine Version vermerkt ist, muss im Übergabebereich '000' (oder binäre Nullen) eingetragen werden, ansonsten wird der Default-Wert zurückgewiesen.
Unterstützt das Programm mehrere Versionen einer Anweisung, dann muss für jede Version der Anweisung ein Default-Wert übergeben werden.
Operandenbeschreibung
Das Operanden-Array und die in ihm stehenden Beschreibungen für die Operanden einer Struktur sind genau so aufgebaut wie bei den anweisungsglobalen Operanden.
Byte | Inhalt | Feldinhalt kommt im Fall ... von | ||
analysierte | fehlerhafte | Default- | ||
0 bis 3 0 1 2 3 | Wertbeschreibung Zusatzinformation Typbeschreibung Globale Syntaxattribute Typspezifische Syntaxattribute | siehe unten SDF SDF SDF | siehe unten unverändert - - | siehe unten Programm 1) - - |
| Absolutadresse (aligned abgelegt) | SDF | unverändert | Programm 1) |
1)Angabe nur für Operanden, zu denen umzusetzende Operandenwerte gehören, d.h. wenn Bit 0 der Zusatzinformation gesetzt ist.
Zusatzinformation
Die Zusatzinformation steht im ersten Byte der Wertbeschreibung. Die folgenden Angaben über die Zusatzinformation gelten unabhängig davon, ob die Zusatzinformation in einer Operandenbeschreibung, im Kopffeld einer Strukturbeschreibung, in der Beschreibung eines Listenelements oder in einer OR-Listenbeschreibung vorkommt.
Bit | Wert | Inhalt | Feldinhalt kommt im Fall ... von | ||
analysierte | fehlerhafte | Default-Werte | |||
0 | 0 | Wert ist nicht vorhanden | SDF 1) | unverändert | Programm 2) |
0 | 1 | Wert ist vorhanden | SDF | unverändert | Programm 2) |
1 | 0 | Wert ist änderbar | - | Programm 3) | - |
1 | 1 | Wert ist nicht änderbar | - | Programm 3) | - |
2 | 0 | Wert ist nicht fehlerhaft | - | Programm | - |
2 | 1 | Wert ist fehlerhaft | - | Programm | - |
3 | 0 | Wert soll nicht als Default | - | - | Programm |
3 | 1 | Wert soll als Default eingesetzt | - | - | Programm |
4 bis 7 | - | reserviert | - | - | Programm |
1)z.B. Werte zu Operanden, die mit ADD-OPERAND...,PRESENCE=*EXTERNAL-ONLY definiert sind, oder Werte in nicht angesprochenen Strukturen.
2)0 für Operanden, zu denen weder umzusetzende Operandenwerte gehören noch Strukturen, die Operanden mit umzusetzenden Werten enthalten. 1 für Operanden, zu denen entweder umzusetzende Operandenwerte gehören oder Strukturen, die Operanden mit umzusetzenden Werten enthalten.
3)Alle Listenwerte, die nach dem ersten änderbaren Listenwert kommen, betrachtet SDF unabhängig davon, wie Bit 1 gesetzt ist, als änderbar. Dadurch werden schon bearbeitete Listenelemente gegen Überschreiben geschützt.
Typbeschreibung
Die Typbeschreibung steht im zweiten Byte der Wertbeschreibung. Die Angaben über die Typbeschreibung gelten unabhängig davon, ob die Typbeschreibung in einer Operandenbeschreibung, im Kopffeld einer Strukturbeschreibung, in der Beschreibung eines Listenelements oder in einer OR-Listenbeschreibung vorkommt.
Strukturbeschreibungen können durch ein Programm eingegeben werden, um eigene Default-Werte anzugeben. Die Eingabe der Default-Werte ist möglich:
im internen Format (wie beim Operanden OUTPUT der SDF-A-Anweisung ADD-VALUE) oder
im externen Format als Zeichenfolge analog der Operandenbeschreibung. Dabei muss der Hilfsdatentyp <input-text> benutzt werden. Der Wert wird dann so analysiert, als ob er über die Benutzerschnittstelle eingegeben worden wäre.
Wert (dezimal) | Bedeutung |
1 | Kommandorest (Command-Rest) |
2 | Ganzzahl (Integer) |
4 | X-Zeichenkette (X-String) |
5 | C-Zeichenkette (C-String) |
6 | Name (Name) |
7 | alphanumerischer Name (Alphanumeric-Name) |
8 | strukturierter Name (Structured-Name) |
9 | Marke (Label) |
11 | Dateiname (Filename) |
12 | teilqualifizierter Dateiname (Partial-Filename) |
13 | Uhrzeit (Time) |
14 | Datum (Date) |
15 | zusammengesetzter Name (Composed-Name) |
16 | Text (Text) |
17 | Katalog-Kennung (Cat-Id) |
18 | Eingabe-Text (Input-Text) |
19 | Struktur |
20 | Liste |
21 | OR-Liste |
22 | Schlüsselwort (Keyword) |
23 | reserviert für internen Gebrauch |
24 | VSN |
25 | X-Text (X-Text) |
26 | Festpunktzahl (Fixed) |
27 | Gerät (Device) |
28 | Produkt-Version (Product-Version) |
29 | POSIX-Pfadname (Posix-Pathname) |
35 | POSIX-Dateiname (Posix-Filename) |
36 | Long-integer |
Globale Syntaxattribute
Die Beschreibung der globalen Syntaxattribute eines Operandenwerts steht im dritten Byte der Wertbeschreibung. Es handelt sich dabei um Attribute, die für mehrere Datentypen festgelegt werden können (siehe ADD-VALUE Operandenwert definieren).
Globale Attribute sind immer Ausgabe-Attribute. Sie werden ignoriert, falls das Programm Default-Werte liefert, oder in Korrekturdialogen.
Bit | Bedeutung, wenn das Bit gesetzt ist |
0 | Wert ist ein Wildcard-Suchmuster |
1 | Wert ist ein Wildcard-Konstruktor |
2 bis 7 | reserviert |
Datentypspezifische Syntaxattribute
Die Beschreibung der datentypspezifischen Syntaxattribute steht im vierten Byte der Wertbeschreibung. Es handelt sich dabei um Attribute, die nur für einen Datentyp oder wenige Datentypen festgelegt werden können.
Datentypspezifische Attribute sind ebenfalls Ausgabe-Attribute. Sie werden ignoriert, falls das Programm Default-Werte liefert, oder in Korrekturdialogen.
Datentyp FILENAME / PARTIAL-FILENAME:
Bit | Bedeutung, wenn das Bit gesetzt ist |
0 | Dateiname enthält catid |
1 | Dateiname enthält userid |
2 | Dateiname enthält Dateigeneration oder Dateigenerationsgruppe |
3 | Dateiname enthält Version |
4 | Dateiname ist temporär |
5 bis 7 | reserviert |
Datentyp NAME:
Bit | Bedeutung, wenn das Bit gesetzt ist |
0 | Name enthält Unterstrich (_) |
1 bis 7 | reserviert |
Datentyp COMPOSED-NAME:
Bit | Bedeutung, wenn das Bit gesetzt ist |
0 | zusammengesetzter Name enthält Unterstrich (_) |
1 | zusammengesetzter Name enthält catid |
2 bis 7 | reserviert |
Datentyp TEXT:
Bit | Bedeutung, wenn das Bit gesetzt ist |
0 | Text enthält Trennzeichen |
1 bis 7 | reserviert |
Datentyp X-TEXT:
Bit | Bedeutung, wenn das Bit gesetzt ist |
0 | X-Text hat eine ungerade Anzahl von Bytes |
1 bis 7 | reserviert |
Datentyp POSIX-PATHNAME / POSIX-FILENAME:
Bit | Bedeutung, wenn das Bit gesetzt ist |
0 | POSIX-Pfad- oder Dateiname ist absolut |
1 | POSIX-Pfad- oder Dateiname ist relativ |
2 | POSIX-Pfad- oder Dateiname wurde in Hochkommas eingegeben |
3 bis 7 | reserviert |
Datentyp C-STRING:
Bit | Bedeutung, wenn das Bit gesetzt ist |
0 | C-String enthält ein Hochkomma |
1 bis 7 | reserviert |
Datentyp PRODUCT-VERSION:
Bit | Bedeutung, wenn das Bit gesetzt ist |
0 | Produktversion enthält Korrekturstand |
1 | Produktversion enthält Freigabestand |
2 bis 7 | reserviert |
Kopffeld einer Strukturbeschreibung
Byte
| Inhalt
| Feldinhalt kommt im Fall ... von | ||
analysierte | fehlerhafte | Default-Werte | ||
0 bis 1 | Anzahl der Positionen im Operanden-Array | SDF | unverändert | Programm |
2 bis 3 | reserviert | - | - | - |
4 bis 7 4 5 6 | Wertbeschreibung für den struktureinleitenden Operandenwert Zusatzinformation Typbeschreibung Globale Syntaxattribute Typspezifische Syntaxattribute | - SDF SDF SDF | siehe "Aufbau des normierten unverändert - - | siehe "Aufbau des normierten Programm - - |
8 bis 11 | Absolutadresse (aligned abgelegt) | SDF | unverändert | Programm |
Die Anzahl der Positionen in dem Operanden-Array ist in der Syntaxdatei in der Anweisungsdefinition abgelegt (siehe ADD-VALUE...,STRUCTURE=*YES(...,MAX-STRUC-OPERAND=...).
Das zu der Struktur gehörende Operanden-Array beginnt unmittelbar hinter dem Kopffeld (siehe Bild 9). Es ist genau so aufgebaut wie das für anweisungsglobale Operanden.
Listenelement
Byte
| Inhalt
| Feldinhalt kommt im Fall ... von | ||
analysierte | fehlerhafte | Default-Werte | ||
0 bis 3 0 1 2 3 | Wertbeschreibung Zusatzinformation Typbeschreibung Globale Syntaxattribute Typspezifische Syntaxattribute | siehe "Aufbau des normierten SDF SDF SDF | siehe "Aufbau des normierten unverändert - - | siehe "Aufbau des normierten Programm 1) - - |
4 bis 7 | Absolutadresse (unaligned | SDF | unverändert | Programm 1) |
8 bis 11 | Absolutadresse (aligned | SDF | unverändert | Programm 1) |
1)Angabe nur für Operanden, zu denen umzusetzende Operandenwerte gehören, d.h. wenn Bit 0 der Zusatzinformation gesetzt ist.
Im letzten Element der Liste hat die „Absolutadresse des nächsten Listenelements“ den
Wert 0 (siehe Bild 10).
Eine OR-Liste besteht nur aus einem Element. Bei diesem Element entfällt die „Absolutadresse des nächsten Listenelements“.
Für einen Operanden, der mit LIST-POSSIBLE=*YES(FORM=*NORMAL) definiert ist, muss die Anzahl der Listenelemente begrenzt werden (LIMIT=...), damit es nicht zum Überlauf des normierten Übergabebereiches kommt. Die Größe einer Liste im normierten Übergabebereich kann nach folgender Formel berechnet werden:
n * (10 + 2 + l)
wobei: | n l | die Anzahl der Listenelemente und die Länge eines einzelnen Listenelementes (aufgerundet auf ein |
Beispiel:
ADD-OPERAND ... LIST-POSSIBLE=*YES(LIMIT=100,FORM=*NORMAL)
ADD-VALUE *NAME(1,8)
Eine so definierte Liste kann im normierten Übergabebereich bis zu 2000 Byte belegen (100 * (10 + 2 + 8) = 2000).
Ablage der Werte
Byte | Inhalt | Feldinhalt kommt im Fall ... von | ||
analysierte Programm | fehlerhafte | Default- | ||
0 bis 1 | Längenangabe | SDF | unverändert | Programm |
2 bis 3 | reserviert | - | - | - |
4 bis ... | Wert | SDF | unverändert | Programm |
Wie die Werte übergeben werden, hängt ab von der Definition in der Syntaxdatei (siehe ADD-VALUE...,OUTPUT=*NORMAL(...). Dabei gelten folgende Besonderheiten:
Ein Wert, der mit ADD-VALUE TYPE=*INTEGER(...,OUT-FORM=*BINARY) definiert ist, wird als 4-Byte-String mit Vorzeichen abgelegt.
Ein Wert, der mit ADD-VALUE TYPE=*TIME definiert ist, wird als 4-Byte-String mit 2 Bytes (binär) für Stunden und je 1 Byte für Minuten und Sekunden abgelegt.