Loading...
Select Version
Die Zugriffsbedingungen im Guard TEST-GUA, das im Beispiel 1 erstellt und in den Beispielen 2 und 3 geändert wurde, sollen mit dem Makro SHWSAC gelesen, aufbereitet und nach SYSOUT ausgegeben werden.
Lösung
* ************************************************************** * * ---------------------------------------------------------- * * * * * * Makro SHWSAC: Zugriffsbedingungen anzeigen * * * ========================================== * * * * * * ---------------------------------------------------------- * * ************************************************************** * GUA4 CSECT * * ************************************************************** * * ---------------------------------------------------------- * * * Makro WRITE * * * =========== * * * Aufgabe: Ausgabe des Datensatzes WROBER nach WROUT und * * * den Bereich WROBER wieder mit Blanks * * * initialisieren. * * * ---------------------------------------------------------- * * ************************************************************** * MACRO WRITE BAL R@BACK,OUTOUT MEND * * ************************************************************** * R@WEEK EQU 2 fuer Weekday-Bearbeitung R@PRGNAM EQU 2 fuer Program-Bearbeitung R@USED EQU 2 fuer Vergleich bereich mit R@OUT R@I EQU 3 Schleifenzaehler R@CON EQU 4 Basisregister fuer Condition R@OUT EQU 5 Basisregister fuer Ausgabebereich R@BASE EQU 10 Basisregister R@GUA EQU 11 Subjekt-Zaehler R@BACK EQU 14 Ruecksprungadresse * BALR R@BASE,0 USING *,R@BASE * * ************************************************************** * * Initialisierung * * ************************************************************** MVC WROGNAM(WROTEXL),SPACES Ausgabebereich loeschen MVC PARSACC(PROW#),PARSACL Parameterinitialisierung SHWSAC MF=M, - GUARD='TEST-GUA', - SUBTYPE=*ALL, - INFORM=*ADM, - OUTAREA=(OUTBER,OUTBERLG) * * ************************************************************** * * Zugriffsbedingungen ermitteln, bis keine weiteren Guards * * * mehr angezeigt werden. In diesem Beispiel wird jedoch * * * nur das eine Guard TEST-GUA angefordert. * * ************************************************************** MORE1 EQU * SHWSAC MF=E,PARAM=PARSACC CLC PROWMRET,=Y(PROPSUCC) BNE RCNOTOK * * ************************************************************** * * Ausgabebereich abarbeiten * * ************************************************************** L R@OUT,PROWOADR Laden SHWSAC-Ausgabebereiches USING PROWOPUT,R@OUT * LA R@OUT,PROWOSGC Positionieren auf (erstes) Guard USING PROWGCON,R@OUT * ONEGUARD EQU * MVC WROGNAM,PROWGCNA Guardname -> WROUT-Bereich LA R@OUT,PROWGCSA Positionieren auf 1. Subjekttyp USING PROWACOS,R@OUT * * ************************************************************** * * Schleife ueber Subjekttyp *USER, *GROUP, *OTHERS, *ALLUSER * * ************************************************************** SR R@GUA,R@GUA LH R@GUA,PROWAAUN *USER AH R@GUA,PROWAAGN *GROUP AH R@GUA,PROWAAON *OTHERS AH R@GUA,PROWAAAN *ALLUSER * LA R@OUT,PROWACS Positionieren auf erstes Subjekt USING PROWACON,R@OUT * * ************************************************************** * * Fuer jedes Subjekt die Zugriffsbedingungen aus dem * * * Ausgabebereich lesen * * * Loop-Beginn * * ************************************************************** MORE2 EQU * * * ************************************************************** * * Subjekt und Subjekttyp in den WROUT-Bereich schreiben * ************************************************************** CLI PROWAITY,PROZSUSR BNE SBJGRP MVC WROSTYP,=C'USER ' Type USER -> WROUT-Bereich MVC WROSNAM,PROWAINA Subject -> WROUT-Bereich B SBJEND SBJGRP CLI PROWAITY,PROZSGRP BNE SBJOTH MVC WROSTYP,=C'GROUP ' Type GROUP -> WROUT-Bereich MVC WROSNAM,PROWAINA Subject -> WROUT-Bereich B SBJEND SBJOTH CLI PROWAITY,PROZSOTH BNE SBJALL MVC WROSTYP,=C'OTHERS ' Type OTHERS -> WROUT-Bereich B SBJEND SBJALL MVC WROSTYP,=C'ALLUSERS' Type ALLUSER -> WROUT-Bereich SBJEND EQU * * * ************************************************************** * * Im Testguard sind fuer alle Subjekte spezielle * * * Zugriffsbedingungen mit ADMISSION=*PARAMS * * * (d.h. mit PROWAADM=PROZAPAR)spezifiziert * * * Der Fall ADMISSION=*YES/*NO * * * (d.h. mit PROWAADM=PROZAYES/PROZANO) wird nicht behandelt. * * ************************************************************** LA R@OUT,PROWSTCO Positionieren auf Time Condition * * ************************************************************** * * TIME Condition * * ************************************************************** USING PROWTCON,R@OUT CLI PROWTKD,PROZCNO Kind of Time EQ *ANY? BNE TIMCYCLA LA R@OUT,PROWT#IN Positionieren auf Interval B TIMEND TIMCYCLA EQU * CLI PROWTKD,PROZCEXC Kind of Time EXCEPT(TIME=?) BNE TIMCYCLB MVC WROINEX,=C'EX ' EX -> WROUT-Bereich TIMCYCLB EQU * MVC WROINEX,=C'IN ' IN -> WROUT-Bereich SR R@I,R@I IC R@I,PROWT#IN LA R@OUT,PROWTINS USING PROWTINT,R@OUT TIMCYCL EQU * MVC WROTIML,PROWTILB Time Lower Bound -> WROUT-Bereich MVC WROTIMU,PROWTIUB Time Upper Bound -> WROUT-Bereich LA R@OUT,PROWTIN#(R@OUT) * * * Time Condition nach WROUT schreiben WRITE * BCT R@I,TIMCYCL Naechstes Zeitinterval TIMEND EQU * * * ************************************************************** * * DATE Condition * * ************************************************************** USING PROWDCON,R@OUT CLI PROWDKD,PROZCNO Kind of Date EQ *ANY? BNE DATCYCLA LA R@OUT,PROWD#IN Positionieren auf Interval B DATEND DATCYCLA EQU * CLI PROWDKD,PROZCEXC Kind of Date EXCEPT(TIME=?) BNE DATCYCLB MVC WROINEX,=C'EX ' EX -> WROUT-Bereich DATCYCLB EQU * MVC WROINEX,=C'IN ' IN -> WROUT-Bereich SR R@I,R@I IC R@I,PROWD#IN LA R@OUT,PROWDINS USING PROWDINT,R@OUT DATCYCL EQU * MVC WRODATL,PROWDILB Date Lower Bound -> WROUT-Bereich MVC WRODATU,PROWDIUB Date Upper Bound -> WROUT-Bereich LA R@OUT,PROWDIN#(R@OUT) * * * Date Condition nach WROUT schreiben WRITE * BCT R@I,DATCYCL Naechstes Zeitinterval DATEND EQU * * * ************************************************************** * * WEEKDAY Condition * * ************************************************************** USING PROWWCON,R@OUT CLI PROWWKD,PROZCNO Kind of Weekday EQ *ANY? BNE WEKCYCLA LA R@OUT,PROWWDYS Positionieren auf Weekdays B WEKEND WEKCYCLA EQU * CLI PROWWKD,PROZCEXC Kind of Wekday EXCEPT(WEEKDAY=?) BNE WEKCYCLB MVC WROINEX,=C'EX ' EX -> WROUT-Bereich WEKCYCLB EQU * * * Alle Wochentage im Ausgabefeld vorbesetzen * In einer Schleife die vorbesetzen Wochentage mit Blank * ueberschreiben, wenn sie nicht in der Zugriffsbedingung * enthalten sind * MVC WROWEEK,=C'MO TU WE TH FR SA SU ' IC R@I,=X'08' ICM R@CON,B'1000',PROWWDYS LA R@WEEK,WROWEEK USING WEKDSEC,R@WEEK WEKCYCL EQU * BM WEKCYCLC MVC WEEKDAY,SPACES WEKCYCLC EQU * LA R@WEEK,WEEKDAY# SLL R@CON,1 LTR R@CON,R@CON BCT R@I,WEKCYCL LA R@OUT,PROWW#(R@OUT) * * * Weekday Condition nach WROUT schreiben WRITE * WEKEND EQU * * * ************************************************************** * * PRIVILEGE Condition * * * Die Behandlung der einzelnen Privilegien wird im Beispiel * * * nicht ausfuehrlich behandelt, sondern es wird gleich weiter* * * auf die Zugriffsbedingungen PROGRAM ppositioniert. * * ************************************************************** USING PROWPVCO,R@OUT CLI PROWPKD,PROZCNO Kind of Privilege EQ *ANY? BNE PRVCYCLA LA R@OUT,PROWPRV Positionieren auf Privilegien B PRVEND PRVCYCLA EQU * LA R@OUT,PROWP#(R@OUT) -> Zugriffsbedingung Typ PROGRAM PRVEND EQU * * * ************************************************************** * * PROGRAM Condition * * ************************************************************** USING PROWPCON,R@OUT CLI PROWPCKD,PROZCNO Kind of Program EQ *ANY? BNE PRGCYCLA LA R@OUT,PROWPCNP Positionieren auf Anzahl Programs * LA R@OUT,PROWPCPS Positionieren auf Programs B PRGEND PRGCYCLA EQU * SR R@I,R@I IC R@I,PROWPCNP Anzahl Programmnamen LA R@OUT,PROWPCPS Programmname USING PROWPRG,R@OUT PRGCYCL EQU * * * Im Beispiel wird nur der Fall FILENAME behandelt * Bibliotheksangaben werden nicht beruecksichtigt * SR R@PRGNAM,R@PRGNAM IC R@PRGNAM,PROWPAL# size of whole program name SH R@PRGNAM,=H'1' -1 fuer MVC-Laenge N R@PRGNAM,=F'63' Name auf 64 begrenzt EX R@PRGNAM,PRGEXMVC Programname ->WROUT-Bereich AH R@PRGNAM,=H'1' +1 fuer echte Laenge * * * Program Condition nach WROUT schreiben WRITE * LA R@OUT,PROWPCNS Start of Programs AR R@OUT,R@PRGNAM BCT R@I,PRGCYCL PRGEND EQU * * * ************************************************************** * * Alle Zugriffsbedingungen fuer ein Subjekt sind abgearbeitet* * * Auf Wortgrenze Positionieren * * ************************************************************** AH R@OUT,=H'3' N R@OUT,=F'-4' X'FFFFFFFC' * * ************************************************************** * * Fuer jedes Subjekt die Zugriffsbedingungen aus dem * * * Ausgabebereich lesen * * * Loop-Ende * * ************************************************************** BCT R@GUA,MORE2 B GUAFRTG * * ************************************************************** * * Ein Guard wurde komplett abgearbeitet. Pruefen, ob es * * * im SHWSAC-Ausgabebereich weitere Guardeintraege gibt. * * * In diesem Beispiel gibt es keine. * * ************************************************************** GUAFRTG EQU * L R@USED,PROWOADR A R@USED,PROWOUS# CR R@USED,R@OUT BP ONEGUARD * * ************************************************************** * * Pruefen, ob SHWSAC gemeldet hat, dass weitere Guards * * * zur Anzeige anstehen, die im Ausgabebereich keinen Platz * * * mehr gefunden haben. * * ************************************************************** CLC PROWOMOR,=Y(PROWMNO) BNE MORE1 B ENDE * * ************************************************************** * * Aufruf von WROUT * * ************************************************************** OUTOUT EQU * WROUT WROBER,WROFEHL MVC WROGNAM(WROTEXL),SPACES BR R@BACK WROFEHL EQU * B ENDE * * ************************************************************** * * Fehlerbehandlung * * ************************************************************** RCNOTOK EQU * * Die moeglichen Returncode-Werte sind im Makro MSGGUAD * aufgelistet B ENDE * * ************************************************************** * * Uebertragen Programmname in den WROUT-Ausgabebereich * * ************************************************************** PRGEXMVC MVC WROPRGNA(1),PROWPCNS Start of Programs * * ************************************************************** * * Programmende von Beispielprogramm GUA4 * * ************************************************************** ENDE EQU * TERM * * * * ************************************************************** * *------------------------------------------------------------* * * Parameterdeklarationen * * *------------------------------------------------------------* * ************************************************************** * * Dieser Parameterbereichs wird bei Aufruf des Makros SHWSAC * im Register 1 uebergeben. * PARSACC DS 0F SHWSAC MF=C * * Dieser Parameterbereich wird vor Aufruf des Makros SHWSAC * verwendet, um den Parameterbereich PARRACC neu zu * initialisieren. * PARSACL DS 0F SHWSAC MF=L, - GUARD=' ' - OUTAREA=(OUTBER,OUTBERLG) * OUTBERLG DC A(OUTBERL) * * ************************************************************** * *------------------------------------------------------------* * * WROUT-Bereich * * *------------------------------------------------------------* * ************************************************************** * SPACES DC CL256' ' WROBER EQU * DC Y(WROBERL) DC X'0000' DC X'00' WROGNAM DS CL24 Guardname DS XL1 WROSTYP DS CL8 Subjekttyp DS XL1 WROSNAM DS CL8 Subjekt DS XL1 WROINEX DS CL3 INTERVAL oder EXCEPT DS XL1 WROTIML DS CL5 Time Lower Bound DS XL1 WROTIMU DS CL5 Time Upper Bound ORG WROTIML WRODATL DS CL10 Date Lower Bound DS XL1 WRODATU DS CL10 Date Upper Bound ORG WROTIML WROWEEK DS CL21 Weekday ORG WROTIML WROPRGNA DS CL64 Programmname ORG WROTEXL EQU *-WROGNAM WROBERL EQU *-WROBER * * ************************************************************** * *------------------------------------------------------------* * * Ausgabebereich fur SHWSAC * * *------------------------------------------------------------* * ************************************************************** * OUTBER EQU * DS XL256 DS XL256 DS XL256 DS XL256 DS XL256 DS XL256 DS XL256 DS XL256 OUTBERL EQU *-OUTBER * * ************************************************************** * *------------------------------------------------------------* * * Deklarationen globaler Variablen * * *------------------------------------------------------------* * ************************************************************** * SACMGMT MF=D,XPAND=PARAM * * ************************************************************** * *------------------------------------------------------------* * * Deklarationen des Ausgabebereiches von SHWSAC * * *------------------------------------------------------------* * ************************************************************** * SHWSAC MF=D,XPAND=OUTPUT * * ************************************************************** * *------------------------------------------------------------* * * Deklarationen der Returncodes * * *------------------------------------------------------------* * ************************************************************** * MSGGUAD MF=D * WEKDSEC DSECT 0X Weekday-Dsect WEEKDAY DS CL3 WEEKDAY# EQU * * END
Ergebnis
Das Programm gibt die Zugriffsbedingungen in folgender Form nach SYSOUT aus:
:PUB1:$TESTUID.TEST-GUA USER ANNE IN 2017-10-15 2017-11-15 USER MARY MO TU WE USER PAUL IN 2017-07-01 2017-09-30 GROUP REVIEWER IN 09:00 15:00 IN 2017-08-23 2017-08-24 2017-09-09 2017-09-10 GROUP TEAMWORK IN 09:00 15:00 IN 2017-08-23 2017-08-24 2017-09-09 2017-09-10 ALLUSERS IN 07:00 19:00 EX SA SU