This example uses the interfaces IEDTGTM, IEDTPARL and IEDTEXE to read marked file names from the current work file and import the associated files in sequence into free work areas.
TITLE 'BEISPIEL6'
********************************************************************
* *
* Example 6 *
* *
* This example implements a user routine which makes it *
* possible to read in multiple files which have been marked *
* in a list of file names. *
* It uses the iedtgtm interface to read all the marked records *
* from the current work area. *
* It is expected that the records contain file names which, for *
* example, were created with SHOW F=* TO 1. *
* *
* The example program performs the following actions: *
* *
* 1) Execute a loop in which all the marked records in the *
* work file are read. *
* 2) For each marked file, iedtparl is called to search for *
* a free work file. *
* 3) If a free work file is available, the file is read in using *
* @COPY FILE= (via iedtexe) *
* *
********************************************************************
*
CMULTI CSECT
CMULTI AMODE ANY
CMULTI RMODE ANY
GPARMOD 31
*
STM R14,R12,12(R13) * SAVE REGISTERS
LR R10,R15 * ENTER VALUES IN BASE REGISTER
USING CMULTI,R10
*
* ENTER VALUES IN PL USING THE SUPPLIED GLCB
*
L R11,0(,R1) GLCB FROM EDT
ST R11,EXEPL -> TO THE EXE PL
ST R11,PARLPL -> TO THE PARL PL
ST R11,GTMPL -> TO THE GTM PL
USING EDTGLCB,R11
*
* SUPPLY SAVE AREA FOR UP CALLS
*
LR R7,R13 SAVE R13
LA R13,SAVEAREA
*
* SUPPLY AMCB FOR GTM
*
MVC EAMFILE,EGLFILE CURRENT WORK FILE FROM GLCB
MVC EAMDISP,=A(1) READ RECORD BY KEY
MVC EAMLKEY1,=Y(8) ENTER VALUES IN LENGTH FIELDS
MVC EAMPKEY,=Y(8)
MVC EAMPREC,=Y(54)
*
* SUPPLY AMCB FOR PARL
*
MVC PAMFILE(3),=C'L00' WORK FILE FOR PARL
MVC PAMLKEY1,=Y(8) ENTER VALUES IN LENGTH FIELDS
MVC PAMPKEY,=Y(8)
MVC PAMPREC,=Y(EPLPARLL)
*
* LOOP THROUGH ALL MARKED RECORDS
*
LA R3,0(0,0) COUNTER FOR WORK FILES
LOOP DS 0Y
LA R1,GTMPL ADDRESS OF EDT STATEMENT
L R15,=V(IEDTGTM) GTM ROUTINE
BALR R14,R15
CLC EGLMRET,=Y(EAMRETOK) GTM OK ?
LA R1,ERRGTM ERROR MESSAGE
BNE LOOPERR ERROR OUTPUT
CLI EGLSR1,EAMOK12 LAST MARKED RECORD?
BE LOOPEX NORMAL OUTPUT
*
* SEARCH FOR FREE WORK FILE
*
LOOPI DS 0Y
LA R4,ARBDATNR PRINTABLE NUMBERS
LA R4,0(R3,R4) ADD COUNTERS
MVC PAMFILE+1(2),0(R4) TRANSFER NUM TO AMCB
LA R1,PARLPL FOR PARL CALL
L R15,=V(IEDTGET) GET ROUTINE (PARL)
BALR R14,R15
CLC EGLMRET,=Y(EAMRETOK) PARL OK?
LA R1,ERRPARL
BNE LOOPERR ERROR OUTPUT
CLI EPLEMPTY,'1' WORK FILE EMPTY?
BE LOOPIEX EXIT LOOP
LA R3,2(,R3) NEXT WORK FILE IN 2ND STEP BECAUSE
* 2-DIGIT IN WORK FILE NO.
CH R3,=Y(44) LAST WORK FILE REACHED?
BH LOOPEX NORMAL OUTPUT
B LOOPI TRY NEXT
*
LOOPIEX DS 0Y
MVC ADAT,PAMFILE+1 WORK FILE IN SETF STATEMENT
MVI FILE,' ' PRELIMINARY DELETE OF FILE NAME
MVC FILE+1(53),FILE
LH R15,EAMLREC LENGTH OF READ RECORD
BCTR R15,0 MINUS 1 FOR EX
EX R15,EXMVCFIL FILE NAME IN @COPY STATEMENT
LA R1,EXEPL FOR EXE CALL
L R15,=V(IEDTEXE)
BALR R14,R15
CLC EGLMRET,=Y(EUPRETOK) EXE OK?
LA R1,ERREXE
BNE LOOPERR ERROR OUTPUT
MVC KEY1(8),KEY NEW BASIS IS READ RECORD --- (1)
B LOOP
*
LOOPEX DS 0Y
MVC EGLMRET,=Y(EUPRETOK) RC OK
MVI EGLSR1,EUPOK00
LR R13,R7 RESTORE R13
LM R14,R12,12(R13)
BR R14 RETURN TO EDT
*
LOOPERR DS 0Y --------------------- (2)
MVC EGLMRET,=Y(EUPRTERR) ERROR IN USER PROGRAM
MVI EGLSR1,EUPOK00
MVC EGLRMSG(ERRMSGL+2),0(R1)
LR R13,R7 RESTORE R13
LM R14,R12,12(R13)
BR R14
**********************************************************************
* INITIALIZATION ROUTINE *
**********************************************************************
ENTRY CMULTI@I
CMULTI@I DS 0D -------------------------------- (3)
STM R14,R12,12(R13)
USING CMULTI@I,R15
L R11,0(,R1) ADDRESS OF GLCB
USING EDTGLCB,R11
MVC EGLCCSN,=C'EDF041 '
LM R14,R12,12(R13)
BR R14
DROP R11,R15
EJECT
**********************************************************************
* *
* CONSTANTS *
* *
**********************************************************************
*
* REGISTER DEFINITIONS
*
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
EJECT
**********************************************************************
* *
* FIELDS *
* *
**********************************************************************
SAVEAREA DS 18F SAVE AREA
*
EXMVCFIL MVC FILE(0),REC FILE NAME IN COPY STATEMENT
*
REC DS CL54 AREA FOR FILE NAMES
*
ERRGTM DC Y(ERRMSGL)
DC 'FEHLER BEI IEDTGTM '
ERRMSGL EQU *-ERRGTM-2
ERRPARL DC Y(ERRMSGL)
DC 'FEHLER BEI IEDTPARL '
ERREXE DC Y(ERRMSGL)
DC 'FEHLER BEI IEDTEXE '
*
CMD1 DC Y(CMD1END-CMD1) EDT STATEMENT: COPY
DS CL2
DC C'@SETF('
ADAT DC C'00'
DC ');@COPY FILE='
FILE DC CL54' '
CMD1END EQU *
*
ARBDATNR DC C'00010203040506070809101213141516171819202122'
*
* PARAMETER LIST FOR THE EDT EXE INTERFACE
*
EXEPL DC A(0) EDTGLCB ADDRESS
DC A(CMD1) ADDRESS OF STATEMENT
*
* PARAMETER LIST FOR THE EDT GTM INTERFACE
*
GTMPL DC A(0) EDTGLCB ADDRESS
DC A(EDTAMCB) EDTAMCB ADDRESS
DC A(KEY1) KEY1 (IN) ADDRESS
DC A(KEY) KEY (OUT) ADDRESS
DC A(REC) ADDRESS OF READ RECORD
*
* PARAMETER LIST FOR THE EDT PARL INTERFACE
*
PARLPL DC A(0) EDTGLCB ADDRESS
DC A(PEDTAMCB) EDTAMCB ADDRESS
DC A(KEY1) KEY1 (IN) ADDRESS
DC A(KEY) KEY (OUT) ADDRESS
DC A(EDTPARL) ADDRESS OF INFO OUTPUT
*
KEY1 DC 2A(0) KEY FOR GTM
KEY DC 2A(0) KEY (RETURN VALUE)
*
* EDT-SPECIFIC INTERFACE MACROS IN V17.0A
*
IEDTAMCB C,VERSION=2
*
IEDTAMCB C,P,VERSION=2
*
IEDTPARL C,VERSION=4
*
IEDTGLCB D,VERSION=2
CMULTI CSECT
END
Explanations
| (1) | EDTGTM reads starting from the specified key in the direction specified by EAMDISP (here forwards). As a result, the new key must become the new starting point. |
| (2) | For reasons of clarity, there is only a brief indication of the error handling mechanisms. However, at the very least, the original return code provided by the interface should be prepared and output. |
| (3) | Specifying the initialization routine also causes CMULTI to be called with the V17 GLCB. |
If the procedure explained in “Producing user routines in Assembler” is stored in a file named ASSMOD.DO in BS2000 and the source file
is stored as the S element ANWEND2.ASS in the library EDT.BEISPIELE then the above program can be compiled and linked with
/CALL-PROC ASSMOD.DO,(2)
The generated program can then be loaded from EDT with
@USE COMMAND='*',ELEMENT=CMULTI,MODLIB=EDT.BEISPIELE
The procedure ASSMOD.DO generates output resembling the following:
% BLS0523 ELEMENT 'ASSEMBH', VERSION '012', TYPE 'C' FROM LIBRARY ':MARS: $TSOS.SYSPRG.ASSEMBH.012' IN PROCESS % BLS0500 PROGRAM 'ASSEMBH', VERSION '01.2C00' OF '2002-03-06' LOADED % BLS0552 COPYRIGHT (C) FUJITSU SIEMENS COMPUTERS GMBH 2002. ALL RIGHTS RESERVED % ASS6010 V01.2C00 OF BS2000 ASSEMBH READY % ASS6011 ASSEMBLY TIME: 480 MSEC % ASS6018 0 FLAGS, 0 PRIVILEGED FLAGS, 0 MNOTES % ASS6019 HIGHEST ERROR-WEIGHT: NO ERRORS % ASS6006 LISTING GENERATOR TIME: 12 MSEC % ASS6012 END OF ASSEMBH
The operation of the routine will be demonstrated in L mode, i.e. EDT must already be loaded and be waiting for input in L mode:
1. @SHOW F=* TO 1 ----------- (1) 550. @O&F'BEISPIEL' ----------- (2) 550. @USE COM='*',E=CMULTI,M=EDT.BEISPIELE ----------- (3) 550. *CMULTI ----------- (4) % EDT5999 FEHLER BEI IEDTEXE ----------- (5) 1. @PROC 22 1. @STA=PAR TO 1 ----------- (6) 254. @ON & P '$ =' 7.0000 % = 1.0000 $ = 549.0000 * = 550.0000 ? = 22.0000 18.0000 % = 1.0000 $ = 309.0000 * = 310.0000 ? = 0.0000 29.0000 % = 1.0000 $ = 187.0000 * = 188.0000 ? = 0.0000 40.0000 % = 1.0000 $ = 179.0000 * = 180.0000 ? = 0.0000 51.0000 % = 1.0000 $ = 235.0000 * = 236.0000 ? = 0.0000 62.0000 % = 1.0000 $ = 1.0000 * = 1.0000 ? = 0.0000 ....
Explanations
| (1) | The file list is constructed in the work file. Here, for example, the list has 549 entries. |
| (2) | All files which have the name component BEISPIEL are searched for and marked. |
| (3) | The user routine CMULTI is loaded from the library EDT.BEISPIELE and is used to process user statements which start with '*' . |
| (4) | The user routine is called. Since it does not evaluate the input string, it could be called with any other statement, e.g. *XXX. |
| (5) | The message comes from the user routine since IEDTEXE has supplied a return code. The library EDT.BEISPIELE is also found. This cannot be read using @COPY. |
| (6) | @STA=PAR provides a view of file occupancy and makes it clear that files have been read into work files 1 to 4. |