PL1 - Formate

Allgemeines
Die Formate werden als Untermenge von
  • GET - GET EDIT
  • PUT - PUT EDIT
verwendet.
Sie dienen dazu, die eingelesenen oder zu druckenden Daten, formatiert einzulesen oder auszugeben. Das Datenformat bezieht sich auf deklarierte Daten oder auf Konstanten die im GET oder PUT Befehl eingegeben werden.
Das Steuerungsformat ergänzen die Datenformate.

Es stehen folgende Formate zur Verfügung:

  • Datenformate
    • A = Zeichenkettenformat - alphanumerische Verarbeitung
    • B = Bitfolgen
    • C = komplexe Zahlen (in Arbeit)
    • E = Gleitpunktformat
    • F = Festpunktformat
    • L = Zeichenkettenformat
    • P = PICTURE-Format entspricht dem COBOL-Format (in Arbeit)
    • V = Zeichenkettenformat - kann nur mit "GET" verwendet werden
  • Steuerformate

In dieser Beschreibung werden nur die Regeln für die Formate beschrieben. Kombinationen, die sich speziell auf "GET EDIT" und "PUT EDIT" beziehen, werden extra beschrieben.

Allgemeine Regeln für die Formate:
  • Bei numerischen Datenformaten werden die Zahlen, sofern mehr als eine Zahl vorkommt, in einer Zahlengruppe erwartet.
A-Zeichenkettenformat

FORMAT = A[(w)]

DECLARE CHAR

Mit diesem Datenformat werden Zeichenketten bearbeitet.
Das Format gilt für Datenelemente die mit CHAR deklariert sind.

Regeln für "A"

Eingabe

  • Die angegebene Eingabelänge "w" wird von links nach rechts gelesen.
  • Wird "w" nicht angegeben, so werden die Daten bis zum Zeilenende gelesen. Bei einer Variablen wird die volle Länge des Feldes eingelesen.
  • Die eingelesenen Daten werden der Variablen linksbündig zugewiesen.
  • Apostrophen werden als normale Zeichen gelesen und bleiben unverändert.
  • Sind die Eingabedaten länger, als in "w" definiert, so werden die darüber hinaus gehenden Zeichen abgeschnitten.

Ausgabe

  • Die Daten werden linksbündig, in der Länge von "w" ausgegeben.
  • Ist "w" länger definiert als die Länge der Variablen, so werden die überhängenden Zeichen als Leerzeichen ausgegeben.
  • "w" ist kürzer definiert als die Länge der Variablen. Die über die Länge einer Variablen hinausgehenden Zeichen werden rechtsbündig abgeschnitten und nicht ausgegeben.
  • Werden im PUT nur Zahlen angegeben, so werden diese als Zahlenformat ausgewertet und nicht als ein Zeichenkettenformat.
    Bei der Konvertierung werden die Regeln angewandt, die bei der Zuweisung von numerischen Wert zu "character" verwendet werden.
    Beispiel put edit (9) (a(11);
    Das Ergebnis lautet: ___9_______
B - Bit-Format

FORMAT = B[(w)]

DECLARE BIT

Das B-Format dient der Ein- und Ausgabe von Bitfolgen.

Regeln für "B"

Eingabe

  • Die angegebene Eingabelänge "w" wird von links nach rechts gelesen.
  • Wird "w" nicht angegeben, so werden die Daten bis zum Zeilenende gelesen. Bei einer Variablen wird die volle Länge des Feldes eingelesen.
  • Die eingelesenen Daten werden der Variablen linksbündig zugewiesen.
  • Im Eingabedatenstrom werden nur Werte von 0 und 1 erwartet.
  • Sind die Eingabedaten länger, als in "w" definiert, so werden die darüber hinaus gehenden Zeichen abgeschnitten.

Ausgabe

  • Die Daten werden linksbündig, in der Länge von "w" ausgegeben.
  • Ist "w" länger definiert als die Länge der Variablen, so werden die überhängenden Zeichen als Leerzeichen ausgegeben.
  • "w" ist kürzer definiert als die Länge der Variable. Die über die Länge einer Variablen hinausgehenden Zeichen werden rechtsbündig abgeschnitten und nicht ausgegeben.
  • Es werden nur Werte von 0 und 1 ausgegeben.
  • Ein Vorzeichen gibt es nicht.
E - Gleitpunktformat

FORMAT = E(w,d[,g])

DECLARE FLOAT

Das "E" im Format steht für die Definition eines Gleitpunktformates. Das Format gilt für Datenelemente die mit FLOAT deklariert sind.

Regeln für "E"

  • Die dem "E" folgenden Operatoren sollten in Klammern eingeschlossen sein und durch ein Komma getrennt werden.
  • Mit "E" können auch Datenfelder die den Konventionen von "F" entsprechen verarbeitet werden. Z.B. wird das Eingabe FIXED-Format 1.5 richtig in das "E" Format konvertiert.
  • "w" definiert die gesamte Eingabelänge der zu lesenden und zu schreibenden Daten.
  • Die in "w" definierte Gesamtlänge der Daten unterteilt sich in die Mantisse und dem Exponenten.
  • Die Mantisse enthält die Ziffern der Gleitkommazahl mit dem entsprechenden linksbündig stehenden Vorzeichen. Das "+" als Vorzeichen kann weggelassen werden.
  • Der Exponent speichert die genaue Stelle des Kommas und damit die Größenordnung der Zahl.
  • Die Basis des Exponenten ist 10.
  • Das Vorzeichen des Exponenten(E)und der Mantisse sowie das Dezimalzeichen werden in "w" berücksichtigt.
  • "d" definiert die Länge der Nachkommastellen in der Mantisse.
  • "g" Gibt die Größe der Mantisse an, inklusive Vor- und Nachkommastellen. Die Länge des Exponenten bleibt von dieser Angabe unberührt.
  • Die mögliche Anzahl der Vorkommastellen errechnet sich aus:
    "w" - "d" - der Anzahl Stellen des Exponenten = max. Vorkommastellen.
  • Überhängende Bytes vor und nach dem Dezimalzeichen oder dem Exponenten werden entweder links- oder rechtsbündig abgeschnitten.
  • Das "-" Vorzeichen der Mantisse steht vor den Ziffern.
  • Ist im Eingabemodus das Datenformat zu klein definiert oder ist beim PUT die Ausgabelänge größer, als die im FORMAT angegebenen Werte, so wird kein Fehler erzeugt, sondern die Daten nach vorher beschriebenen Regeln abgeschnitten.
    Falls die "SIZE-Bedingung eingeschaltet ist, erfolgt eine Fehlermeldung. Ansonsten wird keine Meldung ausgegeben und das Programm arbeitet ohne Unterbrechung weiter.

Eingabe

  • Die in Anzahl "w" definierte Feldlänge, liest in der angegebenen Länge, die Daten von links nach rechts.
  • Leerzeichen werden gelesen und zur Eingabelänge hinzugerechnet, aber nicht ausgewertet.
  • Die Ausrichtung der Eingabedaten richtet sich nach dem Dezimalzeichen oder der rechtesten Ziffer. Der Exponent spielt für das Ermitteln der Vor- und Nachkommastellen keine Rolle.
  • Die Ziffernfolge und der Exponent können irgendwo im eingelesen Bereich stehen, die durch "w" definiert ist.
  • Enthalten die Eingaben kein Dezimalzeichen, so wird die Angabe in "d" ignoriert.
  • Wird nach dem ersten Zahlenblock ein Vorzeichen gefunden, so werden die Zahlen nach dem Vorzeichen dem Exponenten zugeordnet. Somit ist es erlaubt, das "E" für den Exponenten, wegzulassen.
  • Die Eingabedaten können im "E" sowie "F" Format zur Verfügung stehen. Das "F" Datenformat wird in das "E" Format konvertiert.
  • Ist im Eingabedatenstrom kein Exponent angegeben, so wird automatisch der Exponent mit "E+0" angenommen.
  • Der Parameter "g" wird im Eingabemodus ignoriert.

Ausgabe

  • Die Daten werden rechtsbündig ausgegeben.
  • In der Mantisse werden führende Nullen sowie das "+" Vorzeichen durch Leerstellen ersetzt.
  • Das Dezimalzeichen der Mantisse steht immer an der gleichen Stelle.
  • In der Ausgabe ist der Exponent mit einem Vorzeichen versehen, wie E+nn oder E-nn.
    Die Mindestausgabelänge für den Exponenten ist damit 3 Bytes lang.
  • Wird in der Ausgabe das "g" nicht angegeben, so wird angenommen, dass die Gesamtstellenanzahl der Mantisse um 1 größer ist als die Angabe der Nachkommastellenanzahl. Somit wird erreicht, dass immer eine Zahl vor dem Dezimalzeichen steht.
  • Die Ausgabelänge der Zahlen vom Exponenten errechnet sich wie folgt:
    "w" - 2(E+ oder E-) - "d" oder "g" - 1 (Dezimalzeichen) - 1 (Vorzeichen der Mantisse)
    Wird "g" nicht angegeben so wird "d" um 1 hoch gerechnet. Wird "g" angegeben so wird "d" in der Berechnung nicht berücksichtigt.
  • Längenberechnung der Mantisse:
    • In allen drei Beispielen wird der Exponent mit mindestens 3 Bytes berücksichtigt.
    • "d"="g" ergibt 0 Vorkommastellen sowie "d" Nachkommastellen mit einer führenden Null vor dem Dezimalzeichen.
    • "d"="0" ergibt "g" Vorkommastellen. Es gibt kein Dezimalzeichen.
    • "d"<"g" ergibt "g"-"d" Vorkommastellen und und "d" Nachkommastellen.
  • Sollte im DECLARE, die Vorkommastelle kleiner als die Ausgabelänge im Datenformat definiert sein, so werden die überhängigen Zeichen als Leerzeichen gedruckt. Die rechtsbündige Ausrichtung im Druck bleibt erhalten.

Beispiele

  • DECLARE
    • A FLOAT (6);
    • B FLOAT (4);
    • C FLOAT (4);
  • GET und PUT
    • GET EDIT (A,B,C) (E(12,4), E(9,2), E(11,2);
    • PUT EDIT (A,B,C) (E(12,4), E(10,2), E(12,2);
  • Eingabedaten
    • __-4.37E6___|___25+3__|__.0213E-12
    • 123456789012 123456789 12345678901
  • Ausgabe
    • _-.4370E+007|__.25E+005|____.21E-013
    • 123456789012 1234567890 123456789012
F - Festpunktformat

FORMAT = F(w,d[,s])
FORMAT = F(w,0[,s])
FORMAT = F(w)

DECLARE FIXED/FLOAT

Das "F" im Formt steht für die Definition eines Festpunktformates(Fixpoint). Das Format gilt für FIXED und FLOAT. Der Unterschied gilt nur für den Eingabedatenstrom. "F" kann somit für die FIXED und FLOAT verwendet werden, sofern nachfolgend beschriebene Regel eingehalten wird.

Allgemeine Regeln für "F"

  • Die dem "F" folgenden Operatoren sollten in Klammern eingeschlossen sein und durch ein Komma getrennt werden.
  • "w" definiert die gesamte Eingabelänge der zu lesenden und zu schreibenden Daten.
  • Das Vorzeichen sowie das Dezimalzeichen werden in "w" berücksichtigt.
  • "d" gibt die Anzahl der Nachkommastellen an.
  • "d" kann weggelassen werden, wenn keine Nachkommastellen benötigt werden.
  • "s" definiert den Skalierungsfaktor, der die Position des Kommas beeinflusst.
    "s" gibt an, um wieviele Stellen das Dezimalzeichen nach rechts oder links verschoben wird.
    Abhängig ist die Verschiebung vom Vorzeichen. Bei "+" wird das Dezimalzeichen nach rechts verschoben, ansonsten nach links. Die Skalierung definiert mathematisch gesehen eine Multiplikation mit einer Zehnerpotenz.
  • Die mögliche Anzahl der Vorkommastellen errechnet sich aus:
    w - d = max. Vorkommastellen.
  • Überhängende Bytes vor und nach dem Dezimalzeichen werden entweder links- oder rechtsbündig abgeschnitten.
  • Das Vorzeichen "-" steht vor den Ziffern.
  • Ist im Eingabemodus das Formatfeld zu klein definiert oder ist beim PUT die Ausgabelänge größer als die im FORMAT angegebenen Werte, so wird kein Fehler erzeugt, sondern die Daten nach beschriebenen Regeln abgeschnitten. Wird die "SIZE-Bedingung eingeschaltet, erfolgt eine Fehlermeldung.

Eingabe

  • Die in Anzahl "w" definierte Feldlänge, liest in der angegebenen Länge, die Eingabedaten von links nach rechts.
  • Leerzeichen werden gelesen und zur Eingabelänge hinzugerechnet, aber nicht ausgewertet.
  • Die Ziffernfolge kann irgendwo im eingelesen Bereich, definiert durch "w" stehen.
  • Beim Datenformat "F" darf kein Exponent(Datenformat "E") verwendet werden. Nur Leerzeichen sind erlaubt.

Ausgabe

  • Sollte im DECLARE die Vorkommastelle kleiner als die Ausgabelänge im Datenformat definiert sein, so werden die überhängigen Zeichen als Leerzeichen gedruckt. Die rechtsbündige Ausrichtung im Druck bleibt erhalten.

Ergänzungen zur Syntax von F(w,d[,s])

Eingabe

  • Ist das Dezimalzeichen in den Eingabewerten mit angegeben, so wird die Eingabe sich an dem Dezimalzeichen orientieren und die Daten dementsprechend auswerten und stellengerecht einlesen.
  • Wird beim Einlesen kein Dezimalzeichen gefunden, so werden die in "d" definierten Dezimalstellen rechtsbündig verwendet.
    Die Eingabewerte sind z.B. 5134, definiert ist F(2,3). Das Ergebnis lautet = 5,134.

Ausgabe

  • Der Zahlenwert wird als Festkommazahl rechtsbündig ausgedruckt.
  • Das "+" Zeichen und führende Nullen werden als Leerzeichen ausgegeben.
  • Ist in der Formatierung, die Nachkommastelle größer definiert als im DECLARE, wird für das überzählige Zeichen eine Null gedruckt.
  • Ist die Nachkommastelle im Datenformat kleiner definiert als im DECLARE, so wird mathematisch aufgerundet. Ab =>5 wird die angezeigte Nachkommastelle um 1 erhöht.
  • Für das Vorzeichen und dem Dezimalzeichen muss je 1 Byte berücksichtigt werden.
  • Die maximale Größe von Vor- und Nachkommastellen sind 15 Bytes.
  • Wird eine Variable eingelesen, dass mit FIXED" definiert ist, so muss die Formatierungsdefinition für das Ausgabefeld 3 Bytes länger sein als für die Eingabe.
    • DECLARE EDATEN N FIXED (6,2);
    • PUT EDIT (EDATEN) (F(9,2));

Ergänzungen zur Syntax von F(w,0[,s])) oder F(w)

Beide Formate sind in den Auswirkungen identisch.

Eingabe

  • Es wird die Länge von "w" von links nach rechts eingelesen.
  • Vorhandene Leerzeichen werden nicht berücksichtigt, gehören aber zur Länge von "w".
  • Die Zahlen können irgendwo innerhalb der Länge von "w" stehen.
  • Wird in den Eingabedaten ein Dezimalzeichen gefunden, so wird dieses mit ausgewertet und entsprechend mit eingelesen. Die Gesamtlänge bleibt von "w" bleibt erhalten.

Ausgabe

  • Die Ausgabe wird rechtsbündig gedruckt.
  • Führende Nullen und ein positives Vorzeichen werden als Leerzeichen gedruckt.
  • "w" darf maximal 16 Bytes lang sein.
L
Zeichenkettenverarbeitung

FORMAT = L

Das L-Format dient dazu, den Rest einer Zeile zu bedienen. Soll eine Verarbeitung bis zum Ende einer Zeile durchgeführt werden, kann Ersatzweise das A-Format durch das L-Format ersetzt werden. Die Regeln für das A-Format und dem L-Format entsprechen sich.

Regeln für "L"

Eingabe

  • Die Daten werden bis zum Zeilenende eingelesen. beginnend nachfolgend dem zuletzt eingelesenen Wert. Maximal kann damit die ganze Zeile eingelesen werden.
  • Beispiel:
    • GET EDIT (ZAHL_EINGABEWERT, RESTWERT) (f(3), l);
    • ZAHL_EINGABEWERT erhält aus dem Eingabestrom maximal 3 Zahlen.
    • Der RESTWERT enthält alle Zeichen die nach (f(3)) kommen.
    • Eine Zeilenlängenangabe ist damit nicht notwendig.
  • Die Bearbeitung, beim Einlesen der Zeichen, erfolgt wie im A-Format.

Ausgabe

  • Die Daten werden bis zum Zeilenende ausgegeben.
  • Beispiel:
    • PUT EDIT (ZAHL_EINGABEWERT, RESTWERT) (f(6), l);
    • Es werden aus der Variablen "ZAHL_EINGABEWERT" maximal 6 Zeichen gedruckt.
    • Bei der Variablen "RESTWERT" werden alle Zeichen bis zum Ende der Zeile gedruckt.
    • Eine Angabe der Zeilenlänge ist damit nicht notwendig.
  • Die Bearbeitung, beim Ausgeben der Zeichen, erfolgt wie im A-Format.
R - Formatmarke

FORMAT = R(Formatmarke)

Formatmarke = "FORMAT (Formatliste)"

Das R-Format bietet die Möglichkeit, über "FORMAT" definierte, neue Formatierungen aufzurufen.

Regeln für "R"

Eingabe / Ausgabe

  • Das R-Format ist eine Steueranweisung, die die erstellten Formate aufruft.
  • Die Formate werden über "FORMAT (Formatliste) angelegt.
  • Diese Anweisung kann überall im Programm stehen, da diese vom Compiler ausgewertet wird.
  • Es können beliebig viele Daten- und Steuerformate zusammengefasst werden.
  • "FORMAT" kann auch einen Funktionsaufruf enthalten. Beim Aufrufruf von "R" kann dann ein Rückgabewert zurück geliefert werden.
  • Die Formate können ineinander geschachtelt sein.
  • Das gleich erstellte Format kann im "GET" sowie "PUT" verwendet werden, sofern es sinnvoll ist.
  • "R" ruft, im "GET EDIT" oder im "PUT EDIT", die erstellten Formate auf.
  • Enthält ein Format keine weiteren Formate, so kann "R" mit einem Wiederholungsfaktor angegeben werden.
  • Eine Formatliste kann mehr Datenformate enthalten als im "GET" oder "PUT" verwendet werden, diese werden nicht berücksichtigt.

Beispiel 1

  • Eingabe_Format: format (a(9));
  • GET EDIT (WERT1 , WERT2) (R(Eingabe_Format), R(Eingabe_Format));
  • alternativ dazu: GET EDIT (WERT1 , WERT2) (2R(Eingabe_Format));

Beispiel 2

  • EForm1: format (a(10), x(1), a(3), x(8), f(4,1), x(2), f(8,2));
  • EForm2: format (SKIP, r(EForm1),x(3), f(10,2));
  • GET EDIT (CHAR1, CHAR2, FIXED1, FIXED2) (R(EFORM1);
  • PUT EDIT (CHAR1, CHAR2, FIXED1, FIXED2 , FIXED3) (R(Eform2);
V
Zeichenkettenverarbeitung

FORMAT = V

DECLARE CHAR

Das V-Format dient dazu, den Rest einer Zeile zu lesen, ohne dass sich der Zeilenpointer verändert.
Dieser Befehl dürfte wohl nur dann einen Sinn machen, wenn eine ganze Zeile gelesen wird. Z.B. kann das Sinn machen, wenn entschieden werden muss, ob die Zeile mit "GET LIST" oder "GET EDIT" gelesen werden soll.

Dieser Befehl kann nur im "GET EDIT" verwendet werden.

Regeln für "V"

Eingabe

  • Die Daten werden bis zum Zeilenende eingelesen. beginnend nachfolgend dem zuletzt eingelesenen Wert. Maximal kann damit die ganze Zeile eingelesen werden.
  • Beispiel:
    • GET EDIT (ZEILEN_DATEN) (V));
    • Eine Zeilenlängenangabe ist damit nicht notwendig.
  • Der Zeilenpointer beim "GET EDIT" mit "V" wird nicht verändert, so dass beim nächsten "GET", die gleichen Zeichen nochmals gelesen werden.
  • Beim Einlesen der Daten werden diese bearbeitet wie im A-Format.

Beispiel

  • dcl (GESAMTE_ZEILE, ZEICHEN_FOLGE) char 551 var;
  • get edit (GESAMTE_ZEILE) (V);
    if left(GESAMTE_ZEILE,1) = "'"
        then
           get list (ZEICHEN_FOLGE);
        else do;
           get edit (ZEICHEN_FOLGE) (L);
           ZEICHEN_FOLGE = trim(ZEICHEN_FOLGE);
    end;
  • In diesem Beispiel wird entschieden, ob die Daten mit "GET EDIT" oder "GET LIST" gelesen werden. Es wird nochmals die gleiche Zeile gelesen.
Wiederholungsfaktor
Der Wiederholungsfaktor gibt an, wie oft ein Format wiederholt wird.

Regeln für den Wiederholungsfaktor

  • Der Wiederholungsfaktor gibt an, wie oft ein Format, für verschiedene Variablen oder Datenformate angewendet werden kann.
  • Die Wiederholungsrate vereinfacht die Schreibweise der Formate, da Wiederholungen im Format nicht programmiert werden müssen.
  • Angewendet werden kann der Wiederholungsfaktor vor einem einzelnen Format oder vor einem Gruppenformat.
  • Mit Einschränkungen kann der Wiederholungsfaktor auch für das R-Format verwendet werden.
  • Der Wiederholungsfaktor muss eine ganzzahlige Dezimalzahl oder ein ganzzahliger arithmetischer Ausdruck oder eine Variable sein.
  • Der Wiederholungsfaktor muss einen positiven Wert enthalten, sonst wird das anschließende Format übergangen.

Beispiele

  • PUT EDIT (A,B,C,D,E) (f(5,2), 2f(7,3), 2F(5,3)); mit Wiederholungsfaktor
    PUT EDIT (A,B,C,D,E) (f(5,2), f(7,3), f(7,3), F(5,3, F(5,3)); ohne Wiederholungsfaktor
  • verschiedene Schreibweisen:
    • PUT EDIT (A,B,C,D,E) (f(5,2), 2f(7,3), 2F(5,3));
    • PUT EDIT (A,B,C,D,E) (f(5,2), 2 f(7,3), 2F(5,3));
    • PUT EDIT (A,B,C,D,E) (f(5,2), (2(f(7,3), 2F(5,3));
  • PUT EDIT (A,B,C,D,E,F) 3(f(5,2), f(7,3)); Gruppenformat-Wiederholung
  • PUT EDIT (A,E,F) (N)(f(5,2), f(7,3)); Wiederholungsfaktor mit Variable (N=2)
  • PUT EDIT (A,E,F) (N f(5,2), f(7,3)); Wiederholungsfaktor mit Variable (N=2)
  • PUT EDIT (A,E,F) (5-3)(f(5,2), f(7,3)); Wiederholungsfaktor mit Arithmetik (N=2)
X-Zeichenkettenformat

FORMAT = X(w)

Das X-Format dient zur Verarbeitung von Leerstellen.

Regeln für "X"

Eingabe

  • Die Stellen, die in "w" definiert sind, werden beim Einlesen übersprungen.

Ausgabe

  • Es werden soviel Leerzeichen gedruckt, wie in "w" definiert sind.