On Fri, 25 Jun 2010 10:34:01 -0600, Howard Brazee <howard.bra...@cusys.edu> wrote:
>On 25 Jun 2010 09:07:31 -0700, st...@trainersfriend.com (Steve >Comstock) wrote: > >>I'm pretty sure those are not generally distributed with z/OS. > >I wonder how they got distributed to these different shops then. Looking at the code, I see that Zoom is privately created: /*PROGRAM: ZOOM ** **AUTHOR: JOHN BUBENHEIM - UNION BANK ** **SYNTAX: ZOOM E - EDIT MODE ** **PURPOSE: PROVIDE CURSOR SENSITIVE DSN AND DDNAME RECOGNITION ** ALLOWING USERS TO ZOOM INTO ANOTHER DATA SET ** WITHOUT LEAVING THEIR CURRENT EDIT SESSION. ** **USAGE PLACE CURSOR UNDER ANY VALID DSN OR DDNAME CHARACTER ** AND START ZOOM FROM THE COMMAND LINE OR A PRE- ** DEFINED PFKEY. PFKEY USE IS RECOMMENDED TO MINIMIZE ** CURSOR REPOSITIONING. IF THE CURSOR IS LEFT ON THE ** COMMAND LINE, THE FIRST DATA LINE DISPLAYED WILL BE ** SEARCHED FOR A VALID DSN. ** **FEATURES: DSN SYNTAX CHECKING WITH SYSDSN ** ** SYMBOLIC VARIABLE SUBSTITUTION. ** ** CONCATENATION RECOGNITION WITH MEMBER SEARCH OPTION. ** ** AUTOMATIC SWITCH TO BROWSE MODE IF EDIT FAILS. ** ** ALLOWS EDIT SESSIONS TO BE STACKED. ** ** ALLOWS MODULAR ADDITION OF NEW FUNCTION. */ SETUP: /*****************************************************************************/ /* SET ERROR AND MESSAGE CONTROLS ** ** ESTABLISH EDIT MACRO ENVIRONMENT ** ** SET MODE */ /*****************************************************************************/ "ISPEXEC CONTROL ERRORS RETURN" X = MSG("OFF") "ISREDIT MACRO (FUNC)" IF TRANSLATE(SUBSTR(FUNC,1,1)) = "E" THEN FUNC = "EDIT" ELSE FUNC = "BROWSE" CHECK_CURSOR_DATA: /*****************************************************************************/ /* FIND AND SAVE CURRENT CURSOR LOCATION REPOSITION CURSOR TO DATA FIELD IF NECESSARY SET DATA LENGTH AND A LIST OF VALID DSN CHARACTERS DETERMINE IF CURSOR IS ON VALID DSN CHARACTER CHECK IF DSN OR DDNAME AND CALL APPROPRIATE ROUTINE */ /*****************************************************************************/ "ISREDIT (LIN,COL) = CURSOR" OLIN = LIN ; OCOL = COL IF COL = 0 THEN DO "ISREDIT FIND '.' .ZCSR .ZCSR" IF RC = 4 THEN "ISREDIT CURSOR = .ZCSR 1" "ISREDIT (LIN,COL) = CURSOR" END "ISREDIT (DATA) = LINE .ZCSR" DATA = TRANSLATE(DATA) LEN = LENGTH(DATA) VAL = "abcdefghijklmnopqrstuvw...@#$0123456789.()-+&" IF VERIFY(SUBSTR(DATA,COL,1),VAL,"N") \= 0 THEN DO SAY "INVALID CURSOR LOCATION" SIGNAL QUIT END MEM = "" IF SUBSTR(DATA,1,2) = "//" & COL < POS(" DD ",DATA) THEN CALL DDNAME ELSE CALL DSNAME PROCESS_STACK: /*****************************************************************************/ /* PULL DSN'S FROM STACK IN FIFO ORDER CHECK FOR SYMBOLICS AND TAKE APPROPRIATE ACTION PERFORM FIRST LEVEL CHECK USING SYSDSN PROTECT CURRENT STACK FROM RECURSIVE EDITS CHECK SYSDSN MSG AND DECIDE WHETHER TO PROCEED */ /*****************************************************************************/ DO QUEUED() PULL DSN IF POS("&",DSN) \= 0 & POS("&&",DSN) = 0 THEN CALL SYMBOLIC IF MEM \= "" THEN DSN = DSN || "(" || MEM || ")" MSG = SYSDSN("'"DSN"'") "NEWSTACK" IF (MSG = "INVALID DATASET NAME, '"DSN"'" & MEM = "") |, (MSG = "MEMBER NOT FOUND" & MEM = "") |, (MSG = "OK") THEN INTERPRET "CALL" FUNC ELSE SAY MSG "-" DSN "DELSTACK" END QUIT: /*****************************************************************************/ /* RESET EXCLUDED LINES RETURN CURSOR TO ORIGINAL LOCATION EXIT FROM ZOOM */ /*****************************************************************************/ "ISREDIT RESET" "ISREDIT CURSOR = "0LIN 0COL EXIT DDNAME: /*****************************************************************************/ /* THIS ROUTINE IS DESIGNED FOR JCL DDNAME PROCESSING SET CURRENT DDNAME DETERMINE TOTAL NUMBER OF LINES GET NEW LINE OF DATA IF NEEDED AND PARSE IT FIND ALL OCCURRENCES OF DSN= AND DSNAME= IN CURRENT DDNAME, REPOSITION CURSOR TO FIRST DSN POSITION, AND CALL DSNAME (DO NOT PROCESS JCL COMMENT STATEMENTS) IF CONCATENATION DETECTED (MORE THAN ONE DSN QUEUED) ASK USER IF MEMBER SEARCH IS DESIRED RETURN TO ORIGINAL CALLER */ /*****************************************************************************/ DDN = SUBSTR(DATA,3,POS(" ",DATA) - 3) "ISREDIT (LAST) = LINENUM .ZLAST" DO N = 1 TO (LAST - LIN + 1) BY 1 IF N \= 1 THEN "ISREDIT (DATA) = LINE" LIN + N - 1 PARSE VAR DATA V1 3 V2 V3 V4 V5 IF V1 = "//" THEN SELECT WHEN SUBSTR(DATA,3,1) = "*" THEN NOP WHEN SUBSTR(DATA,3,1) = " " | N = 1 THEN DO IF V2 \= "" & V3 = "DD" THEN V2 = V4 IF V2 = "DD" THEN V2 = V3 IF POS("DSNAME=",V2) \= 0 THEN DO COL = POS("DSNAME=",DATA) + 7 CALL DSNAME END IF POS("DSN=",V2) \= 0 THEN DO COL = POS("DSN=",DATA) + 4 CALL DSNAME END END OTHERWISE LEAVE N END END IF QUEUED() > 1 THEN DO "NEWSTACK" SAY "DD STATEMENT '"DDN"' CONTAINS CONCATENATED DATA SETS." SAY SAY "PLEASE ENTER A NAME TO BEGIN A MEMBER SEARCH OR JUST PRESS" SAY "ENTER TO" FUNC "EACH DATA SET INDIVIDUALLY." SAY PULL MEM "DELSTACK" END RETURN DSNAME: /*****************************************************************************/ /* FIND BEGINNING/ENDING DSN CHARACTERS BY SEARCHING FOR FIRST INVALID DSN CHARACTER LEFT AND RIGHT OF CURRENT CURSOR LOCATION EXTRACT THE DSN FROM THE DATA USING ABOVE BEG/END PLACE THE DSN ON THE STACK IN FIFO ORDER RETURN TO ORIGINAL CALLER */ /*****************************************************************************/ BEG = VERIFY(REVERSE(DATA),VAL,"N",(LEN - COL + 1)) IF BEG = 0 THEN BEG = 1 ; ELSE BEG = LEN - BEG + 2 END = VERIFY(DATA,VAL,"N",COL) ; IF END = 0 THEN END = LEN + 1 DSN = SUBSTR(DATA,BEG,ABS(END - BEG)) QUEUE DSN RETURN SYMBOLIC: /*****************************************************************************/ /* EXCLUDE ALL JCL COMMENT STATEMENTS SET POS1/POS2 TO STARTING/ENDING SYMBOLIC POSITIONS SET SYM VARIABLE STRIPPING "&" AND TRAILING "." FIND NEXT OCCURRENCE OF SYM (PROBABLY ON EXEC FOR INSTREAT PROC) IF NOT FOUNC CHECK FOR FIRST OCCURRENCE (PROBABLY ON PROC STATEMENT) IF FOUND SET POS2/POS3 TO START/END LITERAL POSITION IF NOT FOUND OR MORE THAN ONE FOUND, ASK USER TO SUPPLY THE SYMBOLIC'S LITERAL VALUE STRIP LEADING AND TRAILING SINGLE QUOTES REPLACE DSN'S SYMBOLIC VARIABLE WITH LITERAL VALUE CONTINUE PROCESSING UNTIL ALL SYMBOLICS ARE RESOLVED RETURN TO ORIGINAL CALLER */ /*****************************************************************************/ "ISREDIT EXCLUDE '//*' 1 ALL" DO FOREVER POS1 = POS("&",DSN) IF POS1 = 0 THEN LEAVE POS2 =POS(".",DSN,POS1) IF POS2 = 0 THEN POS2 =VERIFY(DSN,"()","M",POS1) - 1 IF POS2 < 0 THEN POS2 = LENGTH(DSN) SYM = STRIP(SUBSTR(DSN,(POS1 + 1),(POS2 - POS1)),"T",".") "ISREDIT FIND ' "SYM"=' NEXT NX" IF RC = 4 THEN "ISREDIT FIND ',"SYM"=' NEXT NX" IF RC = 4 THEN "ISREDIT FIND ' "SYM"=' ALL NX" IF RC = 4 THEN "ISREDIT FIND ',"SYM"=' ALL NX" "ISREDIT (NUMFINDS) = FIND_COUNTS" IF NUMFINDS = 1 THEN DO "ISREDIT (LIN,COL) = CURSOR" "ISREDIT (DATA) = LINE" LIN POS3 = POS("=",DATA,COL) + 1 POS4 = VERIFY(DATA,", ","M",POS3) LIT = SUBSTR(DATA,POS3,(POS4-POS3)) END ELSE DO "NEWSTACK" SAY SAY "WARNING: UNABLE TO DETERMINE THE LITERAL VALUE FOR" SAY " SYMBOLIC VARIABLE '"SYM"'" SAY SAY "PLEASE ENTER A VALUE (OR NULL) TO RESUME PROCESSING." SAY PULL LIT "DELSTACK" LIT = STRIP(LIT,"B","'") END LIT = STRIP(LIT,"B","'") DSN = INSERT(LIT,DELSTR(DSN,POS1,(POS2 - POS1 + 1)),(POS1 - 1)) "ISREDIT CURSOR = " 0LIN 0COL END RETURN EDIT: /*****************************************************************************/ /* EDIT THE DESIRED DATA SET RETURN THE APPROPRIATE MESSAGE IF EDIT FAILS ATTEMPT TO BROWSE THE DATA SET IF SEVERE ERROR RETURN TO ORIGINAL CALLER */ /*****************************************************************************/ "ISPEXEC EDIT DATASET('"DSN"')" SELECT WHEN RC = 14 THEN SAY DSN "-DATA SET OR MEMBER IN USE" WHEN RC = 16 THEN SAY DSN "- NO MEMBERS IN LIBRARY" WHEN RC = 20 THEN CALL BROWSE OTHERWISE NOP END RETURN BROWSE: /*****************************************************************************/ /* BROWSE THE DESIRED DATA SET RETURN THE APPROPRIATE MESSAGE IF BROWSE FAILS RETURN TO ORIGINAL CALLER */ /*****************************************************************************/ "ISPEXEC BROWSE DATASET('"DSN"')" SELECT WHEN RC = 12 THEN SAY DSN "- ZERO-LENGTH DATA" WHEN RC = 14 THEN SAY DSN "- MEMBER NOT FOUND" WHEN RC = 16 THEN SAY DSN "- NO MEMBERS IN LIBRARY" WHEN RC = 20 THEN SAY DSN "- SEVERE ERROR" OTHERWISE NOP END RETURN ---------------------------------------------------------------------- For IBM-MAIN subscribe / signoff / archive access instructions, send email to lists...@bama.ua.edu with the message: GET IBM-MAIN INFO Search the archives at http://bama.ua.edu/archives/ibm-main.html