Dieses Beispiel benutzt die Schnittstellen IEDTGTM
, IEDTPARL
und IEDTEXE
, um aus der aktuellen Arbeitsdatei markierte Dateinamen zu lesen und die dazugehörigen Dateien nacheinander in freie Arbeitsbereiche einzulesen.
TITLE 'BEISPIEL6' ******************************************************************** * * * Beispiel 6 * * * * Dieses Beispiel realisiert eine Anwenderroutine, die das Ein- * * lesen mehrerer Dateien erlaubt, die in einer Dateinamensliste * * markiert wurden. * * Es verwendet die iedtgtm-Schnittstelle, um alle markierten Sätze * * aus dem aktuellen Arbeitsbereich zu lesen. * * Es wird erwartet, dass die Sätze Dateinamen enthalten, die z.B. * * mit SHOW F=* TO 1 erstellt wurden. * * * * Das Beispielprogramm fuehrt folgende Aktionen durch: * * * * 1) In Schleife werden alle markierten Sätze der aktuellen * * Arbeitsdatei gelesen. * * 2) Für jede markierte Datei wird über einen Aufruf von iedtparl * * eine freie Arbeitsdatei gesucht. * * 3) Falls es noch eine freie Arbeitsdatei gibt, wird die Datei * * mittels @COPY FILE= (via iedtexe) eingelesen * * * ******************************************************************** * CMULTI CSECT CMULTI AMODE ANY CMULTI RMODE ANY GPARMOD 31 * STM R14,R12,12(R13) * REGISTER SICHERN LR R10,R15 * BASISREGISTER VERSORGEN USING CMULTI,R10 * * VERSORGE PL MIT DEM MITGELIEFERTEN GLCB * L R11,0(,R1) GLCB VON EDT ST R11,EXEPL -> IN DIE EXE PL ST R11,PARLPL -> IN DIE PARL PL ST R11,GTMPL -> IN DIE GTM PL USING EDTGLCB,R11 *
* SAVEAREA FUER UP-AUFRUFE VERSORGEN * LR R7,R13 SICHERE R13 LA R13,SAVEAREA * * AMCB FUER GTM VERSORGEN * MVC EAMFILE,EGLFILE AKTUELLE ARBEITSDATEI AUS GLCB MVC EAMDISP,=A(1) LESE SATZ NACH SCHLUESSEL MVC EAMLKEY1,=Y(8) LAENGENFELDER VERSORGEN MVC EAMPKEY,=Y(8) MVC EAMPREC,=Y(54) * * AMCB FUER PARL VERSORGEN * MVC PAMFILE(3),=C'L00' ARBEITSDATEI FUER PARL MVC PAMLKEY1,=Y(8) LAENGENFELDER VERSORGEN MVC PAMPKEY,=Y(8) MVC PAMPREC,=Y(EPLPARLL) * * SCHLEIFE UEBER ALLE MARKIERTEN SAETZE * LA R3,0(0,0) ZAEHLER FUER ARBEITSDATEIEN LOOP DS 0Y LA R1,GTMPL ADRESSE EDT-ANWEISUNG L R15,=V(IEDTGTM) GTM ROUTINE BALR R14,R15 CLC EGLMRET,=Y(EAMRETOK) GTM OK ? LA R1,ERRGTM FEHLERMELDUNG BNE LOOPERR FEHLERAUSGANG CLI EGLSR1,EAMOK12 LETZTER MARKIERTER SATZ? BE LOOPEX NORMALER AUSGANG * * SUCHE FREIE ARBEITSDATEI * LOOPI DS 0Y LA R4,ARBDATNR ABDRUCKBARE NUMMERN LA R4,0(R3,R4) ADDIERE ZAEHLER MVC PAMFILE+1(2),0(R4) NR IN DEN AMCB UEBERTRAGEN LA R1,PARLPL FUER PARL AUFRUF L R15,=V(IEDTGET) GET ROUTINE (PARL) BALR R14,R15 CLC EGLMRET,=Y(EAMRETOK) PARL OK? LA R1,ERRPARL BNE LOOPERR FEHLERAUSGANG CLI EPLEMPTY,'1' ARBEITSDATEI LEER? BE LOOPIEX SCHLEIFE VERLASSEN
LA R3,2(,R3) NAECHSTE ARBEITSDATEI IN 2ER SCHR. * DA 2STELLIG IN ARBDATNR CH R3,=Y(44) LETZTE ARBEITSDATEI ERREICHT? BH LOOPEX NORMALER AUSGANG B LOOPI NAECHSTE VERSUCHEN * LOOPIEX DS 0Y MVC ADAT,PAMFILE+1 ARBEITSDATEI IN SETF-ANWEISUNG MVI FILE,' ' DATEINAMEN VORLOESCHEN MVC FILE+1(53),FILE LH R15,EAMLREC LAENGE DES GELESENEN SATZES BCTR R15,0 MINUS 1 FUER EX EX R15,EXMVCFIL DATEINAME IN @COPY-ANWEISUNG LA R1,EXEPL FUER EXE AUFRUF L R15,=V(IEDTEXE) BALR R14,R15 CLC EGLMRET,=Y(EUPRETOK) EXE OK? LA R1,ERREXE BNE LOOPERR FEHLERAUSGANG MVC KEY1(8),KEY NEUE BASIS IST DER GELESENE SATZ --- (1) B LOOP * LOOPEX DS 0Y MVC EGLMRET,=Y(EUPRETOK) RC OK MVI EGLSR1,EUPOK00 LR R13,R7 R13 WIEDERHERSTELLEN LM R14,R12,12(R13) BR R14 ZURÜCK ZUM EDT * LOOPERR DS 0Y --------------------- (2) MVC EGLMRET,=Y(EUPRTERR) FEHLER IM BENUTZERPROGRAMM MVI EGLSR1,EUPOK00 MVC EGLRMSG(ERRMSGL+2),0(R1) LR R13,R7 R13 WIEDERHERSTELLEN LM R14,R12,12(R13) BR R14 ********************************************************************** * INITIALISIERUNGS-ROUTINE * ********************************************************************** ENTRY CMULTI@I CMULTI@I DS 0D -------------------------------- (3) STM R14,R12,12(R13) USING CMULTI@I,R15 L R11,0(,R1) ADRESSE DES GLCB USING EDTGLCB,R11 MVC EGLCCSN,=C'EDF041 ' LM R14,R12,12(R13) BR R14
DROP R11,R15 EJECT ********************************************************************** * * * KONSTANTEN * * * ********************************************************************** * * REGISTERDEFINITIONEN * 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 ********************************************************************** * * * FELDER * * * ********************************************************************** SAVEAREA DS 18F SAVEAEREA * EXMVCFIL MVC FILE(0),REC DATEINAME IN COPY-ANWEISUNG * REC DS CL54 BEREICH FUER DATEINAMEN * 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-ANWEISUNG: COPY DS CL2 DC C'@SETF(' ADAT DC C'00' DC ');@COPY FILE=' FILE DC CL54' ' CMD1END EQU * * ARBDATNR DC C'00010203040506070809101213141516171819202122' * * PARAMETERLISTE DER EDT-EXE-SCHNITTSTELLE * EXEPL DC A(0) ADRESSE EDTGLCB DC A(CMD1) ADRESSE DER ANWEISUNG * * PARAMETERLISTE DER EDT-GTM-SCHNITTSTELLE * GTMPL DC A(0) ADRESSE EDTGLCB DC A(EDTAMCB) ADRESSE EDTAMCB DC A(KEY1) ADRESSE KEY1 (IN) DC A(KEY) ADRESSE KEY (OUT) DC A(REC) ADRESSE DES GELESENEN SATZES * * PARAMETERLISTE DER EDT-PARL-SCHNITTSTELLE * PARLPL DC A(0) ADRESSE EDTGLCB DC A(PEDTAMCB) ADRESSE EDTAMCB DC A(KEY1) ADRESSE KEY1 (IN) DC A(KEY) ADRESSE KEY (OUT) DC A(EDTPARL) ADRESSE DER AUSGABE INFO * KEY1 DC 2A(0) SCHLUESSEL FUER GTM KEY DC 2A(0) SCHLUESSEL (RUECKGABEWERT) * * EDT-SPEZIFISCHE SCHNITTSTELLEN-MAKROS DER V17.0A * IEDTAMCB C,VERSION=2 * IEDTAMCB C,P,VERSION=2 * IEDTPARL C,VERSION=4 * IEDTGLCB D,VERSION=2 CMULTI CSECT END
Erläuterungen
(1) | EDTGTM liest ausgehend vom angegebenen Schlüssel in der durch EAMDISP bestimmten Richtung (hier vorwärts). Daher muss der gelesene Schlüssel zum neuen Ausgangspunkt gemacht werden. |
(2) | Die Fehlerbehandlung ist aus Gründen der Übersichtlichkeit nur angedeutet. Man sollte zumindest den Original-Returncode, der von der Schnittstelle geliefert wurde, aufbereiten und ausgeben. |
(3) | Durch Angabe der Initialisierungsroutine wird gleichzeitig erreicht, dass CMULTI mit dem V17-GLCB gerufen wird. |
Wenn die in Abschnitt „Produktion von Anwenderroutinen in Assembler“ erklärte Prozedur im BS2000 in einer Datei namens ASSMOD.DO
und die Quelldatei als S-Element ANWEND2.ASS
in der Bibliothek EDT.BEISPIELE
abgelegt ist, kann das obige Programm mit
/CALL-PROC ASSMOD.DO,(2)
übersetzt und gebunden werden. Das erzeugte Programm ist anschließend aus dem EDT heraus mit
@USE COMMAND='*',ELEMENT=CMULTI,MODLIB=EDT.BEISPIELE
ladbar. Die Prozedur ASSMOD.DO
erzeugt in etwa folgende Ausgaben:
% 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
Die Arbeitsweise der Routine sei im L-Modus demonstriert, d.h. es ist vorausgesetzt, dass der EDT schon geladen ist und auf eine Eingabe im L-Modus wartet:
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 ....
Erläuterungen
(1) | Die Dateiliste wird in der Arbeitsdatei aufgebaut. Die Liste umfasst hier z.B. 549 Einträge. |
(2) | Alle Dateien, die den Namensbestandteil BEISPIEL haben, werden gesucht und markiert. |
(3) | Die Anwenderroutine CMULTI wird aus der Bibliothek EDT.BEISPIELE geladen und soll Benutzeranweisungen bearbeiten, die mit '*' beginnen |
(4) | Die Anwenderroutine wird aufgerufen. Da sie den Eingabestring nicht auswertet, könnte man sie auch mit einer beliebigen anderen Anweisung, z.B. *XXX aufrufen. |
(5) | Die Meldung stammt von der Anwenderroutine, da IEDTEXE einen Returncode gebracht hat. Es wird auch die Bibliothek EDT.BEISPIELE gefunden, die nicht mit @COPY eingelesen werden kann. |
(6) | Mit @STA=PAR verschafft man sich eine Übersicht über die Dateibelegung und sieht, dass offenbar in die Arbeitsdateien 1 bis 4 Dateien eingelesen wurden. |