/* THIS REXX USES SORT TO ELIMINATE DUPLICATES IN ISPF EDIT. THE EDIT MACRO NAME IS 'SUMMARY' BECAUSE 'SUM' IS TOO CLOSE TO THE TSO SUBMIT ABBREV. 'SUB'. */ "ISREDIT MACRO (PROCESS)" "ISREDIT (LREC) = LRECL" DELSTACK IF PROCESS /= '' THEN CALL PROCARG /* SUBROUTINE */ IF PROCESS = '' THEN DO L1=1 /* BEGINNING SORT FIELD */ L2=LREC /* END OF SORT FIELD */ END SPAN = L2 + 1 - L1 X=OUTTRAP(ON) "FREE FI(SORTIN,SORTOUT,SORTMSG,SYSIN)" "ALLOC FI(SORTIN) NEW DATACLAS(SEQFB) LRECL("LREC") REUSE" CNT = 1 "ISREDIT (LASTLN) = LINENUM .ZLAST" DO WHILE CNT <= LASTLN "ISREDIT (SORTIN) = LINE "CNT RCC = RC CNT = CNT + 1 IF RCC = 0 THEN QUEUE SORTIN END QUEUE "EXECIO * DISKW SORTIN(FINIS" DELSTACK "ALLOC DD(SYSIN) NEW DATACLAS(SEQFB) LRECL(80) REUSE" QUEUE ' SORT FIELDS=('L1','SPAN',CH,A),DYNALLOC=(SWORK,1),FILSZ=E99' QUEUE ' SUM FIELDS=NONE' QUEUE ' END ' QUEUE "EXECIO * DISKW SYSIN(FINIS" DELSTACK "ALLOC FI(SORTOUT) NEW DATACLAS(SEQFB) LRECL("LREC") REUSE" "ALLOC FI(SORTMSG) DUMMY" SORT /* SYNCSORT - LINK LISTED */ "ISREDIT DELETE 1 .ZLAST" /* CLEAN THE EDIT SLATE */ "EXECIO * DISKR SORTOUT(STEM SRT. FINIS" CNT = 1 DO WHILE CNT /= SRT.0 + 1 SORTOUT = SRT.CNT LCNT = RIGHT(CNT-1,6,0) "ISREDIT LINE_AFTER "LCNT" = (SORTOUT)" CNT = CNT + 1 END "FREE FI(SORTIN,SORTOUT,SORTMSG,SYSIN)" X=OUTTRAP(OFF) EXIT 0000 PROCARG: /* SUB-PROCEDURE FOR ARGUMENTS */ PARSE VAR PROCESS L1 L2 L3 L1RC=VERIFY(L1,'0123456789') /* ENSURE NUMERIC L1 */ L2RC=VERIFY(L2,'0123456789') /* ENSURE NUMERIC L1 */ L1BK=INDEX(L1,' ') L2BK=INDEX(L2,' ') CUMRC = L1RC + L2RC + L1BK + L2BK /* IS FIELD ONE GREATER THAN ZERO? */ IF L3 /= '' THEN DO ZEDSMSG = 'PARM # > 2 ' ZEDLMSG = 'NUMBER OF PARMS EXCEEDS TWO ' "ISPEXEC SETMSG MSG(ISRZ001)" EXIT 0000 END /* ARE FIELDS NUMERIC? */ IF CUMRC > 0 THEN DO ZEDSMSG = 'PARMS NOT NUMERIC' ZEDLMSG = 'SORT FIELD PARAMETERS CONTAINED NON-NUMERIC DATA' "ISPEXEC SETMSG MSG(ISRZ001)" EXIT 0000 END /* IS FIELD TWO GREATER THAN LRECL? */ IF L2 > LREC THEN DO ZEDSMSG = 'FIELD EXCEEDS LRECL' ZEDLMSG = 'SECOND SORT FIELD PARAMETER GREATER THAN LRECL ' "ISPEXEC SETMSG MSG(ISRZ001)" EXIT 0000 END /* IS FIELD ONE GREATER THAN ZERO? */ IF L1 < 1 THEN DO ZEDSMSG = 'FIELD EQUALS ZERO' ZEDLMSG = 'FIRST SORT FIELD PARAMETER IS LESS THAN ONE ' "ISPEXEC SETMSG MSG(ISRZ001)" EXIT 0000 END /* IS FIELD ONE GREATER THAN ZERO? */ IF L1 > L2 THEN DO ZEDSMSG = 'FIELD SEQUENCE' ZEDLMSG = 'FIRST SORT FIELD GREATER THAN SECOND FIELD ' "ISPEXEC SETMSG MSG(ISRZ001)" EXIT 0000 END RETURN /* RETURN TO CALLING POINT IN MAIN-LINE OF PROGRAM */