Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

Beispiel: Programm zum Kopieren von Dateien

&pagelevel(4)&pagelevel

Es soll ein Programm erstellt werden, das ISAM- und SAM-Dateien kopiert. Dabei soll es möglich sein, Folgendes zu ändern:

  • die Zugriffsmethode

  • die Satzlänge

  • den ISAM-Schlüssel.

Das Programm soll als Hauptprogramm ablaufen.

Falls die zu bearbeitende Datei durch ein Kennwort geschützt ist, soll dieses dunkelgesteuert eingegeben werden können. Fehlt das Kennwort, so soll es in einem Fehlerdialog angefordert werden.

Das Programm hat neben den SDF-Standardanweisungen die folgende Anweisung:

COPY-FILE

FROM-FILE = <filename 1..54>

,TO-FILE = <filename 1..54 without-gen-vers>(...)

<filename 1..54 without-gen-vers>(...)

  ACCESS-METHOD = *SAME / *ISAM(...) / *SAM

*ISAM(...)

  KEY-LENGTH = *STD / <integer 1..50>

  ,RECORD-SIZE = *SAME / *VARIABLE / <integer 1..2048>

,PASSWORD = *NONE / <c-string 1..4> / *SECRET-PROMPT

Programm in der Benutzersyntaxdatei definieren

Das Programm KOP wird in der Benutzersyntaxdatei SDF.KOP.SYNTAX definiert:

/set-logon-parameters sdfusr, ... —————————————————————————————————————  (1)
 .
 .
/start-sdf-a ——————————————————————————————————————————————————————————  (2)
%  BLS0517 MODULE 'SDAMAIN' LOADED
%  SDA0001 'SDF-A' VERSION '04.1E10' STARTED
%//open-syntax-file sdf.kop.syntax,,*create ———————————————————————————  (3)
%//add-program kop ————————————————————————————————————————————————————  (4)
%//add-stmt name=copy-file,prog=kop,intern-name=copyfi,stmt-version=1 —  (5)
%//add-oper from-file,res-oper-name=*pos(1) ———————————————————————————  (6)
%//add-val *filename ——————————————————————————————————————————————————  (7)
%//add-oper to-file,res-oper-name=*pos(2) —————————————————————————————  (8)
%//add-val *filename(gen=*n,vers=*n),structure=*y(siz=*small) —————————  (9)
%//add-oper access-method,default='same',res-oper-name=*pos(3) ———————— (10)

                                                                                       

(1)

Unter der Benutzerkennung SDFUSR wird eine Task gestartet.

(2)

SDF-A wird geladen und gestartet.

(3)

Die Benutzersyntaxdatei SDF.KOP.SYNTAX wird erzeugt und geöffnet.

(4)

Das Programm KOP wird definiert. Als INTERNAL-NAME übernimmt SDF-A standardmäßig die ersten drei Buchstaben KOP.

(5)

Der Kopf der zum Programm KOP gehörenden Anweisung COPY-FILE wird definiert. Ihr INTERNAL-NAME ist COPYFI. Sie erhält die Versionsnummer 1.

(6)

Der erste Operand der Anweisung COPY-FILE wird definiert. Sein Name ist FROM-FILE. Im Operanden-Array des Übergabebereichs steht er an erster Stelle.

(7)

Es wird definiert, dass der Wert des Operanden FROM-FILE vom Datentyp FILE-NAME sein muss.

(8)

Der zweite Operand der Anweisung COPY-FILE wird definiert. Sein Name ist TO-FILE. Im Operanden-Array des Übergabebereichs steht er an zweiter Stelle.

(9)

Es wird definiert, dass der Wert des Operanden TO-FILE vom Datentyp FILENAME sein muss. Es darf weder eine Generationsnummer noch eine Versionsbezeichnung angegeben werden. FILENAME leitet eine Struktur ein.

(10)

Der erste Operand in der Struktur FILENAME wird definiert. Sein Name ist ACCESS-METHOD. Sein Default-Wert ist SAME. Im Operanden-Array des Übergabebereichs steht er an dritter Stelle.

%//add-val *keyw,val='same' ——————————————————————————————————————————— (11)
%//add-val *keyw,val='isam',struct=*y ————————————————————————————————— (12)
%//add-oper key-length,default='std',res-oper-name=*pos(4) ———————————— (13)
%//add-val *keyw,val='std' ———————————————————————————————————————————— (14)
%//add-val *integer(1,50) ————————————————————————————————————————————— (15)
%//close-structure ———————————————————————————————————————————————————— (16)
%//add-val *keyw,val='sam' ———————————————————————————————————————————— (17)
%//add-oper record-size,default='same',res-oper-name=*pos(5) —————————— (18)
%//add-val *keyw,val='same' ——————————————————————————————————————————— (19)
%//add-val *keyw,val='variable' ——————————————————————————————————————— (20)
%//add-val *integer(1,2048) ——————————————————————————————————————————— (21)
%//close-struct ——————————————————————————————————————————————————————— (22)

                                                                                       

(11)

Es wird definiert, dass das Schlüsselwort SAME ein zulässiger Wert des Operanden ACCESS-METHOD ist.

(12)

Es wird definiert, dass das Schlüsselwort ISAM ein zulässiger Wert des Operanden ACCESS-METHOD ist. ISAM leitet eine Struktur ein.

(13)

Der erste Operand in der Struktur ISAM wird definiert. Sein Name ist KEY-LENGTH. Sein Default-Wert ist STD. Im Operanden-Array des Übergabebereichs steht er an vierter Stelle.

(14)

Es wird definiert, dass das Schlüsselwort STD ein zulässiger Wert des Operanden KEY-LENGTH ist.

(15)

Es wird definiert, dass der Wert des Operanden KEY-LENGTH vom Datentyp INTEGER sein kann. Als untere Grenze wird 1 und als obere 50 definiert.

(16)

Die gerade bearbeitete Struktur ISAM wird geschlossen.

(17)

Es wird definiert, dass das Schlüsselwort SAM ein zulässiger Wert des Operanden ACCESS-METHOD ist.

(18)

Der zweite Operand in der Struktur FILENAME wird definiert. Sein Name ist RECORD-SIZE. Sein Default-Wert ist SAME. Im Operanden-Array des Übergabebereichs steht er an fünfter Stelle.

(19)

Es wird definiert, dass das Schlüsselwort SAME ein zulässiger Wert des Operanden RECORD-SIZE ist.

(20)

Es wird definiert, dass das Schlüsselwort VARIABLE ein zulässiger Wert des Operanden RECORD-SIZE ist.

(21)

Es wird definiert, dass der Wert des Operanden RECORD-SIZE vom Datentyp INTEGER sein kann. Als untere Grenze wird 1 und als obere 2048 definiert.

(22)

Die gerade bearbeitete Struktur FILENAME wird geschlossen.

%//add-oper password,default='none',secret=*y,res-oper-name=*pos(6) ——— (23)
%//add-val *keyw,val='none' ——————————————————————————————————————————— (24)
%//add-val *c-string(1,4) ————————————————————————————————————————————— (25)
%//add-val *keyw,val='secret-prompt',out=*secret —————————————————————— (26)
%//close-cmd —————————————————————————————————————————————————————————— (27)
%//show object=*program(name=kop),size=*max ——————————————————————————— (28)
KOP

COPY-FILE

   FROM SDF.KOP.SYNTAX (USER)
     FROM-FILE =
          filename 1..54
     TO-FILE =
          filename 1..54_without-generation-version()
          STRUCTURE: filename
               ACCESS-METHOD = *SAME
                    *SAME or *ISAM() or *SAM
                    STRUCTURE: *ISAM
                         KEY-LENGTH = *STD
                              *STD or integer_1..50
               RECORD-SIZE = *SAME
                    *SAME or *VARIABLE or integer_1..2048
     PASSWORD =
          *NONE or c-string_1..4 or *SECRET-PROMPT -DEFAULT-: NONE

%//end
 .
 .
%//exit-job

                                                                                       

(23)

Der dritte globale Operand der Anweisung COPY-FILE wird definiert. Sein Name ist PASSWORD. Sein Default-Wert ist NONE. Er ist als geheimer Operand definiert. Im Operanden-Array des Übergabebereichs steht er an sechster Stelle.

(24)

Es wird definiert, dass das Schlüsselwort NONE ein zulässiger Wert des Operanden PASSWORD ist.

(25)

Es wird definiert, dass der Wert des Operanden PASSWORD vom Datentyp C-STRING sein kann. Als minimale Länge ist 1 definiert, als maximale 4.

(26)

Es wird definiert, dass das Schlüsselwort SECRET-PROMPT ein zulässiger Wert des Operanden PASSWORD ist. Es wird nicht an die Implementierung übergeben, sondern nach seiner Eingabe fordert SDF die dunkelgesteuerte Eingabe eines Werts für PASSWORD an.

(27)

Die Definition der Anweisung COPY-FILE wird abgeschlossen.

(28)

Die Definition des Programms KOP wird mit der einzigen zugehörigen Anweisung in der ausführlichsten Form ausgegeben.

Nach Analyse der Anweisung COPY-FILE schreibt SDF folgende Informationen in den Übergabebereich. Die in runde Klammern eingeschlossenen Angaben schreibt SDF-A nur im Fall ACCESS-METHOD=*ISAM.

Byte

Länge in
Byte

Bezeichnung

Wert

0 bis 7

8

Standardheader


8 bis 11

4

Länge des Übergabebereichs


12 bis 19

8

interner Anweisungsname

C'COPYFI'

20 bis 23

4

reserviert


24 bis 26

3

Version der Anweisung

C'001'

27 bis 35

9

reserviert


36 bis 37

2

Anzahl der Positionen im Operanden-Array

6

38 bis 39

2

reserviert


40

41

42


43






44 bis 47

1

1

1


1






4

Zusatzinformation für FROM-FILE

Typbeschreibung für FROM-FILE

Globale Syntaxattribute für FROM-FILE (immer 0, da

Wildcards nicht erlaubt sind)

Syntaxattribute für Datentyp <filename>, wenn:

  • Cat-ID vorhanden
  • User-ID vorhanden

  • Dateigeneration vorhanden

  • Version vorhanden

  • Datei temporär ist

Absolutadresse des Werts von FROM-FILE

B'1... ....'

11

B'.... ....'


B'1... ....'

B'.1.. ....'

B'..1. ....'

B'...1 ....'

B'.... 1...'


aaaa

48

49

50


51




52 bis 55

1

1

1


1




4

Zusatzinformation für TO-FILE

Typbeschreibung für TO-FILE

Globale Syntaxattribute für TO-FILE (immer 0, da

Wildcards nicht erlaubt sind)

Syntaxattribute für Datentyp <filename>, wenn:

  • Cat-ID vorhanden
  • User-ID vorhanden

  • Datei temporär ist

Absolutadresse des Werts von TO-FILE

B'1... ....'

11

B'.... ....'


B'1... ....'

B'.1.. ....'

B'.... 1...'


aaaa

56

57

58

59

60 bis 63

1

1

1

1

4

Zusatzinformation für ACCESS-METHOD

Typbeschreibung für ACCESS-METHOD

reserviert

reserviert

Absolutadresse des Werts von ACCESS-METHOD

B'1... ....'

22



aaaa

64


65

66

67

68 bis 71

1


1

1

1

4

Zusatzinformation für KEY-LENGTH


Typbeschreibung für KEY-LENGTH

reserviert

reserviert

Absolutadresse des Werts von KEY-LENGTH

B'0... ....'

oder

B'1... ....'

(2 oder 22


(aaaa)

72

73

74

75

76 bis 79

1

1

1

1

4

Zusatzinformation für RECORD-SIZE

Typbeschreibung für RECORD-SIZE

reserviert

reserviert

Absolutadresse des Werts von RECORD-SIZE

B'1... ....'

2 oder 22



aaaa

80

81

82

83


84 bis 87

1

1

1

1


4

Zusatzinformation für PASSWORD

Typbeschreibung für PASSWORD

reserviert

Syntaxattribute für Datentyp <c-string>:

  • wenn Kennwort Hochkommas enthält

Absolutadresse des Werts von PASSWORD

B'1... ....'

2 oder 22



B'1... ....'

aaaa


2

2

54

Längenangabe

reserviert

Wert von FROM-FILE

II


xxx


2

2

54

Längenangabe

reserviert

Wert von TO-FILE

II


xxx


2

2

≤4

Längenangabe

reserviert

Wert von ACCESS-METHOD

II


xxx


2

2

(≤ 4)

(Längenangabe)

(reserviert)

(Wert von KEY-LENGTH)

(II)


(xxx)


2

2

≤ 8

Längenangabe

reserviert

Wert von RECORD-SIZE

II


xxx


2

2

≤ 4

Längenangabe

reserviert

Wert von PASSWORD

II


xxx

Die Anweisung COPY-FILE belegt im Übergabebereich maximal 240 Byte. Der Übergabebereich muss deshalb mindestens 240 Byte groß sein.

Programm erstellen

Im Folgenden ist das Programm KOP wiedergegeben:

KOP      START
         TITLE 'Example of program using SDF macros'
*---------------------------------------------------------------------* 
* The program reads and corrects the statement COPY-FILE with SDF,
* then executes it.
* The field identifiers used by this program are to be found in the 
* SDF macros CMDTA for the transfer area, CMDMEM for the status.
*---------------------------------------------------------------------* 
R0       EQU      0
R1       EQU      1
R2       EQU      2
R3       EQU      3
R4       EQU      4
R5       EQU      5
R6       EQU      6
R7       EQU      7
R8       EQU      8
R9       EQU      9
R10      EQU      10
R11      EQU      11 
R12      EQU      12
R13      EQU      13
R14      EQU      14
R15      EQU      15
*---------------------------------------------------------------------* 
FRFILE#  EQU      1                     position of operand FROM-FILE
TOFILE#  EQU      2                                         TO-FILE
ACCESS#  EQU      3                                         ACCESS-METH
KEYLEN#  EQU      4                                         KEY-LENGTH
RECSIZ#  EQU      5                                         RECORD-SIZE
PASSWR#  EQU      6                                         PASSWORD
         CMDANALY ,                     SDF return codes
TAD      CMDTA    MF=D                  SDF transfer area 
RSTD     CMDRST   MF=D                  Read statements
CSTD     CMDCST   MF=D                  Correct statement
*---------------------------------------------------------------------* 
*        Register usage
*        R2       SDF output area for CMDSTA, CMDRST, CMDCST.
*        R3       current character in filename analysis
*        R3       current field in SDF output area
*
*        R5       help register
*        R10,R11  base registers
*        R15      return code
*---------------------------------------------------------------------* 
KOP      CSECT    ,
BEGIN    BALR     R10,R0
         USING    *,R10,R11
         B        F00
SLICE#   DC       F'4096'
F00      LR       R11,R10
         A        R11,SLICE#
*---------------------------------------------------------------------* 
*        Check if user syntax file is activated. 
*---------------------------------------------------------------------* 
         CMDMEM   D,P=XMD               Layout for CMDSTA output
*
KOP      CSECT    ,
*
         CMDSTA   OUTAREA=STA#OUT       Get SDF options
*
         USING    XMDMEM,R2
         LA       R2,STA#OUT
         LA       R3,XMDUSER
         CLI      0(R3),':'                Check catid
         BNE      NOCATID
CATIDL   LA       R3,1(R3)
         CLI      0(R3),':' 
         BNE      CATIDL
         LA       R3,1(R3)
NOCATID  CLI      0(R3),'$'                Check userid 
         BNE      NOUSERID
USERIDL  LA       R3,1(R3)
         CLI      0(R3),'.'
         BNE      USERIDL
         LA       R3,1(R3)
NOUSERID CLC      0(USF#L,R3),USF#NAME     Check user syntax file 
         BNE      FC#ERROR
         DROP     R2
*---------------------------------------------------------------------* 
*        Read SDF statement. 
*---------------------------------------------------------------------* 
READSTMT DS       0Y
         MVI      OWNFLAGS,0
         USING    RSTD,1            from CMDRST
         USING    TAD,R2            from CMDTA
         LA       R1,RSTPL
         LA       R2,OUTPUT
*
         CMDRST   MF=E,PARAM=RSTPL
*
         CLI      CMDRMR1,CMDRSUCCESSFUL  no error, continue...
         BE       F01
         CLI      CMDRMR1,CMDREOF         EOF reached
         BE       FC#EOF
         CLI      CMDRMR1,CMDREND_STMT    //END was read
         BE       FC#END
         B        FC#ERROR              otherwise error...
*---------------------------------------------------------------------* 
*        Evaluate structured-description 
*---------------------------------------------------------------------* 
F01      DS       0H
         CLC      CMDINTN,COPYFILE      is this //COPY-FILE ?
         BNE      FC#ERROR              it can only be //COPY-FILE !
*---------------------------------------------------------------------* 
*        operand FROM-FILE
*---------------------------------------------------------------------* 
         LA       R3,CMDMAIN+(FRFILE#-1)*CMDHEAL   FROM-FILE
         USING    CMDHEAD,R3
         L        R3,CMDOPTR            A(from-file value)
         MVI      FRFILE,' '
         MVC      FRFILE+1(L'FRFILE-1),FRFILE
         USING    CMDOVAL,R3            value field
         LH       R5,CMDLVAL            value length
         BCTR     R5,R0
         EX       R5,EX#MVC1            mvc with l=R5
         B        F02                   skip ex#mvc1...
EX#MVC1  MVC      FRFILE(1),CMDAVAL
*---------------------------------------------------------------------* 
*        operand PASSWORD
*---------------------------------------------------------------------* 
F02      DS       0H
         LA       R3,CMDMAIN+(PASSWR#-1)*CMDHEAL   PASSWORD
         USING    CMDODES,R3
         CLI      CMDOTYP,CMDCSTR       C-string input ?
         BNE      NO#PASS               no: no password input 
*        copy input password into own field
         MVI      PASSWR,' '
         MVC      PASSWR+1(L'PASSWR-1),PASSWR
         USING    CMDHEAD,R3            operand description
         L        R3,CMDOPTR            A(password value)
         USING    CMDOVAL,R3            value field
         LH       R5,CMDLVAL            value length
         BCTR     R5,R0
         EX       R5,EX#MVC2            mvc with l=R5
         B        FC#OPEN               skip ex#mvc2...
EX#MVC2  MVC      PASSWR(1),CMDAVAL
NO#PASS  DS       0H 
         OI       OWNFLAGS,NOPASS
FC#OPEN  DS       0H
         CLC      PASSWR,QUESTION       is password = '????' 
         BE       PASS#ER               test corstmt part.
*        open of file FROM-FILE
*        ...
*        if error at open of FROM-FILE:
*        B        PASS#ER
*---------------------------------------------------------------------* 
*        operand TO-FILE
*---------------------------------------------------------------------* 
         LA       R3,CMDMAIN+(TOFILE#-1)*CMDHEAL   TO-FILE 
         USING    CMDODES,R3
         TM       CMDGSTA,CMDOCC       operand input ? 
         BZ       FC#ERROR              no: error
         MVI      TOFILE,' '
         MVC      TOFILE+1(L'TOFILE-1),TOFILE
         USING    CMDHEAD,R3
         L        R3,CMDOPTR            A(to-file value)
         USING    CMDOVAL,R3            value field
         LH       R5,CMDLVAL            value length
         BCTR     R5,R0
         EX       R5,EX#MVC3            mvc with l=R5
         B        F03                   skip ex#mvc3...
EX#MVC3  MVC      TOFILE(1),CMDAVAL
*---------------------------------------------------------------------* 
*        operand ACCESS-METHOD
*---------------------------------------------------------------------* 
F03      DS       0H
         LA       R3,CMDMAIN+(ACCESS#-1)*CMDHEAL   ACCESS-METHOD 
         USING    CMDODES,R3
         TM       CMDGSTA,CMDOCC        operand input ? 
         BZ       FC#ERROR              no: error
         USING    CMDHEAD,R3
         L        R3,CMDOPTR            A(access-method value)
         USING    CMDOVAL,R3            value field
         LH       R5,CMDLVAL            value length
         CH       R5,THREE              sam?
         BE       I#SAM
         CLI      CMDAVAL,'I'           isam?
         BE       I#SAM
*        access-method = same
         OI       OWNFLAGS,ACCSAME 
         MVI      ACCESS,'X'
         B        F04                   skip sam/isam
*        access-method = sam / isam
I#SAM    DS       0H
         MVC      ACCESS,CMDAVAL        S:sam / I:isam
*---------------------------------------------------------------------* 
*        operand KEY-LENGTH
*---------------------------------------------------------------------* 
F04      DS       0H
         LA       R3,CMDMAIN+(KEYLEN#-1)*CMDHEAL   KEY-LENGTH
         USING    CMDODES,R3
         TM       CMDGSTA,CMDOCC        operand input ? 
         BZ       F05                   no: not isam, next operand.
         CLI      CMDOTYP,CMDINT
         BE       KEYINT
*        key-length = std : keylen := 8
         MVI      KEYLEN,8
         B        F05
*        key-length = <integer_1..50> 
KEYINT   DS       0H
         USING    CMDHEAD,R3
         L        R3,CMDOPTR            A(key-length value)
         USING    CMDOVAL,R3            value field
         MVC      KEYLEN,CMDAVAL+3
         B        F05
*---------------------------------------------------------------------* 
*        operand RECORD-SIZE
*---------------------------------------------------------------------* 
F05      DS       0H
         LA       R3,CMDMAIN+(RECSIZ#-1)*CMDHEAL   RECORD-SIZE
         USING    CMDODES,R3
         TM       CMDGSTA,CMDOCC        operand input ? 
         BZ       FC#ERROR              no: error 
         CLI      CMDOTYP,CMDINT
         BE       RECINT
         USING    CMDHEAD,R3
         L        R3,CMDOPTR            A(record-size value)
         USING    CMDOVAL,R3            value field
         LH       R5,CMDLVAL            value length
         CH       R5,FOUR 
         BNE      F051
*        record-size = same
         OI       OWNFLAGS,RECSAME
         B        F06
F051     DS       0H
*        record-size = variable
         OI       OWNFLAGS,RECVAR
         B        F06
*        record-size = <integer_1..2048>
RECINT   DS       0H
         USING    CMDHEAD,R3
         L        R3,CMDOPTR            A(record-size value)
         USING    CMDOVAL,R3            value field
         MVC      RECSIZ,CMDAVAL+2
F06      DS       0H
*---------------------------------------------------------------------* 
*   ...  Copy file ... 
*        Output of copied values for test purpose (even password!)
*---------------------------------------------------------------------* 
         WROUT    MESS1,FC#END
         WROUT    MESS2,FC#END
         TM       OWNFLAGS,NOPASS
         BZ       WMESS3
         WROUT    MESS11,FC#END
         B        WMESS4
WMESS3   DS       0H
         WROUT    MESS3,FC#END
WMESS4   DS       0H
         TM       OWNFLAGS,ACCSAME
         BZ       WMESS5
         WROUT    MESS4,FC#END          access given 
         B        WMESS6
WMESS5   WROUT    MESS5,FC#END          access default
WMESS6   DS       0H
         TM       OWNFLAGS,KEYSTD
         BNZ      WMESS8
         UNPK     BUFF5(5),KEYHW(3)
         TR       BUFF5(4),CONVCHAR-XF0
         MVC      KEYCHAR,BUFF5
         WROUT    MESS6,FC#END
         B        WMESS7
WMESS8   WROUT    MESS8,FC#END
WMESS7   DS       0H
         TM       OWNFLAGS,RECSAME
         BNZ      WMESS9
         TM       OWNFLAGS,RECVAR 
         BNZ      WMESS10
         UNPK     BUFF5(5),RECSIZ(3)
         TR       BUFF5(4),CONVCHAR-XF0
         MVC      RECCHAR,BUFF5
         WROUT    MESS7,FC#END
         B        REPEAT
WMESS9   WROUT    MESS9,FC#END
         B        REPEAT
WMESS10  WROUT    MESS10,FC#END
*
*        R E P E A T   READSTMT
* 
REPEAT   DS       0H
         B        READSTMT
*---------------------------------------------------------------------* 
*        Password handling routine
*---------------------------------------------------------------------* 
PASS#ER  DS       0H
         LA       R3,CMDMAIN+(PASSWR#-1)*CMDHEAL   PASSWORD
         USING    CMDODES,R3
         OI       CMDGSTA,CMDERR        set operand erroneous
         LA       R1,CSTPL
         USING    CSTD,R1
         CMDCST   MF=M,MESSAGE=A(MESSAGE)
CORRSTMT CMDCST   MF=E,PARAM=CSTPL
         CLI      CMDCMR1,CMDCSUCCESSFUL  corstmt successful? 
         BNE      READSTMT                no: new read...
         B        F01                     repeat analysis...
*
*        Game over. 
*
         B        FC#END
*---------------------------------------------------------------------* 
FC#ERROR DS       0H                    error handling routine
*        ...
FC#EOF   DS       0H                    EOF   handling routine
*        ...
*---------------------------------------------------------------------* 
FC#END   TERM
*---------------------------------------------------------------------* 
*        Parameter lists
*---------------------------------------------------------------------* 
RSTPL    CMDRST   MF=L,PROGRAM='KOP',OUTPUT=A(OUTPUT)
CSTPL    CMDCST   MF=L,INOUT=A(OUTPUT),MESSAGE=A(0)
*                                      given at execution
*---------------------------------------------------------------------* 
*        Used constants, variables and buffers
*---------------------------------------------------------------------* 
RC       DS       X                     return code byte 
USF#NAME DC       'SDF.KOP.SYNTAX'      syntax file name 
USF#L    EQU      *-USF#NAME            user syntax file length
COPYFILE DC       'COPYFI  '            //COPY-FILE internal name
QUESTION DC       '????'
THREE    DC       H'3'
FOUR     DC       H'4'
EIGHT    DC       H'8'
CONVCHAR DC       C'0123456789ABCDEF'
XF0      EQU      X'F0'
*        Message for CORSTMT
MESSAGE  DS       0F
         DC       Y(MSGEND-MESSAGE)
         DS       XL2
         DC       C'BITTE PASSWORT FUER EINGABEDATEI ANGEBEN'
MSGEND   EQU      *
*---------------------------------------------------------------------* 
*        Output fields for statement operands
*---------------------------------------------------------------------* 
MESS1    DS       0F
         DC       Y(END1-MESS1)
         DS       CL2
         DC       X'40'
         DC       C'FROM-FILE = '
FRFILE   DS       CL52' '               own from-file
END1     EQU      *
MESS2    DS       0F
         DC       Y(END2-MESS2)
         DS       CL2
         DC       X'40'
         DC       C'TO-FILE   = '
TOFILE   DS       CL52' '               own to-file
END2     EQU      *
MESS3    DS       0F
         DC       Y(END3-MESS3)
         DS       CL2
         DC       X'40'
         DC       C'PASSWORD  = '
PASSWR   DS       CL4                   own password
END3     EQU      *
MESS4    DS       0F
         DC       Y(END4-MESS4)
         DS       CL2
         DC       X'40'
         DC       C'ACCESS-METHOD IS SAME'
END4     EQU      *
MESS5    DS       0F
         DC       Y(END5-MESS5)
         DS       CL2
         DC       X'40'
         DC       C'ACCESS-METHOD = '
ACCESS   DS       X                     own access-method: Sam | Isam
END5     EQU      *
MESS6    DS       0F
         DC       Y(END6-MESS6)
         DS       CL2
         DC       X'40'
         DC       C'KEY-LENGTH = '
KEYCHAR  DS       CL4' '                key-length converted into hexa
END6     EQU      *
MESS7    DS       0F
         DC       Y(END7-MESS7)
         DS       CL2
         DC       X'40'
         DC       C'REC-SIZE   = '
RECCHAR  DS       CL4' '                rec-size   converted into hexa
END7     EQU      *
MESS8    DS       0F
         DC       Y(END8-MESS8)
         DS       CL2
         DC       X'40'
         DC       C'KEY-LENGTH IS STD'
END8     EQU      *
MESS9    DS       0F
         DC       Y(END9-MESS9)
         DS       CL2
         DC       X'40'
         DC       C'REC-SIZE IS SAME' 
END9     EQU      *
MESS10   DS       0F
         DC       Y(END10-MESS10)
         DS       CL2
         DC       X'40'
         DC       C'REC-SIZE IS VARIABLE'
END10    EQU      *
MESS11   DS       0F
         DC       Y(END11-MESS11)
         DS       CL2
         DC       X'40'
         DC       C'PASSWORD IS NONE'
END11    EQU      *
KEYHW    DC       H'0'
         ORG      KEYHW
FIL1     DS       X
KEYLEN   DS       AL1                   own key-length 
BUFF5    DS       CL5                   buffer for unpack
RECSIZ   DS       H                     own record-size
OWNFLAGS DS       X                     own flags
ACCSAME  EQU      X'80'                 access-method=same
KEYSTD   EQU      X'40'                 key-length=std
RECSAME  EQU      X'20'                 record-size=same
RECVAR   EQU      X'10'                            =variable
NOPASS   EQU      X'08'                 no password.
*---------------------------------------------------------------------* 
STA#OUT  DS       0F                    CMDSTA output
         ORG      *+XMDMEML             length from CMDMEM
OUTPUT   CMDTA    MF=L,MAXLEN=400       CMDRST output
*---------------------------------------------------------------------* 
         END      KOP 

Das gezeigte Quellprogramm KOP steht in der Datei KOP.SRC. Im Folgenden wird es übersetzt, gebunden und getestet.Programm übersetzen, binden und testen

/set-logon-parameters sdfusr,... ————————————————————————————————————
/start-assembh
%  BLS0500 PROGRAM 'ASSEMBH', VERSION '1.2B00' OF '1998-04-24' LOADED
%  BLS0552 COPYRIGHT (C) FUJITSU SIEMENS COMPUTERS GMBH 1990. ALL RIGHTS
RESERVED
%  ASS6010 V01.2B02 OF BS2000 ASSTRAN  READY

(1)

%//compile source=*lib-elem(lib=kop.lib,elem=kop.src),-
%//mod-lib=kop.lib(el=kop),listing=*parameters-
%//(source-print=*with-object-code(print-statements=*accept),-
%//macro-print=*std,min-mes-w=*note,cross-ref=*std,layout=*std,-
%//output=*syslst),macro-lib=($.syslib.sdf.041,$loader.v140.syslib)



(2)

%  ASS6011 ASSEMBLY TIME: 4223 MSEC
%  ASS6018 0 FLAGS, 0 PRIVILEGED FLAGS, 0 MNOTES
%  ASS6019 HIGHEST ERROR-WEIGHT: NO ERRORS
%  ASS6006 LISTING GENERATOR TIME: 3166 MSEC
%//end
%  ASS6012 END OF ASSTRAN
/start-binder
%  BND0500 BINDER VERSION 'V02.1A30' STARTED
%//start-llm-creation internal-name=kop —————————————————————————————
%//include-module *lib(lib=kop.lib,elem=kop,type=r) —————————————————
%//resolve-by-autolink $.syslib.sdf.045
%//resolve-by-autolink $loader.sysoml.bs2000-ga.14.0a

                                                                         









(3)
(4)




(1)

Unter der Benutzerkennung SDFUSR wird eine Task gestartet.

(2)

Das Programm muss mit ASSEMBH übersetzt werden, da es die neuen Makros CMDTA, CMDCST und CMDRST enthält. Das oben auszugsweise gezeigte Quellprogramm steht als Typ-S-Element mit dem Namen KOP.SRC in der Bibliothek KOP.LIB. Die SDF-Makros stehen in der Makrobibliothek $.SYSLIB.SDF.045. Das erzeugte Bindemodul soll unter dem Elementnamen KOP in der Bibliothek KOP.LIB abgelegt werden.

(3)

Der Binder BINDER soll ein Bindelademodul (LLM) mit dem internen Namen KOP erzeugen.

(4)

Der Binder soll das in Arbeitsschritt 2 erzeugte Bindemodul KOP einlesen und in das LLM einfügen.

%//save-llm lib=kop.lib,elem=kop ——————————————————————————————————————  (5)
%  BND1501 LLM FORMAT: '1'
%//end
%  BND1101 BINDER NORMALLY TERMINATED. SEVERITY CLASS: 'OK'
/mod-sdf-options synt-file=*add(sdf.kop.syntax) ———————————————————————  (6)
/start-exe *lib-elem(lib=kop.lib,elem=kop) ————————————————————————————  (7)
%  BLS0524 LLM 'KOP', VERSION ' ' OF '2001-10-10 14:00:22' LOADED
%  BLS0551 COPYRIGHT (C) FUJITSU SIEMENS COMPUTERS GMBH 2001. ALL RIGHTS
RESERVED

%//mod-sdf-opt guid=*n ————————————————————————————————————————————————  (8)
%STMT:cop-f testdat.sv,pass=*secr —————————————————————————————————————  (9)
%ENTER SECRET OPERAND (PASSWORD):......

%  CMD0051 INVALID OPERAND 'TO-FILE'
%  CMD0099 MANDATORY OPERAND INVALID OR MISSING
%ENTER OPERANDS:

to-f=testdat.cop.1(isam,50)

%STMT:cop-f testdat.if,testdat.cop.2(acc-m=?) ————————————————————————— (10)
% CMD0090 EXPLANATION OF THE OPERAND ' TO-FILE=TESTDAT.COP.2:ACCESS-METHOD ':

%SAME or ISAM() or SAM -DEFAULT-: SAME

%ENTER OPERANDS:

%TESTDAT.SV,TESTDAT.COP.2(ACC-M=?)

acc-m=sam

%  CMD0051 INVALID OPERAND 'PASSWORD'
% BITTE PASSWORT FUER EINGABEDATEI ANGEBEN

%ENTER SECRET OPERAND (PASSWORD):......

                                                                                       

(5)

Das ablauffähige Bindelademodul soll unter dem Namen KOP (als Typ-L-Element) in der Bibliothek KOP.LIB abgelegt werden.

(6)

Die Benutzersyntaxdatei SDF.KOP.SYNTAX, in der die Anweisungen für das Programm KOP definiert sind, wird aktiviert.

(7)

Das Programm KOP wird gestartet. Das hier verwendete Kommando START-EXECUTABLE-PROGRAM steht ab BLSSERV V2.3 zur Verfügung (ggf. ist das Kommando START-PROGRAM mit RUN-MODE=*ADVANCED zu verwenden).

(8)

Die Benutzerführung wird auf den Modus NO eingestellt.

(9)

Fall 1: Die Anweisung COPY-FILE wird ohne den Pflichtoperanden TO-FILE eingegeben. Die Kennworteingabe soll dunkelgesteuert erfolgen. SDF fordert das Kennwort und den fehlenden Operanden an.

(10)

Fall 2: Die Anweisung COPY-FILE wird ohne das erforderliche Kennwort eingegeben. Über den Operanden ACCESS-METHOD werden weitere Informationen angefordert. SDF liefert die Informationen und fordert zur Eingabe des Kennworts auf.

%STMT:cop-f testdat.iv,testdat.cop.3(?) ——————————————————————————————— (11)

(11)

Fall 3: Die Anweisung COPY-FILE wird ohne das erforderliche Kennwort eingegeben. Durch das Fragezeichen wird über die Struktur, die der Dateiname der Ausgabedatei einleitet, weitere Information angefordert. Dies bewirkt den Übergang in den temporär geführten Dialog. SDF liefert im Operandenfragebogen die gewünschten Informationen und fordert danach das benötigte Kennwort an.

%STMT:? ——————————————————————————————————————————————————————————————— (12)

** NORMALES PROGRAMMENDE **

%CMD:exit-job

(12)

Mit dem Fragezeichen wird in den temporär geführten Dialog gewechselt. SDF gibt ein Menü aus, in dem die verfügbaren Anweisungen aufgelistet sind. Dazu gehören auch die Standardanweisungen. Die Anweisung STEP ist im Dialogbetrieb nicht verfügbar. Durch Eingabe der Nummer 2 wird die Anweisung END ausgewählt und das Programm beendet.