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

Reply via email to