Return to Mainframe Utilities Page
Module
/**********************************************************************
/* UTILITY: ECHANGE *
/* AUTHOR: DAVID LEIGH *
/* FUNCTION: THIS UTILITY PROVIDES A WAY TO CHANGE EXTRA LONG STRINGS *
/* WITHOUT HAVING TO WRITE A MACRO OR SET KEYS. IT ALSO *
/* AUTOMATICALLY PARSES FOR A SPACE DELIMITED WORD IF YOUR *
/* CURSOR IS IN THE DATA. THAT BECOMES THE "FROM" STRING. *
/**********************************************************************
ISREDIT MACRO (PARM1 PARM2)
ISPEXEC CONTROL ERRORS RETURN
/**** SET MESSAGE DISPLAY ON/OFF BASED ON THE DEBUG SWITCH ***/
ISPEXEC VGET (DBGSWTCH) PROFILE
IF &DBGSWTCH = &STR(ON) THEN +
CONTROL MSG LIST CONLIST SYMLIST NOFLUSH ASIS
ELSE +
CONTROL NOMSG NOLIST NOFLUSH NOPROMPT ASIS
IF &STR(&SYSNSUB(1,&PARM)) = HELP THEN GOTO HELPSEC
/**********************************************************************
/* EVALUATE ANY PASSED PARMS *
/**********************************************************************
SET QT = &STR(')
SELECT (&SYSCAPS(&PARM1))
WHEN (PREFIX) SET PREFIX = &STR(&SYSNSUB(1,&PARM2))
WHEN (SUFFIX) SET SUFFIX = &STR(&SYSNSUB(1,&PARM2))
WHEN (TO) SET CTO = &STR(&QT&SYSNSUB(1,&PARM2)&QT)
END
/**********************************************************************
/* SAVE THE CURSOR POSITION AND SEE IF WE'RE ON THE COMMAND LINE *
/**********************************************************************
ISREDIT (LN,CL) = CURSOR
IF &CL = 0 THEN GOTO DISPLAY
/**********************************************************************
/* IF NOT ON THE COMMAND LINE FIND THE STRING OUR CURSOR IS ON *
/**********************************************************************
ISREDIT FIND PREV ' ' .ZCSR .ZCSR
ISREDIT FIND NEXT P'¬' .ZCSR .ZCSR
ISREDIT (LN1,CL1) = CURSOR
ISREDIT FIND NEXT ' ' .ZCSR .ZCSR
ISREDIT FIND PREV P'¬' .ZCSR .ZCSR
ISREDIT (LN2,CL2) = CURSOR
ISREDIT (CFROM) = LINE .ZCSR
SET CFROM = &SUBSTR(&CL1:&CL2,&STR(&SYSNSUB(1,&CFROM)))
IF &SYSINDEX(&STR('),&STR(&SYSNSUB(1,&CFROM))) > 0 AND +
&SYSINDEX(&STR("),&STR(&SYSNSUB(1,&CFROM))) = 0 THEN +
SET QT = &STR(")
IF &STR(&SYSNSUB(1,&CTO)) = THEN +
SET CTO = &STR(&QT&SYSNSUB(1,&PREFIX)+
&SYSNSUB(1,&CFROM)+
&SYSNSUB(1,&SUFFIX)&QT)
SET CFROM = &STR(&QT&SYSNSUB(1,&CFROM)&QT)
/**********************************************************************
/* DISPLAY THE DATA ENTRY PANEL AND EXIT IF THE USER "END"S OUT *
/**********************************************************************
DISPLAY: +
ISPEXEC DISPLAY PANEL(ECHANGE)
IF &LASTCC > 7 THEN +
DO
SET ZEDSMSG = &STR(NO CHANGE PERFORMED)
ISPEXEC SETMSG MSG(UTLZ000)
EXIT
END
/**********************************************************************
/* INFORM THE USER OF THE ACTIVITY *
/**********************************************************************
SET ZEDLMSG = &STR(CHANGING: &CFROM TO: &CTO +
PARMS: &CPARM)
ISPEXEC CONTROL DISPLAY LOCK
ISPEXEC DISPLAY MSG(UTLZ000W)
/**********************************************************************
/* LET'S FINALLY DO THE WORK! *
/**********************************************************************
ISPEXEC VGET (CFROM CTO CPARM) SHARED
ISREDIT CHANGE &STR(&SYSNSUB(1,&CFROM)) +
&STR(&SYSNSUB(1,&CTO)) +
&STR(&SYSNSUB(1,&CPARM))
/**********************************************************************
/* TELL THE USER THE RESULTS AND GO BACK TO THE LINE THEY WERE ON *
/**********************************************************************
SET CC = &LASTCC
ISREDIT (X,Y) = CHANGE_COUNTS
SET X = &X
SET Y = &Y
SELECT (&CC)
WHEN (0) DO
SET ZEDSMSG = &STR(CHANGE SUCCESSFUL)
SET ZEDLMSG = &STR(CHANGED &X STRING OCCURANCES)
ISPEXEC SETMSG MSG(UTLZ000)
END
WHEN (4) DO
SET ZEDSMSG = &STR(STRING NOT FOUND)
SET ZEDLMSG = &STR(COULD NOT FIND "&SYSNSUB(1,&CFROM)" +
TO CHANGE)
ISPEXEC SETMSG MSG(UTLZ001)
END
WHEN (8) DO
SET ZEDSMSG = &STR(SOME DATA UNCHANGED)
SET ZEDLMSG = &STR(&X OCCURANCES CHANGED AND &Y OCCURANCES +
UNCHANGED)
ISPEXEC SETMSG MSG(UTLZ001)
END
OTHERWISE DO
SET ZEDSMSG = &STR(SEVERE ECHANGE ERROR)
SET ZEDLMSG = &STR(THE CHANGE HAD A RETURN CODE OF: &CC)
ISPEXEC SETMSG MSG(UTLZ001)
END
END
ISREDIT CURSOR = &LN &CL
EXIT
/**********************************************************************
/* DISPLAY ANY "HELP" WHICH IS AVAILABLE FOR THIS UTILITY *
/**********************************************************************
HELPSEC: +
ISPEXEC SELECT PGM(ISPTUTOR) PARM(HELPSHEL)
SET ZEDLMSG = &STR(*** HELP DISPLAYED FOR ECHANGE UTILITY +
*** NO PROCESSING PERFORMED ***)
ISPEXEC SETMSG MSG(UTLZ000)
EXIT
Documentation
ECHANGE is an edit macro which allows you to issue change commands which would
not ordinarily fit on the edit command line or even on a PF key definition.
Additionally, and perhaps even more important is that when ECHANGE is assigned
to a PF key, and your cursor is in the body of your edit text, ECHANGE will
automatically determine the space-delimited string that your cursor is on, and
prepopulate the "change from" and "change to" strings on the ECHANGE data entry
panel.
When you invoke ECHANGE, you are presented with a screen which you can enter
your change command in three basic components:
1. The "FROM" string (i.e. the string you are changing from).
2. The "TO" string (i.e. the string you are changing to).
3. Additional edit change command parameters (e.g. "X/NX", column numbers, a
label range, etc.)
These values are stored in your ISPF "shared" pool, so that the next time you
invoke ECHANGE, those same values are there. If you invoked ECHANGE as
mentioned above, with your cursor "in" the data you are editing (as opposed to
the COMMAND line), the "FROM" and "TO" string values will be the text string
your cursor is placed on. Any parameter values you had entered previously
would still be there, however.
To invoke ECHANGE, simply type echange on the command line of an edit session
and press . You can, of course, set this to a PF key as well (which can
be very powerful).
An additional feature to mix with cursor-specific operation of ECHANGE is the
PREFIX (or SUFFIX) keyword. The best way to explain this is with an example.
Suppose that you were re-organizing the working storage of an existing ugly
production program. You had identified all the data names that were
"accumulators", and you wanted to put them in the same area and prefix each one
with an "A-" to better identify them in the code. Instead of typing a change
command for each one, you would do the following.
1. Set a PF key to ==> echange prefix a-
2. Place your cursor on one of the data names
3. Press the PF key
ECHANGE now parses for the data name your cursor is on (for the sake of
argument, let's say it's called MASTER-RECORDS-READ). It would set the change
"from" string to 'MASTER-RECORDS-READ' and the change "to" string to
'A-MASTER-RECORDS-READ'. In the "PARMS" field you would type "ALL" (this would
remain until you changed it or until you got out of ISPF).
When you press , you will be issuing the equivilent of the change
command:
c master-records-read a-master-records-read all
With just ONE keystroke! To process all these data names, you just position
your cursor, press the PF key, and press .

0 Comments