Mainframe Utility: MISSING#

Return to Mainframe Utilities Page

Module


ISREDIT MACRO (COLUMN1,COLUMN2,OPT1,OPT2,OPT3,OPT4,OPT5,OPT6,OPT7,OPT8)
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
IF &STR(&COLUMN1) = HELP THEN GOTO HELPSEC
/**********************************************************************/
/* UTILITY NAME : MISSING#                                            */
/* AUTHOR       : DAVE LEIGH                                          */
/* DESCRIPTION  : ADD MESSAGE LINES WHERE A MISSING SEQUENCE NUMBER   */
/*              : SHOULD BE.                                          */
/**********************************************************************/

/**********************************************************************
/* SET SOME INITIAL VARIABLES.                                        *
/**********************************************************************
ISREDIT (LRECL) = LRECL
ISREDIT (LN,CL) = CURSOR
SET LINES_ADDED = 0
SET COUNTER_VALUE = 0
SET LINETYPE = MSGLINE
DO &I = 1 TO 8
    SET X = &&OPT&I
    SET X = &X
    IF &STR(&X) >      THEN +
        IF &STR(&X) = WRITE THEN SET LINETYPE = DATALINE
        ELSE SET OPTIONS = &STR(&OPTIONS &X)
END

/**********************************************************************
/* PARSE, VALIDATE THE USER'S INPUT                                   *
/**********************************************************************
IF &DATATYPE(&STR(&COLUMN1)) = CHAR OR +
   &DATATYPE(&STR(&COLUMN2)) = CHAR OR +
   &STR(&COLUMN1) = 0 OR +
   &STR(&COLUMN2) = 0 OR +
   &STR(&COLUMN1) =    OR +
   &STR(&COLUMN2) =    OR +
   &COLUMN2 < &COLUMN1 OR +
   &COLUMN1 > &LRECL OR +
   &COLUMN2 > &LRECL THEN +
    DO
        SET ZEDSMSG = &STR(INVALID PARAMETERS)
        SET ZEDLMSG = &STR(YOU MUST PASS A BEGINNING AND ENDING COLUMN +
                           # TO THE MISSING# MACRO (E.G. "MISSING# 35 +
                           40"))
        ISPEXEC SETMSG MSG(UTLZ001)
        EXIT CODE(12)
    END

/**********************************************************************
/* SET SOME MORE PROCESS VARIABLES.                                   *
/**********************************************************************
SET A1 =
SET A2 =
DO &I = 1 TO &EVAL(&COLUMN1 - 2)
    SET A1 = &STR(&A1>)
END
DO &I = &EVAL(&COLUMN2 - 2) TO &LRECL
    SET A2 = &STR(&A2<)
END
SET NUMLEN = &COLUMN2 - &COLUMN1 + 1

/**********************************************************************
/* GO THROUGH THE LINES SPECIFIED BY THE USER                         *
/**********************************************************************
ISREDIT FIND FIRST P'=' &STR(&OPTIONS)
DO WHILE &LASTCC = 0
    ISREDIT (LINE) = LINE .ZCSR
    SET NUMBER = &SUBSTR(&COLUMN1:&COLUMN2,&STR(&SYSNSUB(1,&LINE)))
    ERROR RETURN
    SET NUMBER = &NUMBER
    ERROR OFF
    IF &DATATYPE(&STR(&NUMBER)) = NUM THEN +
        IF &NUMBER > 0 THEN +
            IF &COUNTER_VALUE = 0 THEN +
                SET &COUNTER_VALUE = &NUMBER
            ELSE +
                DO
                    DO WHILE &EVAL(&NUMBER - &COUNTER_VALUE) > 1
                        SET COUNTER_VALUE = &COUNTER_VALUE + 1
                        SET X = &COUNTER_VALUE
                        SELECT
                            WHEN (&COUNTER_VALUE < 10) DO
                                DO &I = 1 TO &EVAL(&NUMLEN - 1)
                                    SET X = &STR(0&X)
                                END
                            END
                            WHEN (&COUNTER_VALUE < 100) DO
                                DO &I = 1 TO &EVAL(&NUMLEN - 2)
                                    SET X = &STR(0&X)
                                END
                            END
                            WHEN (&COUNTER_VALUE < 1000) DO
                                DO &I = 1 TO &EVAL(&NUMLEN - 3)
                                    SET X = &STR(0&X)
                                END
                            END
                            WHEN (&COUNTER_VALUE < 10000) DO
                                DO &I = 1 TO &EVAL(&NUMLEN - 4)
                                    SET X = &STR(0&X)
                                END
                            END
                            WHEN (&COUNTER_VALUE < 100000) DO
                                DO &I = 1 TO &EVAL(&NUMLEN - 5)
                                    SET X = &STR(0&X)
                                END
                            END
                            WHEN (&COUNTER_VALUE < 1000000) DO
                                DO &I = 1 TO &EVAL(&NUMLEN - 6)
                                    SET X = &STR(0&X)
                                END
                            END
                            WHEN (&COUNTER_VALUE < 10000000) DO
                                DO &I = 1 TO &EVAL(&NUMLEN - 7)
                                    SET X = &STR(0&X)
                                END
                            END
                            WHEN (&COUNTER_VALUE < 100000000) DO
                                DO &I = 1 TO &EVAL(&NUMLEN - 8)
                                    SET X = &STR(0&X)
                                END
                            END
                            WHEN (&COUNTER_VALUE < 1000000000) DO
                                DO &I = 1 TO &EVAL(&NUMLEN - 9)
                                    SET X = &STR(0&X)
                                END
                            END
                            WHEN (&COUNTER_VALUE < 10000000000) DO
                                DO &I = 1 TO &EVAL(&NUMLEN - 10)
                                    SET X = &STR(0&X)
                                END
                            END
                            OTHERWISE DO
                                SET ZEDLMSG = &STR(THE NUMBER WIDTH +
                                                   IS TOO BIG TO HANDLE)
                                ISPEXEC SETMSG MSG(UTLZ001)
                                EXIT CODE(12)
                            END
                        END
                        SET LINES_ADDED = &LINES_ADDED + 1
                        ISREDIT LINE_BEFORE .ZCSR = &LINETYPE +
                                <1 (A1) (COLUMN1) (X) +
                                 &STR(&EVAL(&COLUMN2 + 2)) (A2)>
                    END
                    SET &COUNTER_VALUE = &NUMBER
                END
    ISREDIT FIND LAST P'=' .ZCSR .ZCSR
    ISREDIT FIND NEXT P'=' &STR(&OPTIONS)
END

/**********************************************************************
/* WRAP UP                                                            *
/**********************************************************************
IF &LINETYPE = DATALINE THEN +
    DO
        SET ZEDSMSG = &STR(&LINES_ADDED LINES INSERTED)
        SET ZEDLMSG = &STR(&LINES_ADDED SEQUENCE SKIPS FOUND.+
                           "F '<<<<<<' TO SEE INSERTED LINES)
    END
ELSE +
    DO
        SET ZEDSMSG = &STR(&LINES_ADDED SKIPS MARKED)
        SET ZEDLMSG = &STR(&LINES_ADDED SEQUENCE SKIPS FOUND.+
                           "L SPECIAL" TO SEE EACH ONE)
    END
ISPEXEC SETMSG MSG(UTLZ000)

ISREDIT CURSOR = &LN &CL

EXIT

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


Documentation


 MISSING# is an edit macro which helps you find missing numbers in a column
 which is supposed to have numbers in sequence.  For instance, if you are
 working on a document of some type where you have numbered bullets.  If those
 numbers are in a consistent column (right or left justified), MISSING# can tell
 you if you missed any numbers in your sequencing process.  If, for example, you
 numbered one item "23" and the next item "27" accidently, MISSING# would insert
 ISPF/PDF editor "message lines" before item "27" which told you that sequence
 numbers "24", "25", and "26" were missing.

 Syntax is as follows:

 COMMAND ===> missing# n1 n2 {other operands}

 "n1" is the beginning column of the number and "n2" is the ending column of the
 number.  "other operands" would be things like "x" or an edit label range to
 limit the processing.  The operands are optional and the whole file is
 processed if no operands are specified.
            


Leave a Reply

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