Die in PRODAMP enthaltenen Standardfunktionen sind nur innerhalb von Prozeduren aufrufbar. Die Syntax der Funktionsaufrufe entspricht der Pascal-Syntax.
Funktionsname | Funktion |
ADDRESS DEC_BINARY DEC_STRING HEX_BINARY HEX_STRING LENGTH LOCATION PATTERN PCK_BINARY | liefert die Adresse eines Moduls oder eines Kontrollblocks umwandeln eines Dezimalstrings in eine numerische Variable dezimale Druckaufbereitung umwandeln eines Sedezimalstrings in eine numerische Variable sedezimale Druckaufbereitung Länge eines Moduls, Kontrollblocks oder Parameterbereichs ausgeben liefert den Modulnamen zu einer Adresse wandelt einen numerischen Wert in einen Wert vom Typ PATTERN um entpacken gepackter Zahlen aus dem Diagnoseobjekt |
Tabelle 14: Übersicht über PRODAMP-Standardfunktionen
Die aufgeführten Namen sollten nicht für eigene Prozeduren verwendet werden, da dies zu Fehlinterpretationen des Programms führen kann.
ADDRESS
Liefert die Adresse eines Moduls oder eines Kontrollblocks
Die Standardfunktion ADDRESS liefert die Adresse eines Moduls. Die Ergebnis-Variable muss daher numerisch sein. Falls die Ergebnis-Variable noch nicht initialisiert ist, bekommt sie den Typ „numerisch“ und die Länge 4. ADDRESS kann auch dazu benutzt werden, um Relativadressen von Feldern in einem Kontrollblock zu ermitteln.
Module eines Benutzerprogramms sind im Allgemeinen nur in Userdumps zu finden.
Funktionsaufruf
Operation | Operanden |
ADDRESS | (modname, susyname) |
Operandenbeschreibung
modname | gibt den Namen des gesuchten Moduls an. 'modname' darf höchstens 32 Zeichen enthalten, Leerzeichen vor oder nach dem Modulnamen sind aber erlaubt. In Stringtypen wird Groß- und Kleinschreibung unterschieden. modname muss also in Großbuchstaben angegeben werden. | |
susyname | gibt das Subsystem an, in dem das betreffende Modul lokalisiert werden soll. susyname ist ein String, der entweder den Namen des Subsystems oder eine der folgenden symbolischen Bezeichnungen enthält: | |
CP *PRIV *NONPRIV *USER *ALL | es wird im Control-Program, d.h. unter allen Cl1- und Cl2-Modulen gesucht. es wird in allen privilegierten Subsystemen gesucht. es wird in allen nichtprivilegierten Subsystemen gesucht. es wird nur unter den Benutzer-CSECTs gesucht. es wird überall gesucht. |
Soll die Relativadresse eines Kontrollblocks ermittelt werden, muss modname den Feldnamen und susyname die Zeichenfolge „DS“ enthalten. Wird für modname der Name eines Symbols angegeben und handelt es sich bei diesem Symbol um das Element einer Substruktur, das über REFERENCE-Aufrufe lokalisiert wurde, so ist für susyname die Zeichenfolge „RF“ einzutragen (siehe Beispiel bei der Standardprozedur REFERENCE "Standardprozeduren").
Beispiel
A := ADDRESS ('DOPEN', 'CP') ; MODULE := 'FAUTEM' ; A := ADDRESS (MODULE, 'ARCHIVE'); A := ADDRESS ('EXVTDSSM','DS');
Wird das Modul oder das Symbol nicht gefunden, dann erhält das Pseudo-Symbol CURRENT.ERROR einen Wert î
0. In diesem Fall ist das zurückgelieferte Ergebnis undefiniert.
DEC_BINARY
Dezimalzahl umwandeln
Die Standardfunktion DEC_BINARY interpretiert den Inhalt eines Strings als Dezimalzahl und gibt sie als Datum vom Typ „numerisch der Länge 4“ zurück. Dabei werden Leerzeichen vor und nach den relevanten Zeichen ignoriert.
Falls der String keinen gültigen Dezimalwert enthält oder wenn der Wert außerhalb der Grenzen für numerische Variable liegt, wird CURRENT.ERROR gesetzt. Das Ergebnis von DEC_BINARY ist in diesem Fall undefiniert.
Das Einschalten der vorzeichenlosen Arithmetik mit der Standardprozedur UNSIGNED_ON wird ignoriert.
Funktionsaufruf
Operation | Operanden |
DEC_BINARY | (string); |
Operandenbeschreibung
string | gibt die Stringvariable an, die umgewandelt werden soll. |
DEC_STRING
Numerische Werte umwandeln
Die Standardfunktion DEC_STRING wandelt eine angegebene Zahl in einen Dezimalstring um. Das Einschalten der vorzeichenlosen Arithmetik mit der Standardprozedur UNSIGNED_ON wird ignoriert.
Funktionsaufruf
Operation | Operanden |
DEC_STRING | (zahl[,länge]) |
Operandenbeschreibung
zahl länge | gibt die umzuwandelnde Zahl an. gibt die Länge des erzeugten Strings an. Die Dezimalzahl wird in den String rechtsbündig eingetragen und nach links mit Leerzeichen aufgefüllt. Reicht die angegebene Länge nicht aus, werden führende Zeichen abgeschnitten. Ist keine Länge angegeben, werden nur die signifikanten Zeichen zurückgegeben (kompaktes Format ohne führende Leerzeichen). Ausnahme: X := DEC_STRING(I) wirkt wie X := DEC_STRING(I,L), wenn X eine bereits initialisierte Stringvariable der Länge L ist. Nutzt man DEC_STRING ohne Angabe einer Länge zur Initialisierung einer Variablen oder als Parameter in einem für eine eigene PRODAMP-Unterprozedur zu übergebenden Ausdruck, so werden 10 Bytes für das Ergebnis reserviert. In beiden Fällen ist es besser, eine Länge explizit anzugeben. |
Beispiel
Auftrag: Ergebnis: X := 'XXXXXXXX'; —————————————————————————————————————————————————————— (1) X := DEC_STRING (123); ' 123' X := 'XXX'; X := DEC_STRING (123456); '456' —————————————————— (2) X := 'ABC' + DEC_STRING (12) + 'XYZ'; 'ABC12XYZ ' ————— (3) X := 'ABC' + DEC_STRING (12,5) + 'XYZ'; 'ABC 12XYZ' —————————— (4)
(1) | Initialisierung von X als String der Länge 8; |
HEX_BINARY
Sedezimalzahl umwandeln
Die Standardfunktion HEX_BINARY interpretiert einen angegebenen String als Sedezimalzahl und reicht das Ergebnis als Datum vom Typ „numerisch der Länge 4“ zurück. Dabei werden Leerzeichen vor und nach den relevanten Zeichen ignoriert.
Falls der String keinen gültigen Sedezimalwert enthält oder wenn der Wert außerhalb der Grenzen für numerische Variable liegt, wird CURRENT.ERROR gesetzt. Das Ergebnis von HEX_BINARY ist in diesem Fall undefiniert.
Funktionsaufruf
Operation | Operanden |
HEX_BINARY | (string); |
Operandenbeschreibung
string | gibt die Stringvariable an, die umgewandelt werden soll. |
HEX_STRING
Numerische Werte umwandeln
Die Standardfunktion HEX_STRING wandelt eine angegebene Zahl in einen Sedezimalstring um.
Funktionsaufruf
Operation | Operanden |
HEX_STRING | (zahl[,länge]) |
Operandenbeschreibung
zahl länge | gibt die umzuwandelnde Zahl an. gibt die Länge des erzeugten Strings an. Die Sedezimalzahl wird in den String rechtsbündig eingetragen und nach links mit der Ziffer Null aufgefüllt. Ist keine Länge angegeben, werden nur die signifikanten Zeichen zurückgegeben (kompaktes Format ohne führende Leerzeichen). Analog zu DEC_STRING gibt es Ausnahmefälle, wenn keine Länge angegeben ist. |
Beispiele
Auftrag: Ergebnis: X := 'XXXXXXXX'; X := HEX_STRING (123) '0000007B' X := 'XXX'; "zu kurz" X := HEX_STRING (4097) '001' X noch nicht initialisiert X := HEX_STRING (123,8) '0000007B' X noch nicht initialisiert X := HEX_STRING (123) '0000007B'
LENGTH
Länge eines Moduls, Kontrollblocks oder Parameterbereichs ausgeben
Die Standardfunktion LENGTH kann in drei Varianten aufgerufen werden:
Variante 1: Ausgegeben wird die Länge eines Moduls
Variante 2: Ausgegeben wird die Länge eines Kontrollblocks (DSECT/SPL-Struktur, -Unterstruktur, -Feld)
Variante 3: Ausgegeben wird die Länge des Parameterbereichs, mit dem die aktuelle Prozedur aufgerufen wurde
Das Ergebnis ist vom Typ „numerisch“ und hat die Länge 4.
Funktionsaufruf
Operation | Operanden |
LENGTH | (modname, susyname); |
Operandenbeschreibung
modname | Variante 1: | „modname“ ist ein Modul-Name, dessen Länge zu bestimmen ist. „modname“ darf höchstens 32 Zeichen enthalten, Leerzeichen vor oder nach dem Modul-Namen sind aber erlaubt. |
Variante 2: | „modname“ ist der Name eines Kontrollblocks, dessen Länge zu bestimmen ist. Maximal 32 Zeichen, sowie zusätzliche Leerzeichen vor oder nach dem Namen sind erlaubt. | |
Variante 3: | Variante 3: „modname“ ist der String „*PARAMETER“ | |
susyname | Variante 1: | Der Name des Subsystems, in dem das Modul gesucht werden soll. |
Folgende Werte des Strings „susyname“ haben eine Sonderbedeutung: | ||
CP *PRIV *NONPRIV *USER *ALL | Es wird im Control-Program, d.h. unter allen Cl1- und Cl2-Modulen gesucht. Es wird in allen privilegierten Subsystemen gesucht. Es wird in allen nichtprivilegierten Subsystemen gesucht. Es wird nur unter den Benutzer-CSECTs gesucht. Es wird überall gesucht. | |
Variante 2: | „susyname“ enthält „DS“ oder „RF“. Damit wird angezeigt, dass die Länge eines Kontrollblocks bzw. Feldes zu bestimmen ist. „RF“ ist dann zu nutzen, wenn das Feld Element einer Substruktur ist und zur Lokalisierung REFERENCE Aufrufe benutzt werden. | |
Variante 3: | „susyname“ enthält „DS“ und „modname“ ist der String „*PARAMETER“. |
Hinweise
Die Aufrufform LENGTH('*PARAMETER','DS') setzt den Wert von CURRENT.ERROR immer auf 0 und liefert die Gesamtlänge des Parameterbereichs zurück, mit dem die aktuelle Prozedur aufgerufen wurde. Diese Länge ist 0, wenn der Aufruf ohne Parameter erfolgte.
Beispiele zur Anwendung von LENGTH('*PARAMETER','DS') finden Sie ab "Pseudostrukturen".
Wird LENGTH für ein Modul oder einen Kontrollblock aufgerufen, so kann durch anschließende Auswertung von CURRENT.ERROR bestimmt werden, ob dieses Modul bzw. der Kontrollblock überhaupt gefunden wurde.
Damit ergibt sich die Möglichkeit, vor einem symbolischen Zugriff mit einem Kontrollblock-Feld die Existenz dieses Kontrollblock-Feldes in den aktuell geladenen Symbolelementen zu überprüfen und entsprechend zu reagieren.
Beispiele
L:=LENGTH('NCTVXVT','CP'); L:=LENGTH('EXVT','DS'); L:=LENGTH('EXVTPRD','DS'); L:=LENGTH('*PARAMETER','DS'); L:=LENGTH('MYDSECT','DS'); IF CURRENT.ERROR <> 0 THEN " Fehlerfall. Z.B. mit Nachladen der benoetigten Symbole über " " COMMAND ('ADD-SYMBOLS ...') fortfahren oder Fehlerausgang " END IF;
LOCATION
Liefert den Modulnamen zu einer Adresse
Die Standardfunktion LOCATION gibt den Namen des Moduls aus, in dem sich eine angegebene Adresse befindet. Das Ergebnis muss daher einer Stringvariablen zugewiesen werden.
Der Modulname wird in einer maximalen Länge von 32 Zeichen übertragen. Ist die Stringvariable zur Aufnahme des Modulnamens zu kurz, wird abgeschnitten. Ist sie länger als der Modulname, wird der Rest mit Leerzeichen aufgefüllt. Ist die Zielvariable noch nicht initialisiert, bekommt sie den Typ „String“ und die Länge 8.
Entspricht der angegebene Ausdruck keiner Adresse aus einem Modul, setzt LOCATION das Pseudo-Symbol CURRENT.ERROR. Liegt die Adresse im Benutzerspeicher, erhält die Zielvariable den Wert „ABSOLUTE“. Ist das nicht der Fall, erhält sie den Wert „?“.
Die Distanz relativ zum Modulanfang kann anschließend mit der Standardfunktion ADDRESS ermittelt werden.
Funktionsaufruf
Operation | Operanden |
LOCATION | (adresse, susyname); |
Operandenbeschreibung
adresse susyname | die Adresse des zu lokalisierenden Moduls. gibt das Subsystem an, in dem das Modul lokalisiert werden soll. | ||
CP | es wird im Control-Program, d.h. unter allen Cl1- und Cl2-Modulen gesucht. |
Beispiel
NAM := LOCATION ( ADDR, 'CP' ); REL := ADDR - ADDRESS ( NAM, 'CP' ) ;
PATTERN
Umwandlung eines numerischen Wertes
Die Funktion PATTERN wandelt einen numerischen Wert in einen Wert vom Typ PATTERN um. Existiert die Ergebnis-Variable noch nicht, dann erhält sie die Länge 4.
Eine solche Umwandlung wird benötigt, wenn z.B. in einer Schleife Daten dahingehend überprüft werden sollen, ob bestimmte Bits gesetzt sind oder nicht. Da keine Operationen verfügbar sind, die z.B. aus P'01' den Wert P'02' erzeugen, ist dies nur über die Umwandlung von numerischen Werten möglich.
Funktionsaufruf
Operation | Operanden |
PATTERN | (num) |
Operandenbeschreibung
num | gibt den umzuwandelnden numerischen Wert an. |
Beispiel
L := 1; U := 1; WHILE L < 8 DO IF PATTERN ( U ) IN .EXVTULM THEN ....... ....... END IF; U := U * 2; L := L + 1; END WHILE;
PCK_BINARY
Gepackte Zahlen entpacken
PCK_BINARY formt gepackte zu ungepackten Zahlen um. Das Ergebnis ist numerisch von der Länge 4.
Enthält der String keine gepackte Zahl, wird CURRENT.ERROR gesetzt.
Funktionsaufruf
Operation | Operanden |
PCK_BINARY | (string) |
Operandenbeschreibung
string | gibt die zu entpackende Zahl an. |