/* REXX */ /* */ /* AUTHOR: Mark Zelden */ /* */ /*********************************************************************/ /* MODIFIED FROM SYS1.SAMPLIB(IGGCSIRX) */ /*********************************************************************/ /* */ /* EXECUTION SYNTAX: */ /* CATSRCH dsn.filter */ /* (catalog name is optional) */ /* */ /* FILTER CHARACTERS: */ /* % - one character, * - one qualifier, */ /* ** - one or more qualifiers */ /* NOTE: A double asterisk cannot precede or follow any characters; */ /* it must be preceded or followed by either a period or a blank */ /* EXAMPLES: SYS1.A*.** (correct) */ /* SYS1.A** (not correct) */ /* */ /* ** NOTE: Do not use quotes for the data set name filter or */ /* catalog name. */ /* */ /* Caution should be exercised in using high-level qualifiers */ /* that contain generic filters because multiple catalogs can be */ /* searched. A high-level of "**" will cause a search of every */ /* user catalog in the system. */ /* */ /*********************************************************************/ /* */ /* EXAMPLES: */ /* TSO %CATSRCH USERID.** */ /* TSO %CATSRCH SYS1.LINK* */ /* TSO %CATSRCH SYS1.*LIB */ /* TSO %CATSRCH SYS1.*.PROCLIB */ /* TSO %CATSRCH SYS1.**.PROCLIB */ /* TSO %CATSRCH SYS1.A%%.*LIB */ /* TSO %CATSRCH USER*.** TSO.USERCAT */ /* TSO %CATSRCH SYS*.LINKLIB SYSICF.MASTER */ /* TSO %CATSRCH SYS*.LINKLIB (see caution above) */ /* TSO %CATSRCH SYS1.A*.** (SYS1.A** won't give everything - see */ /* note on ** above) */ /* */ /*********************************************************************/ LASTUPD = '10/09/2007' /* date of last update */ /*********************************************************************/ /********************************************************************/ /* */ /* NAME: IGGCSIRX */ /*DESCRIPTION: THIS REXX EXEC IS USED TO CALL THE CATALOG */ /* SEARCH INTERFACE. */ /* INPUT: FILTER KEY */ /* OUTPUT: DATA SETS NAMES AND VOLUMES */ /* */ /********************************************************************/ /* SAY 'ENTER FILTER KEY' */ /* ASK FOR FILTER KEY */ /* PULL KEY */ /* GET FILTER KEY */ /********************************************************************/ /* */ /* INITIALIZE THE PARM LIST */ /* */ /********************************************************************/ PARSE UPPER ARG KEY CAT . /* MSZ*/ IF KEY = '' THEN DO /* MSZ*/ SAY 'ENTER DATA SET NAME FILTER' /* MSZ*/ PULL KEY /* MSZ*/ END /* MSZ*/ COUNT = 0 /* TOTAL ENTIRES FOUND MSZ*/ MODRSNRC = SUBSTR(' ',1,4) /* CLEAR MODULE/RETURN/REASON */ CSIFILTK = SUBSTR(KEY,1,44) /* MOVE FILTER KEY INTO LIST */ IF CAT <> '' THEN /* MSZ*/ CSICATNM = SUBSTR(CAT,1,44) /* USE SPECIFIED CATALOG MSZ*/ ELSE /* MSZ*/ CSICATNM = SUBSTR(' ',1,44) /* CLEAR CATALOG NAME MSZ*/ CSIRESNM = SUBSTR(' ',1,44) /* CLEAR RESUME NAME */ CSIDTYPS = SUBSTR(' ',1,16) /* CLEAR ENTRY TYPES */ CSICLDI = SUBSTR('Y',1,1) /* INDICATE DATA AND INDEX */ CSIRESUM = SUBSTR(' ',1,1) /* CLEAR RESUME FLAG */ IF CAT <> '' THEN /* MSZ*/ CSIS1CAT = SUBSTR('Y',1,1) /* SEARCH ONLY 1 CAT MSZ*/ ELSE /* MSZ*/ CSIS1CAT = SUBSTR(' ',1,1) /* SEARCH > 1 CATALOGS MSZ*/ CSIRESRV = SUBSTR(' ',1,1) /* CLEAR RESERVE CHARACTER */ CSINUMEN = '0001'X /* INIT NUMBER OF FIELDS */ CSIFLD1 = SUBSTR('VOLSER',1,8) /* INIT FIELD 1 FOR VOLSERS */ /********************************************************************/ /* */ /* BUILD THE SELECTION CRITERIA FIELDS PART OF PARAMETER LIST */ /* */ /********************************************************************/ CSIOPTS = CSICLDI || CSIRESUM || CSIS1CAT || CSIRESRV CSIFIELD = CSIFILTK || CSICATNM || CSIRESNM || CSIDTYPS || CSIOPTS CSIFIELD = CSIFIELD || CSINUMEN || CSIFLD1 /********************************************************************/ /* */ /* INITIALIZE AND BUILD WORK ARE OUTPUT PART OF PARAMETER LIST */ /* */ /********************************************************************/ /* WORKLEN = 1024 */ /* DWORK = '00000400'X || COPIES('00'X,WORKLEN-4) */ WORKLEN = 131072 /* 128K */ /* APAR OW39593 */ DWORK = '00020000'X || COPIES('00'X,WORKLEN-4) /* APAR OW39593 */ /********************************************************************/ /* */ /* INITIALIZE WORK VARIABLES */ /* */ /********************************************************************/ RESUME = 'Y' PREVNAME = '' /* NO PREVIOUS NAME @01A*/ CATNAMET = SUBSTR(' ',1,44) DNAMET = SUBSTR(' ',1,44) /********************************************************************/ /* */ /* SET UP LOOP FOR RESUME (IF A RESUME IS NCESSARY) */ /* */ /********************************************************************/ DO WHILE RESUME = 'Y' /********************************************************************/ /* */ /* ISSUE LINK TO CATALOG GENERIC FILTER INTERFACE */ /* */ /********************************************************************/ ADDRESS LINKPGM 'IGGCSI00 MODRSNRC CSIFIELD DWORK' RESUME = SUBSTR(CSIFIELD,150,1) /* GET RESUME FLAG FOR NEXT LOOP */ USEDLEN = C2D(SUBSTR(DWORK,9,4)) /* GET AMOUNT OF WORK AREA USED */ POS1=15 /* STARTING POSITION */ /********************************************************************/ /* */ /* PROCESS DATA RETURNED IN WORK AREA */ /* */ /********************************************************************/ DO WHILE POS1 < USEDLEN /* DO UNTIL ALL DATA IS PROCESSED*/ IF SUBSTR(DWORK,POS1+1,1) = '0' /* IF CATALOG, PRINT CATALOG HEAD*/ THEN DO CATNAME=SUBSTR(DWORK,POS1+2,44) POS1 = POS1 + 50 END DNAME = SUBSTR(DWORK,POS1+2,44) /* GET ENTRY NAME */ /********************************************************************/ /* */ /* ASSIGN ENTRY TYPE NAME */ /* */ /********************************************************************/ IF SUBSTR(DWORK,POS1+1,1) = 'C' THEN DTYPE = 'CLUSTER ' ELSE IF SUBSTR(DWORK,POS1+1,1) = 'D' THEN DTYPE = 'DATA ' ELSE IF SUBSTR(DWORK,POS1+1,1) = 'I' THEN DTYPE = 'INDEX ' ELSE IF SUBSTR(DWORK,POS1+1,1) = 'A' THEN DTYPE = 'NONVSAM ' ELSE IF SUBSTR(DWORK,POS1+1,1) = 'H' THEN DTYPE = 'GDS ' ELSE IF SUBSTR(DWORK,POS1+1,1) = 'B' THEN DTYPE = 'GDG ' ELSE IF SUBSTR(DWORK,POS1+1,1) = 'R' THEN DTYPE = 'PATH ' ELSE IF SUBSTR(DWORK,POS1+1,1) = 'G' THEN DTYPE = 'AIX ' ELSE IF SUBSTR(DWORK,POS1+1,1) = 'X' THEN DTYPE = 'ALIAS ' ELSE IF SUBSTR(DWORK,POS1+1,1) = 'U' THEN DTYPE = 'UCAT ' ELSE DO /* NO ENTRIES IN THE CATALOG OR UNKNOWN TYPE *//* MSZ */ /* UNKNOWN TYPE CAN BE CAUSED BY PARTIAL *//* MSZ */ /* CATALOG RECORD SUCH AS AN INTERUPTED *//* MSZ */ /* DELETE OR UPDATE-EXTEND (IDC11441I) *//* MSZ */ /* THIS USED TO CAUSE A LOOP IN THIS CODE *//* MSZ */ IF SUBSTR(DWORK,POS1+1,1) = '0' THEN ITERATE /* CAT ENTRY MSZ */ POS1 = POS1 + 46 /* UNKNOWN DTYPE */ /* MSZ */ POS1 = POS1 + C2D(SUBSTR(DWORK,POS1,2)) /* NEXT ENTRY*/ /* MSZ */ ITERATE /* MSZ */ END /* ELSE DO */ /* MSZ */ /********************************************************************/ /* Moved this section of code from above so catalog name would */ /* not print during generic hlq search if no entires were found. */ /********************************************************************/ IF CATNAME <> CATNAMET THEN /* IF RESUME NAME MAY ALREADY BE*/ DO /* PRINTED */ /* IF FOUND = 'TRUE' THEN SAY ' ' */ IF FOUND = 'TRUE' THEN QUEUE ' ' /* SAY 'CATALOG ' CATNAME */ /* IF NOT, PRINT IT */ QUEUE 'CATALOG ' CATNAME /* IF NOT, PRINT IT */ /* SAY ' ' */ QUEUE ' ' CATNAMET = CATNAME FOUND = 'TRUE' /*MSZ*/ END /*************************************************************//*MSZ*/ /* CHECK FOR ERROR IN ENTRY RETURNED *//*MSZ*/ /*************************************************************//*MSZ*/ CSIEFLAG = SUBSTR(DWORK,POS1+0,1) /* Entry flag information*//*MSZ*/ IF BITAND(CSIEFLAG,'40'X) = '40'X THEN DO /*MSZ*/ POS1 = POS1 + 50 /* HEADER LENGTH */ /*MSZ*/ POS1 = POS1 + C2D(SUBSTR(DWORK,POS1,2)) /*MSZ*/ /* SAY 'ERROR PROCESSING THE FOLLOWING ENTRY:' */ /*MSZ*/ /* SAY 'DSN =' DNAME */ /*MSZ*/ /* SAY 'CAT =' CATNAME */ /*MSZ*/ /* SAY 'TYPE =' DTYPE */ /*MSZ*/ QUEUE 'ERROR PROCESSING THE FOLLOWING ENTRY:' /*MSZ*/ QUEUE 'DSN =' DNAME /*MSZ*/ QUEUE 'CAT =' CATNAME /*MSZ*/ QUEUE 'TYPE =' DTYPE /*MSZ*/ ITERATE /* GO TO NEXT ENTRY */ /*MSZ*/ END /*MSZ*/ /********************************************************************/ /* */ /* HAVE NAME AND TYPE, GET VOLSER INFO */ /* */ /********************************************************************/ COUNT = COUNT + 1 /* total entires found */ /*MSZ*/ POS1 = POS1 + 46 NUMVOL = C2D(SUBSTR(DWORK,POS1+4,2))/6 /* HOW MANY VOLSERS ? */ /* */ POS2 = POS1+6 /* POSITION ON DATA */ Drop VOLSER. ALLVOLS = '' DO I = 1 TO NUMVOL /* MOVE VOLSERS TO OUTPUT FIELDS */ VOLSER.I = SUBSTR(DWORK,POS2,6) POS2 = POS2 + 6 ALLVOLS = ALLVOLS VOLSER.I END /* IF DNAMET <> DNAME THEN */ /* IF RESUME, NAME MAY ALREADY MSZ*/ /* */ /* PRINTED MSZ*/ /* DO */ /* IF NOT, PRINT IT MSZ*/ /* SAY COPIES(' ',8) DTYPE DNAME ALLVOLS */ QUEUE COPIES(' ',8) DTYPE DNAME ALLVOLS /* DNAMET=DNAME */ /* MSZ */ /* END */ /* MSZ */ /********************************************************************/ /* */ /* GET POSITION OF NEXT ENTRY */ /* */ /********************************************************************/ POS1 = POS1 + C2D(SUBSTR(DWORK,POS1,2)) END IF RESUME = 'Y' &, /* IF WE'VE TRIED THIS ENTRY @01A*/ PREVNAME = DNAME THEN /* TWICE, WE'VE GOT TO QUIT @01A*/ DO /*@01A*/ /* SAY STRIP(DNAME) 'CANNOT BE PROCESSED WITH THE WORK AREA SIZE ',*/ /* 'PROVIDED - YOU MUST INCREASE THE WORK AREA AND RETRY' */ QUEUE STRIP(DNAME) 'CANNOT BE PROCESSED WITH THE WORK AREA SIZE ' QUEUE 'PROVIDED - YOU MUST INCREASE THE WORK AREA AND RETRY' /*RETURN */ /*@01A*/ LEAVE /*@01A*/ END /*@01A*/ PREVNAME = DNAME /* SAVE FOR NEXT ITERATION @01A*/ END /********************************************************************/ QUEUE '' /* NULL TO END STACK */ IF SYSVAR(SYSISPF)='ACTIVE' THEN CALL BROWSE_ISPF ELSE DO QUEUED() PARSE PULL LINE SAY LINE END EXIT 0 BROWSE_ISPF: /* BROWSE OUTPUT IF ISPF IS ACTIVE */ ADDRESS ISPEXEC "CONTROL ERRORS RETURN" ADDRESS ISPEXEC "VGET ZENVIR" ADDRESS TSO UID = SYSVAR('SYSUID') /* TSO USERID */ DDNM1 = 'DDO'||RANDOM(1,99999) /* CHOOSE RANDOM DDNAME */ DDNM2 = 'DDP'||RANDOM(1,99999) /* CHOOSE RANDOM DDNAME */ JUNK = MSG('OFF') "ALLOC FILE("||DDNM1||") UNIT(SYSALLDA) NEW CYL SPACE(5,5) DELETE", " REUSE LRECL(132) RECFM(F B) BLKSIZE(8976)" "ALLOC FILE("||DDNM2||") UNIT(SYSALLDA) NEW TRACKS SPACE(1,1) DELETE", " REUSE LRECL(80) RECFM(F B) BLKSIZE(3120) DIR(1)" JUNK = MSG('ON') "NEWSTACK" /*************************/ /* CATPNL PANEL SOURCE */ /*************************/ IF SUBSTR(ZENVIR,6,1) >= 4 THEN QUEUE ")PANEL KEYLIST(ISRSPBC,ISR)" QUEUE ")ATTR" QUEUE " _ TYPE(INPUT) INTENS(HIGH) COLOR(TURQ) CAPS(OFF)" QUEUE " | AREA(DYNAMIC) EXTEND(ON) SCROLL(ON)" QUEUE " + TYPE(TEXT) INTENS(LOW) COLOR(BLUE)" QUEUE " @ TYPE(TEXT) INTENS(LOW) COLOR(TURQ)" QUEUE " % TYPE(TEXT) INTENS(HIGH) COLOR(GREEN)" QUEUE " ! TYPE(OUTPUT) INTENS(HIGH) COLOR(TURQ) PAD(-)" QUEUE " 01 TYPE(DATAOUT) INTENS(LOW)" QUEUE " 02 TYPE(DATAOUT) INTENS(HIGH)" QUEUE " 0B TYPE(DATAOUT) INTENS(HIGH) FORMAT(DBCS)" QUEUE " 0C TYPE(DATAOUT) INTENS(HIGH) FORMAT(EBCDIC)" QUEUE " 0D TYPE(DATAOUT) INTENS(HIGH)" QUEUE " 10 TYPE(DATAOUT) INTENS(LOW) FORMAT(DBCS)" QUEUE " 11 TYPE(DATAOUT) INTENS(LOW) FORMAT(EBCDIC)" QUEUE " 12 TYPE(DATAOUT) INTENS(LOW)" QUEUE ")BODY EXPAND(//) WIDTH(&ZWIDTH)" QUEUE "%BROWSE @&ZTITLE / / %LINE!ZLINES %COL!ZCOLUMS+" QUEUE "%COMMAND ===>_ZCMD / / %SCROLL ===>_Z +" QUEUE "|ZDATA ---------------/ /-------------------------|" QUEUE "| / / |" QUEUE "| --------------------/-/-------------------------|" QUEUE ")INIT" QUEUE " .HELP = ISR10000" QUEUE " .ZVARS = 'ZSCBR'" QUEUE " &ZTITLE = 'Mark''s MVS Utilities - CATSRCH'" QUEUE " VGET (ZSCBR) PROFILE" QUEUE " IF (&ZSCBR = ' ')" QUEUE " &ZSCBR = 'CSR'" QUEUE ")REINIT" QUEUE " REFRESH(ZCMD,ZSCBR,ZDATA,ZLINES,ZCOLUMS)" QUEUE ")PROC" QUEUE " &ZCURSOR = .CURSOR" QUEUE " &ZCSROFF = .CSRPOS" QUEUE " &ZLVLINE = LVLINE(ZDATA)" QUEUE " VPUT (ZSCBR) PROFILE" QUEUE ")END" QUEUE "" /* */ Address ISPEXEC "LMINIT DATAID(PAN) DDNAME("ddnm2")" Address ISPEXEC "LMOPEN DATAID("pan") OPTION(OUTPUT)" Do queued() Parse pull panline Address ISPEXEC "LMPUT DATAID("pan") MODE(INVAR)" , "DATALOC(PANLINE) DATALEN(80)" End Address ISPEXEC "LMMADD DATAID("pan") MEMBER(CATPNL)" Address ISPEXEC "LMFREE DATAID("pan")" "Delstack" "EXECIO * DISKW" DDNM1 "(FINIS" IF FOUND <> 'TRUE' THEN DO ZEDSMSG = 'No matches found' ZEDLMSG = 'No matches were found for' KEY ||'.' , ' CATSRCH -' , 'Last updated on' LASTUPD ||'. Written by' , 'Mark Zelden. Mark''s MVS Utilities -' , 'http://www.mzelden.com/mvsutil.html' ADDRESS ISPEXEC "SETMSG MSG(ISRZ001)" /* MSG - WITH ALARM */ END ELSE DO ZEDSMSG = COUNT 'matches found' ZEDLMSG = COUNT 'matches were found for' KEY ||'.' , ' CATSRCH -' , 'Last updated on' LASTUPD ||'. Written by' , 'Mark Zelden. Mark''s MVS Utilities -' , 'http://www.mzelden.com/mvsutil.html' ADDRESS ISPEXEC "SETMSG MSG(ISRZ000)" /* MSG - NO ALARM */ END ADDRESS ISPEXEC "LIBDEF ISPPLIB LIBRARY ID("||ddnm2||") STACK" ADDRESS ISPEXEC "LMINIT DATAID(TEMP) DDNAME("||ddnm1||")" ADDRESS ISPEXEC "BROWSE DATAID("||temp") PANEL(CATPNL)" ADDRESS ISPEXEC "LMFREE DATAID("||temp")" ADDRESS ISPEXEC "LIBDEF ISPPLIB" JUNK = MSG('OFF') "FREE FI("||ddnm1||")" "FREE FI("||ddnm2||")" RETURN