Mainframe Utility: ONESPACE

Return to Mainframe Utilities Page

Module


ISREDIT MACRO (OPT1,OPT2,OPT3,OPT4,OPT5,OPT6,OPT7)
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
ELSE CONTROL NOMSG NOLIST NOFLUSH NOPROMPT
/**********************************************************************/
/* UTILITY NAME : ONESPACE                                            */
/* AUTHOR       : DAVE LEIGH                                          */
/* DESCRIPTION  : CHANGE MORE THAN ONE CONTIGUOUS SPACE TO ONLY ONE   */
/*              : SPACE IN THE AREA SPECIFIED.                        */
/**********************************************************************/

/**********************************************************************
/* COMBINE THE OPTIONS INTO ONE STRING FOR THE SUBSEQUENT COMMAND.    *
/**********************************************************************
SET OPTIONS = &SYSCAPS(&OPT1 &OPT2 &OPT3 &OPT4 &OPT5 &OPT6 &OPT7)
ISREDIT (SLINE,SCOL) = CURSOR
SET COUNT = 0

/**********************************************************************
/* GET LRECL, USER'S POSITION AND CURRENT BOUNDS.                     *
/**********************************************************************
ISREDIT (LRECL) = LRECL
ISREDIT (SLN,SCL) = CURSOR
ISREDIT (LEFT,RIGHT) = BOUNDS

/**********************************************************************
/* DO IT!                                                             *
/**********************************************************************
ISREDIT BOUNDS 1 &LRECL
ISREDIT SEEK FIRST ' ' &STR(&OPTIONS)
DO WHILE &LASTCC = 0
    ISREDIT (LN,CL) = CURSOR
    ISREDIT SEEK NEXT P'¬' .ZCSR .ZCSR
    IF &LASTCC = 0 THEN +
        DO
            ISREDIT (LN1,CL1) = CURSOR
            IF &EVAL(&CL1 - &CL) > 1 THEN +
                DO
                    ISREDIT BOUNDS = &CL &LRECL
                    ISREDIT SHIFT ( .ZCSR &EVAL(&CL1 - &CL - 1)
                    ISREDIT BOUNDS 1 &LRECL
                END
            ISREDIT CURSOR = &LN &CL
        END
    ELSE +
        DO
            SET COUNT = &COUNT + 1
            IF &EVAL(&COUNT//10) = 0 THEN +
                DO
                    SET ZEDSMSG = &STR(&COUNT LINES PROCESSED)
                    ISPEXEC CONTROL DISPLAY LOCK
                    ISPEXEC DISPLAY MSG(UTLZ000W)
                END
            ISREDIT FIND LAST P'=' .ZCSR .ZCSR
        END
    ISREDIT SEEK NEXT ' ' &STR(&OPTIONS)
END

ISREDIT CURSOR = &SLN &SCL
ISREDIT BOUNDS = &LEFT &RIGHT
SET ZEDSMSG = &STR(SPACES COMPRESSED)
SET ZEDLMSG = &STR(NO MORE THAN ONE SPACE SEPARATES NON-BLANK CHARS IN +
                   ANY TARGET AREA)
ISPEXEC SETMSG MSG(UTLZ000)

EXIT

HELPSEC: +
ISPEXEC SELECT PGM(ISPTUTOR) PARM(HELPSHEL)
SET ZEDLMSG = &STR(*** HELP DISPLAYED FOR ONESPACE UTILITY +
                   *** NO PROCESSING PERFORMED ***)
ISPEXEC SETMSG MSG(UTLZ000)
EXIT
            


Documentation


 The ONESPACE edit macro reduces any multiple contiguous spaces between any two
 non-blank characters to only a single space.  This can be for the entire file,
 or some portion of it.

 The basic syntax of ONESPACE is simple....

 COMMAND ===> onespace {optional filtering parameters....}

 The filtering parameters would be the same as those you might specify for a
 typical edit change command.  You can specify specific columns, excluded
 status, and system or user edit labels.

 A few notes about better ways to do things with ONESPACE.  You can specify "X"
 or "NX", but specifying "X" probably does not work the way you might think.
 Since ONESPACE actually uses a CHANGE ALL command (plus any filtering
 parameters you specify), if a line is changed, it is automatically
 "un-excluded", and further processing on that line is discontinued (ONESPACE
 operates iteratively) so it may not be processed correctly.  "NX" will work
 correctly, but, it is better to use edit labels or "NX" than "X".

 The other caveat involves the specification of colums.  When ONESPACE performs
 the CHANGE ALL, data may shift from outside of the original column
 specification to inside the specification.  This may produce positive or

 negative results depending upon what you were expecting.  If you truly want to
 isolate some columns of data, you should specify a BNDS line command and pick
 your bounds before invoking ONESPACE.

 Finally, it should be noted that you can combine several parameters to come up
 with some fairly complex filtering options.
            


Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.