Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

COPY-Anweisung

&pagelevel(4)&pagelevel

Funktion

Die COPY-Anweisung fügt Text aus einer Bibliothek in eine Übersetzungseinheit ein, wobei Teile des Textes ersetzt werden können.

Format


COPY textname [{OF | IN} bibliotheksname] [SUPPRESS]

[REPLACING {

{  wort-1
 | bezeichner-1
 | literal-1
 | ==pseudotext-1==
}

BY

wort-2
 | bezeichner-2
 | literal-2
 | ==pseudotext-2==
}

}... ].


Syntaxregeln

  1. textname ist der Name des Textes, der in die Übersetzungseinheit hineinkopiert wird. Der Text ist unter diesem Namen als Bibliothekselement in einer Bibliothek gespeichert. textname ist ein 1 bis 31 Zeichen langer benutzerdefinierter Name.

  2. Ist textname durch bibliotheksname qualifiziert, wird die angegebene Bibliothek nach dem Text durchsucht.
    Wenn textname nicht durch bibliotheksname qualifiziert ist, werden bis zu zehn Bibliotheken nach dem Text durchsucht.
    Die Zuordnung von Bibliotheken während der Übersetzungszeit ist im Handbuch „COBOL2000 Benutzerhandbuch“ [1] näher beschrieben.

  3. Vor der COPY-Anweisung muss ein Leerzeichen oder ein anderes Trennsymbol stehen.

  4. pseudotext-1 muss mindestens ein Textwort (siehe "Textwort" im Abschnitt „Begriffserklärungen") enthalten, während pseudotext-2 auch leer (====) sein oder nur Leerzeichen, Komma, Semikolon und Kommentarzeilen enthalten kann.

  5. Textwörter in pseudotext-1 und pseudotext-2 und Textwörter, die bezeichner-1, bezeichner-2, literal-1, literal-2, wort-1, wort-2 bilden, können in der nächsten Zeile fortgesetzt werden. Das Pseudotext-Begrenzungszeichen (==) darf hingegen nicht fortgesetzt werden.

  6. wort-1 und wort-2 kann jedes einzelne COBOL-Wort außer COPY sein.
  7. Kleinbuchstaben, die in Textwörtern verwendet werden, sind äquivalent zu den entsprechenden Großbuchstaben.
  8. Eine COPY-Anweisung wird innerhalb eines Programm überall erkannt, ausgenommen
    • in Kommentarzeilen,
    • innerhalb nichtnumerischer Literale.
  9. Der durch eine COPY-Anweisung erzeugte Text darf keine COPY-Anweisung enthalten. Der hier beschriebene Compiler lässt dies jedoch im äußersten COPY zu:  Enthält eine COPY-Anweisung keine REPLACING-Angabe, dann darf der zugehörige Bibliothekstext COPY-Anweisungen enthalten; diese können auch eine REPLACING-Angabe haben.

Allgemeine Regeln

  1. Die Ausführung einer COPY-Anweisung bewirkt, dass der mit textname angegebene Bibliothekstext in die Übersetzungseinheit kopiert wird. Der Bibliothekstext ersetzt dabei die gesamte COPY-Anweisung (einschließlich des abschließenden Trennsymbols Punkt).

  2. Wenn SUPPRESS angegeben ist, wird der Bibliothekstext in die Übersetzungseinheitliste nicht aufgeführt.

  3. Ist REPLACING nicht angegeben, wird der Bibliothekstext unverändert kopiert.


COPY...REPLACING...

  1. Ist REPLACING angegeben, wird der Bibliothekstext kopiert, wobei der Text vor BY (A-Operanden) durch den Text nach BY (B-Operanden) ersetzt wird.

  2. Eine Textersetzung findet nur statt, wenn der Text vor BY für jedes Textwort Zeichen für Zeichen mit dem entsprechenden Bibliothekstext übereinstimmt.

  3. bezeichner-1, wort-1 und literal-1 werden wie ein Pseudotext behandelt, der nur bezeichner-1, wort-1 bzw. literal-1 enthält.

  4. Der Vergleich zwischen dem Bibliothekstext und dem vor BY angegebenen Text (A-Operanden), von dessen Ergebnis abhängt, ob eine Textersetzung stattfindet oder nicht, verläuft folgendermaßen:

    • Alles vor dem ersten Textwort im Bibliothekstext wird in die Übersetzungseinheit kopiert. Beginnend mit dem ersten der A-Operanden (pseudotext-1, bezeichner-1, wort-1, literal-1), werden der Reihe nach alle A-Operanden mit der gleichen Anzahl von entsprechenden Bibliothekstextwörtern, jeweils beginnend mit dem ersten Bibliothekstextwort, verglichen.

    • Jedes der Trennsymbole Komma (,'BLANK'), Semikolon (;'BLANK') oder Leerzeichen in pseudotext-1 oder im Bibliothekstext wird als einzelnes Leerzeichen betrachtet. Jede Folge von einem oder mehreren Leerzeichen als Trennsymbol wird als einzelnes Leerzeichen betrachtet.

    • Wird keine Übereinstimmung festgestellt, wird der Vergleich mit den folgenden A-Operanden wiederholt, bis entweder eine Übereinstimmung gefunden wird, oder kein A-Operand mehr folgt.

    • Wenn alle A-Operanden der REPLACING-Angabe verglichen worden sind und keine Übereinstimmung festgestellt wurde, wird das erste Bibliothekstextwort in die Übersetzungseinheit kopiert. Das nächste Bibliothekstextwort wird dann als das
      erste Wort angesehen und der Vergleichsvorgang beginnt erneut mit dem ersten A-Operanden.

    • Jedesmal, wenn eine Übereinstimmung zwischen einem A-Operanden und dem Bibliothekstext auftritt, wird der zugehörige B-Operand (pseudotext-2, bezeichner-2, wort-2 oder literal-2) in die Übersetzungseinheit übertragen und er setzt den mit dem A-Operanden übereinstimmenden Bibliothekstext. Das nächste Bibliothekstextwort nach dem letzten ersetzten Textwort wird dann als erstes Textwort betrachtet, und der Vergleich wird, beginnend mit dem ersten A-Operanden, wiederholt.

    • Der Vergleichszyklus wird so lange fortgesetzt, bis das letzte Bibliothekstextwort entweder kopiert oder ersetzt worden ist.

  5. Kommentar- oder Leerzeilen im Bibliothekstext und in pseudotext-1 werden beim Vergleich wie ein Leerzeichen behandelt. Kommentar- oder Leerzeilen in pseudotext-2 werden ggf. unverändert in die Übersetzungseinheit übertragen. Kommentar- oder Leerzeilen im Bibliothekstext werden unverändert in die Übersetzungseinheit kopiert, es sei denn, sie stehen innerhalb einer Textwortfolge, die mit pseudotext-1 übereinstimmt und deshalb ersetzt wird.

  6. Testhilfezeilen sind im Bibliothekstext und im Pseudotext erlaubt. Textwörter in einer Testhilfezeile unterliegen den Vergleichsregeln, als ob kein „D“ im Anzeigebereich (Spalte 7) der Testhilfezeile stünde. Eine Testhilfezeile ist innerhalb eines Pseudotexts spezifiziert, wenn der öffnende Pseudotextbegrenzer auf einer Zeile steht, die der Testhilfezeile vorangeht.

  7. Jedes aus der Bibliothek kopierte, aber nicht ersetzte Textwort wird so kopiert, dass es im gleichen Bereich (Programmtext-Bereich) steht wie im Bibliothekstext.
    Bei einer Ersetzung durch Pseudotext steht jedes Textwort im Programmtext-Bereich, wie in pseudotext-2 angegeben. Text aus einer Bibliothek wird in den gleichen Bereich der Übersetzungseinheit kopiert, in dem er in der Bibliothek steht. Deshalb muss er mit den Regeln des COBOL-Referenzformats übereinstimmen.

  8. Steht eine COPY-Anweisung in einer Testhilfezeile, wird der kopierte Text so behandelt, als ob er ebenfalls in Testhilfezeilen stünde. Dies gilt auch für zusätzliche, auf Grund von Ersetzungen n der Übersetzungseinheit entstehende Zeilen.

  9. Wenn durch eine COPY-Anweisung mit REPLACING-Angabe eine Zeile so verlängert wird, dass zusätzliche Zeilen erforderlich sind, dann werden entsprechende zusätzliche Zeilen erzeugt, die eventuell in Spalte 7 ein Fortsetzungskennzeichen enthalten.
  10. Um Teile eines Textworts zu ersetzen, muss die zu ersetzende Zeichenkette im Bibliothekstext und im A-Operanden der REPLACING-Angabe durch geeignete Trennsymbole (z.B. Doppelpunkt oder runde Klammern) eingeschlossen und damit als eigenes Textwort gekennzeichnet werden (siehe Beispiel 3-4).
  11. Das Referenzformat, das für die COPY-Anweisung gilt, muss dasselbe sein, das auch für die ggf. zu ersetzenden Teile im Bibliothekstext gilt.

Beispiel 3-1

Der Bibliothekstext namens ADR steht in der Bibliothek ADRLIB und besteht aus folgenden Zeilen:

05  STRASSE    PIC X(20).
05  PLZ        PIC 9(5).
05  ORT        PIC X(20).
05  LAND       PIC X(20). 

In der Übersetzungseinheit wird die COPY-Anweisung wie folgt geschrieben:

01  ADRESSE.
    COPY ADR OF ADRLIB.

Nach Ausführung der COPY-Anweisung steht in der Übersetzungseinheit:

01  ADRESSE.
    COPY ADR OF ADRLIB.    ———————————————————————— (1)
    05 STRASSE     PIC X(20).
    05 PLZ         PIC 9(5).
    05 ORT         PIC X(20).
    05 LAND        PIC X(20).
(1)

Die COPY-Anweisung erscheint in der Übersetzungseinheitliste, wird aber während der Übersetzung als Kommentar behandelt.

Beispiel 3-2

Um den Bibliothekstext zu ändern, wird in der COPY-Anweisung die REPLACING-Angabe verwendet:

COPY ADR OF ADRLIB
 REPLACING ADRESSE BY ADDRESS
           STRASSE BY STREET
           ==PLZ PIC 9(5)== BY ==POSTCODE PIC X(8)==
           ORT BY TOWN
           LAND BY COUNTRY

Nach Ausführung der COPY-Anweisung steht in der Übersetzungseinheit:

01  ADRESSE.
    COPY ADR OF ADRLIB                                         (1)
     REPLACING ADRESSE BY ADDRESS                               |
               STRASSE BY STREET                                |
               ==PLZ PIC 9(5)== BY ==POSTCODE PIC X(6)==        |
               ORT BY TOWN                                      |
               LAND BY COUNTRY.                                (1)
    05  STREET PIC X(20).
    05  POST CODE PIC X(6).
    05  TOWN PIC X(20).
    05  COUNTRY PIC X(20).
(1)

Die COPY-Anweisung erscheint in der Übersetzungseinheitliste, wird aber während der Übersetzung als Kommentar behandelt.

Die Änderungen gelten nur für diese Übersetzungseinheit. Der Text in der Bibliothek bleibt unverändert.

Beispiel 3-3

Um im Bibliothekstext die Zeichenkette

... PIC X(30).

durch die Zeichenkette

... PIC X(40).

zu ersetzen, muss in pseudotext-1 und pseudotext-2 nach dem Punkt ein Leerzeichen eingefügt werden, da sonst nach einem Punkt gesucht wird, während im Bibliothekstext ein Trennzeichen Punkt steht:

...REPLACING ==PIC X(30).'BLANK'== BY ==PIC X(40).'BLANK'==

Beispiel 3-4

Der Bibliothekstext in ELEM

01 FILLER
   02 :prefix:-name PIC X(30).
   02 :prefix:-address PIC X(30).

wird durch die COPY-Anweisungen

...
COPY ELEM OF COPYLIB REPLACING ==:prefix:== BY ==in==.
COPY ELEM OF COPYLIB REPLACING ==:prefix:== BY ==out==.
...

expandiert zu:

...
01 FILLER
   02 in-name PIC X(30).
   02 in-address PIC X(30).
01 FILLER
   02 out-name PIC X(30).
   02 out-address PIC X(30).
...