17.  CFS-Benutzerexits
Unter CFS können externe Routinen aufgerufen werden als:
a) User Options zur Auswertung der Katalogeinträge nach speziellen Merkmalen.
b) Variable Actions zur Realisierung besonderer Verarbeitungsarten für Dateien /Bibliothekselemente/Jobvariablen.
c) Action-Codes zur Realisierung besonderer Verarbeitungsarten für Dateien/ Bibliothekselemente/Jobvariablen über eigene Action-Codes.
d) Kommandos zur Realisierung besonderer Verarbeitungsarten für Dateien/ Bibliothekselemente/Jobvariablen.
Der CFS-Anwender kann eine externe User Option bzw. Kommandoroutine in folgender Form aufrufen:
(modul [, bibl]) [ params]
Der Aufruf einer externen Routine für eine Variable Action erfolgt in der Form:
ONX(modul [, bibl]) [ params] | ON&(modul [, bibl]) [ params]
modul Name der aufzurufenden Routine (Modul-/CSECT-Name).
bibl Bibliothek, aus der die Benutzerroutine nachzuladen ist.
Standard: CFSLIB
params wahlweise Parameter, die der Benutzerroutine beim Aufruf mitgegeben werden und die deren Ausführung steuern.
Der Aufruf einer externen Action-Code Routine geschieht durch Angabe des betreffenden Action-Codes in der Action-Spalte.
Damit CFS diesen Action-Code richtig verarbeitet, muß er vom Systemverwalter in eine CFS-interne Action-Code Tabelle eingetragen werden. Genaueres hierzu finden Sie im Quellprogramm CFSMAIN in der CFS.S.LMSLIB.
Aufrufkonventionen für externe Routinen:
R1 Adresse der Parameterliste
R13 Adresse einer 72 Byte langen Save-Area
R14 Returnadresse in CFS
R15 Ansprungadresse der Benutzerroutine
Die Registersicherstellung sollte nach den Standardkonventionen erfolgen:
STM 14,12,12(13) (Ansprung)
 ...
LM 14,12,12(13) (Rückkehr)
In der ausgelieferten LMS-Bibliothek CFS.S.LMSLIB befinden sich Quellprogramme als Beispiele zu den einzelnen Arten von externen Routinen:
a) FREE als Beispiel einer Routine zur Realisierung eine benutzereigenen User Option (Free Space).
b) CONV als Beispiel einer Routine für eine benutzereigene Variable Action.
c) PREMOTE als Beispiel einer Routine für einen benutzereigenen Action-Code (PD).
d) VSNSP als Beispiel einer Routine für ein benutzereigenes CFS-Kommando.
VSNSP gibt für die spezifizierte Datei (siehe unten) alle VSNs, auf denen die Datei Speicherplatz belegt hat, sowie für jede VSN die Anzahl der auf ihr belegten PAM-Seiten. Die Aufrufsyntax lautet: (VSNSP) datei.
Hinweise:
Die beim Aufruf der externen Routinen benutzten Eingabeparameterleisten sind in den oben erwähnten Beispielprogrammen intern dokumentiert.
Benutzerdefinierte Action-Codes müssen, um als solche erkannt zu werden, dem CFS-System bekannt gemacht werden. Hierzu existiert eine besondere Action-Code Tabelle. Die Struktur des Tabellenelements für den Action-Code PD ist im Quellprogramm CFSMAIN in der CFS.S.LMSLIB beschrieben.
Auch im Connection-Handler besteht die Möglichkeit einer eigenen Nachrichtenbehandlung. Für nähere Informationen hierzu kontaktieren Sie bitte die OPG Online-Programmierung.
CFS als Unterprogramm
CFS kann von beliebigen Benutzerprogrammen aufgerufen werden, ohne daß diese dabei entladen werden. Das Unterprogramm CFS kann direkt in die Benutzerprogramme eingebunden oder bei Bedarf durch einen Link-Makro nachgeladen werden. Zum Nachladen von CFS ist folgender Link-Makro abzusetzen:
LINK ENTRY=CFSMAIN,LIBNAM=$TSOS.CFSLIB,INHIBIT=YES
Beim Laden von CFSMAIN werden weitere Module per Autolink-Funktion nachgezogen. Daher bietet es sich an, gleich einen Großmodul über LINK-Makro zu laden, der die notwendigen Untermodule CFSUP und GDATE bereits enthält. Dieser Großmodul CFS2 kann durch /DO CFS. S.LMSLIB(CFSLNK2) erzeugt werden.
Der Modul CFSMAIN bzw. der Großmodul CFS2 muß auf Seitengrenze im unteren Adressraum geladen werden.
Der Modul CFSMAIN liegt in der Bibliothek CFS.S.LMSLIB im Sourcecode vor und kann zur Initialisierung von RZ- bzw. benutzerspezifischen Standardwerten angepaßt werden.
CFS aktiviert intern Stxit's für INTR-, ABEND-, K2- (ESCPBRK) und SVC-Ereignisse.
Das Hauptprogramm kann CFS Selektionsparameter, Kommandos, Action-Codes, sowie Daten zur Modifikation von Dateien mitgeben. Damit besteht die Möglichkeit, beim Aufruf von CFS durch ein übergeordnetes Hauptprogramm bereits eine Reihe von Aktionen ausführen zu lassen, z.B. Dateien / Elemente aus einer bestimmten Bibliothek selektieren, Eröffnen von Connections, Laden von P-Tasten, bestimmte CFS-Modi einstellen, bestimmte Dateien/Bibliothekselemente selektieren, Dateien in den EDT laden, Dateien im Display von CFS anzeigen usw.
Die verschiedenen Nutzungsmöglichkeiten von CFS als Unterprogramm werden am besten durch die Beschreibung der Aufrufparameterliste erläutert.
Aufrufkonventionen und Parameterliste: Hauptprogramm --> CFS
Registerbelegung
R1 Adresse der Parameterliste für CFSUP.
R13 Adresse einer 18 Worte langen Save-Area im aufrufenden Programm.
R14 Rückkehradresse in das Hauptprogramm.
R15 Einsprungadresse: Beginn des Moduls CFS2 bzw. CFSMAIN.
Parameterliste
P1   DC   A(RECTABLE) | A(0)
P2   DC   A(IND)
     DC   A(3) optional, nur bei IND = C'N' sinnvoll
P3   DC   A(CFSLIB) optional, nur bei IND = C'N' sinnvoll
P1   DC   A(RECTABLE)
Liste von Eingabesätzen im RDATA-Format.
CFS verhält sich wie in einer Dialogprozedur (siehe Seite 19-). Insbesondere wird die durch einen *002-Satz definierte Selektion ausgeführt.
RECTABLE Liste von Eingabesätzen im V-Format. RECTABLE hat die gleiche Funktion wie SYSDTA, nur daß die Datensätze im virtuellen Speicher und nicht in einer Datei übergeben werden. Das Ende von RECTABLE ist durch das Zeichen X'80' zu markieren. Nach Erreichen des Endes von RECTABLE, bzw. nach Lesen eines *DIA-Satzes (siehe Seite 19-) erwartet CFS alle weiteren Eingaben vom Bildschirm.
P1   DC   A(0)
CFS erhält vom aufrufenden Programm keine Eingaben.
Nach dem Ansprung durch das Benutzerprogramm kommt CFS am Bildschirm mit der Selektionsmaske wie nach einem normalen EXEC durch den Benutzer. Die Rückkehr in das Hauptprogramm kann erfolgen durch die Kommandos END / * / MAIN.
P2   DC   A(IND)
IND      DC   C'N'
New CFS beginnt mit einem neuen Verarbeitungsgang, d.h. es wird als erstes ein Satz zur Spezifizierung der Selektionsbedingungen erwartet (*001-, bzw. *002-Satz).
IND      DC   C'C'
Continue Fortsetzungsaufruf. CFS fährt an der Stelle fort, an welcher es beim letzten Aufruf aufgrund der Kommandos END / * / MAIN unterbrochen wurde.
P3   DC   A(CFSLIB)
CFSUID   DC   CL54'$userid.CFSLIB'
Name der eingesetzten CFSLIB.
Falls angegeben, wird aus dieser Angabe die Kennung, unter der CFS gespeichert ist ermittelt. Die Kennung wird anstelle der Standardkennung $TSOS. vor die Namen der internen CFS-Dateien CFSLIB, CFSHELP, CFSCOM, CFS.MESSAGE, CFSPROT, CFSTERM, CFS.PDFILE, CFS.INF.FORMAT und CFSUSER gesetzt.
Beispiel:
In der CFS.S.LMSLIB finden Sie unter dem Namen TEST ein einfaches Musterprogramm, in dem CFS mehrere Male als Unterprogramm aufgerufen wird. Das Programm kann mit /DO CFS.S.LMSLIB(ASSEMB),TEST übersetzt und mit /EXEC (TEST, CFSLIB) aufgerufen werden.
Im folgenden Beispiel ist eine Parameterleiste des Hauptprogramms für CFS dargestellt.
P1       DC    A(RECTABLE)
P2       DC    A(IND)
IND      DC    C'N'
RECTABLE DS    0A                                  
REC1     DC    AL2(REC1L,0)                        
         DC    C'*002 FILE=NO'                     
REC1L    EQU   *-REC1                              
REC2     DC    AL2(REC2L,0)                        
         DC    C'OC1/LOGON user-id,acct,C''passw'''
REC2L    EQU   *-REC2                              
REC3     DC    AL2(REC3L,0)                        
         DC    C'LOAD programm'                    
REC3L    EQU   *-REC3                              
REC4     DC    AL2(REC4L,0)                        
         DC    C'^'                                
REC4L    EQU   *-REC4                              
REC5     DC    AL2(REC5L,0)                        
         DC    C'PL plus-modul,maplib'             
REC5L    EQU   *-REC5                              
REC6     DC    AL2(REC6L,0)                        
         DC    C'EDT,datei'                        
REC6L    EQU   *-REC6                              
REC7     DC    AL2(REC7L,0)                        
         DC    C'@RET'                             
REC7L    EQU   *-REC7                              
REC8     DC    AL2(REC8L,0)                        
         DC    C'NP'                               
REC8L    EQU   *-REC8                              
         DC    X'80'                               
   |
   |
   [____ Es folgt kein weiterer Datensatz
Hinweis:
Bei Übergabe einer RECTABLE sollten vor dem Ansprung von CFS die Prozeßschalter 1 und 4 gesetzt werden ( SETSW ON=(1,4) ).