Compare Program
There was a forum that I sometimes watch that had a 3 day exchange about
why 2 files that looked alike, wouldn't compare. In fact, when I was working,
compare programs were generally pretty terrible. There wasn't much flexibility
at all. Having more time on my hands than is reasonable, I wrote this.
It's been 15 years or so since I worked, and this is almost entirely from memory.
It does seem to work now.
If I had files that didn't compare, the first thing I'd do is run it with the "LISTBYTE"
option, that identifies which specific bytes don't match. It stops after 9 records
that don't match, but that is a control parameter option.
I expect that looking at the report would give me a pretty good idea what I need to do
to get a good compare run. There's internal documentation on how to use it.
MACRO
&L TRACE
.* &L DS 0H One could assemble the program using this
.* To make it shorter, and run faster.
.* MEXIT
.*
&L CLI FLAGTRAC,C' '
BE SYS&SYSNDX+12
STM R14,RETREG,TRACSAVE
BAL R14,TRACE
SYS&SYSNDX DC CL8'&L'
LM R14,RETREG,TRACSAVE
MEND
* --------------------------------------------------
MACRO
&L PUTOPEN &DCB,&REC
&L LA 1,&DCB
TM DCBOFLGS-IHADCB(1),DCBOFOPN
BZ SYS&SYSNDX
PUT (1),&REC
SYS&SYSNDX EQU *
MEND
* --------------------------------------------------
* THIS MSG NEEDS TO BE EXPANDED INLINE BECAUSE IT'S
* MODIFIED IN AT LEAST ONE USE.
*
* --------------------------------------------------
MACRO
&L ER3 &B,&N,&STR
&L REVB &B,SYS&SYSNDX
STM R14,R6,ERR01RGS
BAL R15,ERR01
DC H'&N',AL2(L'SYS&SYSNDX.C-1)
SYS&SYSNDX.C DC C&STR
AIF ('&B' EQ '').Z
SYS&SYSNDX DS 0H
.Z MEND
* --------------------------------------------------
MACRO
&L REVB &B,&TO
LCLC &C
AIF ('&B' EQ 'B').Y
AIF ('&B'(2,1) EQ 'N').N
&C SETC '&B'(2,3)
&L BN&C &TO
MEXIT
.N ANOP
&C SETC '&B'(3,3)
&L B&C &TO
MEXIT
.Y AIF ('&L' EQ '').Z
&L DS 0H
.Z MEND
* --------------------------------------------------
MACRO
&L PARMMSG2 &COND,&STR,&FIELD
LCLA &B
&B SETA K'&STR-3
&L REVB &COND,SYS&SYSNDX
LA R1,=C&STR
LA R15,&B
AIF ('&FIELD' EQ '').M
LA R0,&FIELD
AGO .BAL
.M SR R0,R0
.BAL BAL R14,PARMMSG
AIF ('&COND' EQ 'B').Z
SYS&SYSNDX DS 0H
.Z MEND
* --------------------------------------------------
* MACRO
* &L PARMMSG &COND,&STR,&FIELD
* LCLA &B
* &B SETA K'&STR-2
* &L REVB &COND,SYS&SYSNDX
* OI RC,16
* AIF ('&FIELD' EQ '').M
* MVC LINE(20),&FIELD
* MVC LINE+22(&B),=C&STR
* AGO .P
* .M MVC LINE(&B),=C&STR
* .P PUT SYSPRINT,LINE-1
* MVC LINE,LINE-1
* B GETSYSIN
* AIF ('&COND' EQ 'B' AND '&L' EQ '').Z
* SYS&SYSNDX DS 0H
* .Z MEND
* --------------------------------------------------
MACRO
&L MSG &STR
LCLA &B
&B SETA K'&STR-2
&L MVC LINE(&B),=C&STR
PUT SYSPRINT,LINE-1
MVC LINE(&B),LINE-1
MEND
* --------------------------------------------------
MACRO
&L QTIOT
&L L 1,16 16 -> THIS SHOULD BE THE CVT
L 1,0(1) PSATNEW LOC 536 (X218)
.* L 1,536 CURRENT TCB
L 1,0(1) CURRENT TCB
L 1,12(1) AND THE CURRENT TIOT
MEND
* --------------------------------------------------
*
BEVERLY START 0 PROGRAM TO COMPARE 2 FILES,
R0 EQU 0 EXCLUDING SPECIFIED RECORDS.
R1 EQU 1
R2 EQU 2
R3 EQU 3
R4 EQU 4
R5 EQU 5
R6 EQU 6
RETREG EQU 7 THIS CAN BE ANY UNUSED REG. I USED 9 AT FIRST.
* 7 MADE THE TRACE REG PRINT EASIER.
* BUT THAT'S EASILY CHANGE-ABLE.
*9 EQU 9 HAVEN'T USED 8+9 YET.
R13 EQU 13
R14 EQU 14
R15 EQU 15
*
USING *,13,12,11,10 YEAH, IT GOT STUPIDLY LONG.
B SAVE-BEVERLY(15)
DC 17F'0'
VER## DC C'BEVERLY, VER 01.16F ASSEMBLED &SYSDATE AT &SYSTIME, RUN'
RUN## DC X'4021204B20202040C1E34021207A202040' 7A2020'
DC C' PARM=DOC PRINTS DESCRIPTION'
VER##L EQU *-VER##
*
SAVE STM 14,12,12(13)
ST 13,4(15)
ST 15,8(13)
LA 13,0(15)
LA 9,4095
LA 12,1(9,13)
LA 11,1(9,12)
LA 10,1(9,11)
MVC SAVE(4),LINE
*
L R4,0(R1) SAVE PARM FIELD ADDR
LH R14,0(R4)
SH R14,=H'1'
BM *+14
MVC PARM(0),2(R4)
EX R14,*-6
*
TIME DEC THIS SECTION PUTS THE RUN
STM R0,R1,DW TIME + DATE INTO THE TITLE
ED RUN##(7),DW+5 LINE. I'LL PUT THE JOBNAME
ED RUN##+10(6),DW STEPNAME THERE TOO, WHEN I
MVI RUN##+L'RUN##-1,C' ' REMEMBER HOW TO DO THAT.
*
QTIOT
MVC LINE+46(8),0(R1) THIS SECTION PUTS THE JOBNAME,
MVC LINE+56(8),16(R1) STEPNAME, PROCSTEPNAME ON THE
MVC LINE+66(8),08(R1) REPORT. MAKES TESTING EASIER.
MVI LINE+75,C'='
MVC LINE+76(32),LINE+75 AND, OF COURSE, THE SEPARATOR LINE.
*
L R14,=A(TRTTBL-C' ') HERE WE TAKE THE SPACES OUT
LA R1,LINE+66 OF JOBNAME, STEPNAME, ETC.
TRT LINE+67(9),0(R14) (AND ADD SPACE IF THEY'RE 8 BYTES.)
MVC 1(09,R1),LINE+75 MAKES IT LOOK PRETTY.
LA R1,LINE+56 BUT EASIER TO READ AS WELL.
TRT LINE+56(9),0(R14)
MVC 1(19,R1),LINE+66 THIS GETS PRINTED AS PART OF THE
LA R1,LINE+47 SYSPRINT OPEN MESSAGE,
TRT LINE+46(9),0(R14) WHEN WE OPEN THE FILE.
MVC 1(29,R1),LINE+56
*
LA R2,SYSPRINT
MVI OPENFLAG,C'O'
BAL RETREG,OPEN
* OPEN (SYSPRINT,OUTPUT)
MVC LINE(VER##L),VER##
PUT SYSPRINT,LINE-1
MVC LINE,LINE-1
*
CLI PARM,C' '
BE NOPARM
PUT SYSPRINT,PARM-8
*
NOPARM MVC LINE(166),LINE-1
LA R2,SYSIN
MVI OPENFLAG,C'I'
BAL RETREG,OPEN
CLC =C'DOC',PARM
BNE SKIPDOC
*
MXE EQU (ENDDOC-DOC-80)/80 THIS SECTION CALCULATES THE
LA R0,MXE MAXIMUM NUMBER OF EXCLUDE=
L R1,=A(DOC#EXCL) RECORDS THAT WILL FIT INTO
CVD R0,DW THE DOCUMENTATION SECTION.
OI DW+7,X'0F' WE USE THAT AS OUR TABLES,
UNPK 0(3,R1),DW+6(2) FOR EXCLUDE, SKIPA= + SKIPB=
*
BAL RETREG,PRINTDO
MVC PARM,PARM+3
*
SKIPDOC CLC =C'TRACE',PARM+1
BNE *+8
MVI FLAGTRAC,C'T'
CLC =C'TRACE',PARM
BNE *+8
MVI FLAGTRAC,C'T'
*
NOPRT TRACE
MVI DOC,X'FF' INDICATE THERE ARE NO EXCLUDE= RECS
CLI PARM,C' '
BE NOMORPAR
CLI PARM,C';'
BE NORMDLM
CLI PARM,C'A'
BL NEWDLM
MVC LINE,LINE-1
MSG 'PARM='';KEY;.... ";" MISSING FROM BEGINNING OF PARM, NO
ORMAL ";" DELIMITER USED.'
B NORMDLM
* ---------------------------------------------------------------------
* HERE, WE REPLACE ALL THE CLI INSTRUCTIONS THAT SCAN FOR THE
* PARM DELIMITER.
*
* ---------------------------------------------------------------------
NEWDLM TRACE
MVC CLIDLM1+1(1),PARM
MVC CLIDLM2+1(1),PARM
MVC NDLMMSG+36(1),PARM
PUT SYSPRINT,NDLMMSG
*
NORMDLM TRACE
CLI PARM,C' '
BE NOMORPAR
CLIDLM1 CLI PARM,C';'
BE PARMQ08
MVC PARM,PARM-1
PARMQ08 LA R0,99
LA R1,PARM
PARMQ10 TRACE
LA R1,1(R1)
CLIDLM2 CLI 0(R1),C';'
BE PARMQ15
CLC 0(33,R1),LINE
BE PARMQ15
BCT R0,PARMQ10
PARMMSG2 B,'STRING ENDING DELIM NOT FOUND',PARM
PARMQ15 TRACE
LR R14,R1
S R14,=A(PARM+2)
MVC CARD,CARD-1
MVC CARD(0),PARM+1
EX R14,*-6
MVC PARM,0(R1)
LA R1,CARD
B GOTSYSIN
*
PRINTDO TRACE
L R2,=A(DOC)
MVC 0(19,R2),VER##
PRINTDOC MVC LINE(64),0(R2) FIRST PRINT PROGRAM DESCRIPTION
PUT SYSPRINT,LINE-1
LA R2,64(R2)
C R2,=A(ENDDOC-60)
BL PRINTDOC
MVC LINE,LINE-1
BR RETREG
*
PARAMTBL DC A(7,FLAGEXCL,0,0,0),CL8'LISTEXCL'
LPARAM EQU *-PARAMTBL
DC A(7,FLAGBYTE,0,0,0),CL8'LISTBYTE'
DC A(6,FLAGLIST,0,0,0),CL8'LISTERR'
DC A(6,FLAGHEX,0,0,0),CL8'LISTHEX'
DC A(7,FLAGNAME,0,0,0),CL8'LISTNAME'
DC A(4,FLAGTRAC,0,0,0),CL8'TRACE'
DC A(5,FLAGTABL,0,0,0),CL8'TABLES'
DC A(5,0,MAXIN,0,0),CL8'MAXIN='
DC A(6,0,MAXERR,0,0),CL8'MAXERR='
DC A(7,0,0,OFFSETAB,0),CL8'OFFSETA='
DC A(7,0,0,OFFSETAB+4,0),CL8'OFFSETB='
DC A(7,0,0,LISTLEN,0),CL8'LISTLEN='
DC A(3,0,0,0,KEY),CL8'KEY='
DC A(6,KEYSEQCK,0,0,0),CL8'KEYSEQCK'
DC A(7,0,0,0,COMPCC),CL8'COMPARE='
DC A(7,0,0,0,PARMEX),CL8'EXCLUDE='
DC A(2,0,0,0,PARMEX),CL8'EX='
DC A(3,0,0,0,PARMSKIP),CL8'SKIP'
DC X'FF'
*
PARAMCLC CLC CARD(0),20(R14)
GETPARAM TRACE
LA R14,PARAMTBL
CLC =C'PRINT',CARD
BNE PARAMLOP
MVC CARD,CARD+1
MVC CARD(4),=C'LIST'
*
PARAMLOP TRACE
L R15,0(R14)
EX R15,PARAMCLC
BE PARAMYES
LA R14,LPARAM(R14)
CLI 0(R14),0
BE PARAMLOP
PARMMSG2 B,'INVALID KEYWORD',CARD
*
PARAMYES TRACE
LM R1,R5,0(R14)
LTR R5,R5
BNZR R5
*
LTR R2,R2 DO WE HAVE TO SET FLAG
BZ PARAM# NO.
MVC 0(1,R2),CARD YES, SET IT
LA R14,CARD+1(R15)
CLI 0(R14),C'='
BNE PARAME
MVC 0(1,R2),1(R14)
CLI 2(R14),C' '
LA R14,2(R14)
PARAME CLI 0(R14),C' '
BE GETSYSIN
PARMMSG2 B,'INVALID SYNTAX ON SYSIN CARD',0(R14)
*
PARAM# LA R14,CARD
CLI 0(R14),C'='
LA R14,1(R14)
BH *-8
PARMMSG2 BNE,'INVALID NUMERIC SYNTAX FOR PARAM=123',0(R14)
BAL RETREG,GETNUM
LTR R3,R3
BNZ PARAMPAK
PARAMBIN LTR R4,R4
PARMMSG2 BZ,'LOGIC ERROR IN PARAM TABLE, TYPE NOT FOUND',0(R14)
CVB R0,DW
ST R0,0(R4)
B GETSYSIN
PARAMPAK ZAP 0(8,R3),DW
LTR R4,R4
BNZ PARAMBIN
B GETSYSIN
*
PACK DW,0(0,R14)
GETNUM TRACE
CLI 0(R14),C'0' R14 POINTS TO A #.
PARMMSG2 BL,'FIELD NOT NUMERIC',0(R14)
LR R15,R14
LA R15,1(R15) R14 TO THE NEXT NUMBER,
CLI 0(R15),C'0'
BNL *-8
CLI 0(R15),C' '
BE GETNUM4
CLI 0(R15),C','
PARMMSG2 BNE,'END OF # NOT FOLLOWED BY COMMA OR BLANK',0(R15)
GETNUM4 ST R15,12(13)
SR R15,R14
BCTR R15,0
EX R15,GETNUM-6
L R14,12(13)
LA R14,1(R14) POINT TO NEXT #
BR RETREG
*
KEY LA R14,CARD+4
LA R1,$$KEYLOC
B COMPCC1
*
COMPCC TRACE
LA R14,CARD+8 ,8(R1)
LA R1,$$COMPAR
*
COMPCC1 TRACE
BAL RETREG,GETNUM
CVB R0,DW
SH R0,=H'1'
PARMMSG2 BM,'NUMERIC FIELD LENGTH CANNOT BE 0',0(R14)
ST R0,0(R1)
BAL RETREG,GETNUM
CVB R0,DW
SH R0,=H'1'
PARMMSG2 BM,'KEY LENGTH CANNOT BE 0. CODE 99999 FOR REST OF RECORD'
ST R0,4(R1)
LA R1,8(R1)
MVI 0(R1),X'FF'
CLI 0(R14),C'0'
BNL COMPCC1
CLI 0(R14),C' '
BE GETSYSIN
PARMMSG2 B,'INVALID COMPARE= REQUEST.',0(R14)
*
GETSYSIN TRACE
CLI PARM,C' ' ARE WE GETTING STUFF FROM PARM=
BNE NORMDLM
NOMORPAR TRACE
TM DCBOFLGS-IHADCB+SYSIN,DCBOFOPN
BZ NOSYSIN
*
MVC CARD,CARD-1
GET SYSIN NEXT LOOK AT SYSIN CONTROL CARDS.
MVC CARD,0(R1)
GOTSYSIN TRACE
PUT SYSPRINT,CARD-1
CLI CARD,C'*'
BE GETSYSIN
CLC CARD(4),LINE
BE GETSYSIN
LA R1,CARD
*
BAL RETREG,GETPARAM
EX 0,*
*
PARMEX TRACE
CLI $$ASKIP,X'FF'
BNE PARMEX0
CLI $$BSKIP,X'FF'
PARMEX0 PARMMSG2 BNE,'ALL EX= RECORDS MUST PRECEED SKIP RECS'
*
LA R14,CARD+8
CLC =C'EXCLUDE=',CARD EXCLUDE REQUEST?
BE PARMEX2
LA R14,CARD+3
CLC =C'EX=',CARD
BE PARMEX2
EX 0,*
*
PARMEX2 TRACE
MVC CARD,0(R14)
LA R14,CARD
L R2,$$EXCLUD+4 EX=LOC,LEN,#,TEXT
CLI $$EXCLUD+4,0 Q. FIRST TIME?
BE PARMEX3 NO, OKAY
L R2,$$DOCADR YES, START AT BEG OF DOC
ST R2,$$EXCLUD
*
PARMEX3 TRACE
LA RETREG,80(R2)
C RETREG,=A(ENDDOC-160)
PARMMSG2 BNL,'TOO MANY EXCLUDE= REQUESTS'
MVI 0(RETREG),X'FF'
ST RETREG,$$EXCLUD+4
ST RETREG,$$DOCADR YES, START AT BEG OF DOC
XC 0(80,R2),0(R2)
SR R3,R3
BAL RETREG,GETNUM
CVB R0,DW GET # RECORDS TO SKIP
SH R0,=H'1' CALC LOCION OFFSET
PARMMSG2 BM,'EX= LOC= CANNOT BE 0',0(R14)
ST R0,0(R2)
PARMEX4 TRACE
*
CLC =C'C''',0(R14)
BE EXCLCHAR
CLC =C'X''',0(R14)
BE EXCLCHAR
CLC =C'C"',0(R14)
BE EXCLCHAR
CLC =C'X"',0(R14)
BE EXCLCHAR
*
PARMEXR TRACE
BAL RETREG,GETNUM GOT LOC, GET LENGTH
CVB R0,DW
SH R0,=H'1' CALC LOC-1
PARMMSG2 BM,'EX= LENGTH CANNOT BE 0',0(R14)
ST R0,4(R2)
*
BAL RETREG,GETNUM GET # RECORDS TO DROP
CVB R0,DW
SH R0,=H'1' CANNOT DROP 0 RECORDS.
PARMMSG2 BM,'EX= DROP# CANNOT BE 0',0(R14)
ST R0,8(R2)
*
MVC 12(70,R2),0(R14)
EXCDONE TRACE
* L R14,$$EXCLUD+4
* C R14,=A(ENDDOC-80)
* PARMMSG2 BNL,'TOO MANY EXCLUDE= REQUESTS'
* MVI 0(R14),X'FF'
* XC 0(12,R14),0(R14)
B GETSYSIN
*
EXCLCHAR TRACE
LA R15,1(R14)
LA R0,70
EXCLCH01 LA R15,1(R15)
CLC 0(1,R15),1(R14)
BE EXCLCH03
BCT R0,EXCLCH01
PARMMSG2 B,'EXCLUDE CHAR STRING TOO LONG',0(R14)
*
EXCLCH03 TRACE
LR R5,R15
LR R1,R15
SR R15,R14
SH R15,=H'3' C'ABC'
PARMMSG2 BM,'LOGIC ERR, STRING LENGTH 0',0(R14)
CLI 0(R14),C'X'
BE EXCLCH20
MVC 12(0,R2),2(R14)
EX R15,*-6
ST R15,4(R2)
*
EXCLCH05 TRACE
CLI 1(R5),C' '
BE EXCDONE
CLC =C',DROP=',1(R5)
PARMMSG2 BNE,'ONLY DROP= CAN FOLLOW EX=(#,C"???"),DROP=#',0(R1)
LA R14,7(R5)
BAL RETREG,GETNUM
CVB R0,DW
SH R0,=H'1'
PARMMSG2 BM,'DROP=## FIELD CANNOT BE 0',0(R1)
ST R0,8(R2)
B EXCDONE
* ---------------------------------------------------------------------
* THIS SECTION CONVERTS EX=#,X'C1C2C3' TO CHATACTER FORMAT.
* FIRST CHECK TO SEE THAT IT REALLY IS ALL HEX.
* THEN MAKE EACH CHAR A HEX DIGIT.
* FINALLY, PACK 1 PAIR OF HEX DIGITS AT A TIME.
*
* ---------------------------------------------------------------------
TRT 2(0,R14),TESTHEX
TR 2(0,R14),CONVHEX
*
EXCLCH20 TRACE
LR R0,R15
N R0,=F'1'
PARMMSG2 BZ,'HEX STRING MUST BE EVEN # OF CHARS',0(R14)
EX R15,EXCLCH20-12
PARMMSG2 BNZ,'HEX STRING CONTAINS NON HEX CHARS',0(R14)
EX R15,EXCLCH20-6
LA R15,1(R15)
SRL R15,1
LR R0,R15
BCTR R0,0
ST R0,4(R2)
LA R1,12(R2)
EXCLCH25 TRACE
PACK 0(2,R1),2(3,R14)
LA R1,1(R1)
LA R14,2(R14)
BCT R15,EXCLCH25
B EXCLCH05
* --------------------------------------------------------------------
* THIS SECTION SETS UP THE SKIP TABLE.
* YOU CAN SKIP SPECIFIC RECORDS, BY RECORD # IN THE FILE.
* YOU'D DO THIS IF YOU KNEW THAT A SPECIFIC RECORD CAUSED A PROBLEM
* WITH THE COMPARE.
*
* THE RECORDS TO SKIP ARE KEPT AS 8 BYTE PACKED DECIMAL NUMBERS.
* THERE ARE BEGINNING AND ENDING ADDRESSES FOR BOTH TABLES.
* THE TABLES ARE KEPT OVERLAYING THE DOCUMENTATION, AT THE END,
* WHICH HAS ALREADY BEEN PRINTED.
*
* THE DOC CONTAINS SKIPA=/SKIPB= ENTRIES.
* AND THE EXCLUDE= TABLE ENTRIES.
* CONTROL CARD ORDER MUST BE:
* SKIPA= THEN SKIPB= THEN EXCLUDE= IN THAT ORDER.
*
* --------------------------------------------------------------------
*
$$ASKIP DC 2F'-1'
$$BSKIP DC 2F'-1'
*
PARMSKIP LA R14,CARD+6
*
LA R3,$$ASKIP
CLC CARD+4(2),=C'A='
BE PARMSKIA
LA R3,$$BSKIP
CLC CARD+4(2),=C'B='
BE PARMSKIB
PARMMSG2 B,'SKIPA=/SKIPB= SYNTAX ERROR',CARD
*
PARMSKIA CLI $$BSKIP,X'FF'
PARMMSG2 BNE,'CANNOT CODE SKIPA= AFTER SKIPB='
PARMSKIB L R4,4(R3)
CLI 0(R3),0
BE PARMSKI#
L R4,$$DOCADR
LA R4,4(R4)
ST R4,0(R3)
PARMSKI# BAL RETREG,GETNUM
MVC 0(8,R4),DW
LR R1,R4
LA R4,8(R4)
ST R4,4(R3)
ST R4,$$DOCADR
C R1,0(R3)
BE PARMSKIE
SH R1,=H'8'
CLC 0(8,R1),DW
PARMMSG2 BNL,'SKIP@= REC #S MUST BE IN SEQUENCE'
PARMSKIE MVI 0(R4),X'FF'
C R4,=A(ENDDOC-9)
PARMMSG2 BNL,'TOO MANY EXCLUDE + SKIP RECORDS, TBL OVERFLOW'
CLI 0(R14),C' '
BE GETSYSIN
CLI 0(R14),C'0'
BNL PARMSKI#
PARMMSG2 B,'SYNTAX ERROR ON SKIPA/B= REQ, CAN ONLY HAVE RECORDX
NUMBERS',0(R14)
*
* --------------------------------------------------------------------
* THIS SECTION DOES ALL THE FILE OPENS, BOTH INPUT AND OUTPUT.
* IT LISTS DDNAMES THAT ARE NOT FOUND.
* AND IT STORES DCB ADDRESSES FOR THE OPEN-EXIT TO USE.
*
* --------------------------------------------------------------------
USING IHADCB,2
OPEN TRACE
MVC LINE(8),DCBDDNAM
DEVTYPE LINE,DW+8 CHECK FOR DDNAME
LTR R15,R15 Q. IS THE FILE THERE?
BZ OPENOPEN
MVC LINE+9(9),=C'NOT FOUND'
PUT SYSPRINT,LINE-1
MVC LINE,LINE-1
LA R15,12
BR RETREG NO, JUST RETURN.
OPENOPEN TRACE
CLI OPENFLAG,C'I' YES, OPEN AND LIST STUFF.
BE OPENIN
CLI OPENFLAG,C'O' YES, OPEN AND LIST STUFF.
BE OPENOUT
* MSG 'LOGIC ERR, OPENFLAG NOT I/O'
EX 0,*
*
OPENOUT TRACE
STM R2,R3,EXITSAVE YES, OPEN AND LIST STUFF.
OPEN ((2),OUTPUT) YES, OPEN AND LIST STUFF.
B OPENPRT
OPENIN TRACE
*
C R2,=A(SYSIN) SYSIN?
BE OPEN2 YES, SKIP IT.
ST R2,RDJFCB+4
OI RDJFCB+4,X'80'
RDJFCB RDJFCB (2)
*
OPEN2 OPEN ((2),INPUT) YES, OPEN AND LIST STUFF.
* --------------------------------------------------------------------
* THIS SECTION PRINTS LRECL, BLKSIZE AND RECFM OF FILES,
* AND THE DSNAME OF THE INPUT FILES.
* RDJFCB GETS THE JFCB THAT CONTAINS NAME AND MEMBER NAME.
*
* --------------------------------------------------------------------
OPENPRT TRACE
MVC LINE+9(34),=C'RECFM=. LRECL=##### BLKSIZE=#####'
LH R0,DCBLRECL
CVD R0,DW
OI DW+7,X'0F'
UNPK LINE+25(5),DW+5(3)
*
LH R0,DCBBLKSI
CVD R0,DW
OI DW+7,X'0F'
UNPK LINE+39(5),DW+5(3)
*
TM DCBRECFM,X'80'
BNO *+8
MVI LINE+15,C'F'
TM DCBRECFM,X'40'
BNO *+8
MVI LINE+15,C'V'
TM DCBRECFM,X'10'
BNO *+8
MVI LINE+16,C'B'
*
TM DCBRECFM,X'04'
BNO *+8
MVI LINE+17,C'A'
TM DCBRECFM,X'02'
BNO *+8
MVI LINE+17,C'M'
*
CLI OPENFLAG,C'I' INPUT FILE?
BNE OPEN9 NO, SKIP IT.
C R2,=A(SYSIN) SYSIN?
BE OPEN9 YES, SKIP IT.
* NO, SHOW FILEA/FILEB DSNAME.
MVC LINE+46(4),=C'DSN=' NO, SHOW FILEA/FILEB DSNAME.
MVC LINE+50(44),JFCB NO, SHOW FILEA/FILEB DSNAME.
CLI JFCB+44,C' ' IS THERE A MEMBER NAME?
BNH OPEN9 NO, GO PRINT.
LA R1,LINE+52 YES, SCAN TO FIND END OF DSN
LA R1,1(R1) AND ADD (MEMBER )
CLI 0(R1),C' '
BNE *-8
MVI 0(R1),C'('
MVC 1(8,R1),JFCB+44
LA R1,1(R1) AND ADD (MEMBER )
CLI 0(R1),C' '
BNE *-8
MVI 0(R1),C')'
*
OPEN9 PUT SYSPRINT,LINE-1
MVC LINE,LINE-1
SR R15,R15
BR RETREG
DROP 2
* --------------------------------------------------------------------
* THE OPENEXIT COPIES LRECL, BLKSIZE + RECFM FROM INPUT TO OUTPUT
* FILES. (A -->A AND B-->B)
* THAT WAY THE USER DOESN'T HAVE TO SPECIFY THEM, AND THEY'RE RIGHT.
*
* IF RECFM=0, THEN WE COPY. IF NOT, WE DON'T.
* ON ENTRY TO THE EXIT ROUTINE, HALF WAY THROUGH OPEN, WE DO
* THE CHECK + COPY.
*
* --------------------------------------------------------------------
PUSH USING
DROP 13,12,11,10
EXLST DC 0F'0',X'85',AL3(OPENEXIT)
USING *,15 I'VE DONE THIS FROM ANCIENT MEMORY
OPENEXIT STM R1,R2,EXITSAVE+8 IT'S BEEN DECADES SINCE I THOUGHT
LM R1,R2,EXITSAVE ABOUT THIS CODE.
XC EXITSAVE(8),EXITSAVE
LTR R2,R2
BZ OPENXR
*
CLI DCBRECFM-IHADCB(R1),0
BNE OPENXR
MVC DCBRECFM-IHADCB(1,R1),DCBRECFM-IHADCB(R2)
MVC DCBLRECL-IHADCB(2,R1),DCBLRECL-IHADCB(R2)
MVC DCBBLKSI-IHADCB(2,R1),DCBBLKSI-IHADCB(R2)
OPENXR LM R1,R2,EXITSAVE+8
SR R15,R15
BR R14
DROP 15
EXITSAVE DC 4F'0'
POP USING
*
EODSYSIN CLOSE SYSIN
* --------------------------------------------------------------------
* DONE WITH CONTROL CARDS. OPEN //FILEA AND FILEB.
* THEN TRY TO OPEN THE VARIOUS ERROR OUTPUT FILES.
*
* BUT FIRST MAKE SURE THAT FLAGS ARE CONSISTENT.
* IF WE'RE GOING TO LISTHEX, THEN WE NEED TO LIST.
*
* MAX ERROR REPORT LIST LENGTH =120.
* IF THEY SPECIFIED MORE THAN THAT, CHANGE IT.
*
* --------------------------------------------------------------------
NOSYSIN TRACE
BAL RETREG,TRACE2
CLI RC,0 Q. ERRORS ON CONTROL CARDS?
BNE GOODEND YES, JUST EXIT.
LA R0,120
C R0,LISTLEN
BNL *+8
ST R0,LISTLEN
CLI LISTLEN+3,40
BH *+8
MVI LISTLEN+3,40
CLI FLAGHEX,C' '
BE *+8
MVI FLAGLIST,C'L'
*
CLI FLAGBYTE,C' '
BE *+8
MVI FLAGLIST,C'L'
* --------------------------------------------------------------------
* THE TRACE2 ROUTINE DUMPS THE VARIOUS TABLES THAT ARE USED.
* THIS IS HANDY IN TESTING, IN CASE THERE IS A PROBLEM.
* WAS IT SETTING UP THE TABLES, OR PROCESSING THE TABLES?
* THAT'S A GOOD THING TO KNOW.
*
* --------------------------------------------------------------------
MVI OPENFLAG,C'I'
*
LA R2,FILEA
BAL RETREG,OPEN
LA R2,FILEB
BAL RETREG,OPEN
*
SR R14,R14
SR R1,R1
TM DCBOFLGS-IHADCB+FILEA,DCBOFOPN
ER3 BNO,11,'//FILEA DDNAME MISSING'
TM DCBOFLGS-IHADCB+FILEB,DCBOFOPN
ER3 BNO,12,'//FILEB DDNAME MISSING'
*
MVI OPENFLAG,C'O'
LA R4,NOTA-8
OPENLOP LM R2,R3,0(R4)
STM R2,R3,EXITSAVE
MVC DW+16,DCBDDNAM-IHADCB(R2)
BAL RETREG,OPEN
* --------------------------------------------------------------------
* IN THIS SECTION, WE'LL PRINT DDNAME AS THE FIRST RECORD OF ERROR
* OUTPUT FILES. THIS IS USED IN TESTING TO SEE WHAT WE'RE LOOKING
* AT.
* --------------------------------------------------------------------
CLI FLAGNAME,C' ' PRINT HEADER?
BE OPENLOQ NO.
TM DCBOFLGS-IHADCB(R2),DCBOFOPN Q. FILE OPEN?
BZ OPENLOQ NO, SKIP
MVC LINE(8),DW+16 SAVE DDNAME
MVC LINE+9(6),=C'FILE -' AND SET UP SEPARATOR
MVC LINE+15(45),LINE+14
LA R14,LINE-1
TM DCBRECFM-IHADCB(R2),X'80' RECFM=F/B
BO PUTSEPAR YES, GO WRITE.
*
LA R14,LINE-8 POINT TO VB LLBB
MVI 1(R14),65 INDICATE LENG
LH R1,DCBLRECL-IHADCB(R2) LOAD LRECL
CH R1,0(R14) IS LRECL SHORT?
BNL *+8 NO, JUST WRITE.
STH R1,0(R14) YES, USE SHORTER LENGTH.
PUTSEPAR PUT (2),(14)
MVC LINE(66),LINE-1
*
OPENLOQ LA R4,NOTB-NOTA(R4)
CLI 0(R4),X'FF'
BNE OPENLOP
*
TM DCBOFLGS-IHADCB+NOTAB,DCBOFOPN
BZ BEGIN
*
CLC DCBRECFM-IHADCB+FILEA,DCBRECFM-IHADCB+FILEB
BE BEGIN
ER3 B,14,'//NOTAB CANNOT BE USED IF RECFM OF FILEA+FILEB DO NOT MATCH'
*
TESTCLC CLC 0(0,R14),12(R2) TEST FOR EXCLUDED RECORDS.
TEST TRACE
L R2,$$EXCLUD THIS RTN TESTS FOR EXCLUDED
TESTLOOP TRACE
CLI 0(R2),X'FF' RECORDS. LOAD OFFSET TO DATA
BE 4(RETREG) AND LENGTH OF DATA-1,
LM R14,R15,0(R2) AND COMPARE TO SAVED STRING.
CLI 0(R2),0
BE 4(RETREG)
CLI 4(R2),0
BE 4(RETREG)
LA R14,0(R1,R14) RETURN AT +4 IF NOT FOUND.
EX R15,TESTCLC RETURN AT +0 IF WE MATCH.
BER RETREG
LA R2,80(R2)
B TESTLOOP
*
CNTMAT TRACE
AP #MATCH,=P'1'
MVC COMPSAVE(32),COMPSAVE-4
B GETA
GETAEXCL TRACE
AP #DROPA,=P'1'
LM R14,R15,DROPA-8
PUTOPEN 0(R15),0(R14)
CLI FLAGEXCL,C' '
BE GETAEXC2
MVC LINE(08),=C'EXCL A ='
MVC LINE+8(0),0(R3)
EX R14,*-6
PUT SYSPRINT,LINE-1
MVC LINE,LINE-1
*
GETAEXC2 TRACE
CLI 11(R2),1
BNH GETA
L R3,8(R2)
BCTR R3,0 SUBT 1
GETAEXC3 TRACE
GET FILEA
AP #DROPA,=P'1'
AP #READA,=P'1'
LA R14,0(R1)
PUTOPEN DROPA,0(14)
BCT R3,GETAEXC3
B GETA
*
BEGIN TRACE
* ------------------------------------------------------------------
* THIS SECTION OF CODE SETS UP AN AREA TO SAVE RECORD KEYS.
* IT'S USED TO SEE IF THE KEYS IN FILEA AND FILEB ARE
* OUT OF SEQUENCE.
* ------------------------------------------------------------------
*
CLI $$KEYLOC,X'FF' Q. WAS KEY SPECIFIED?
BE BEGIN10 NO, DON'T BOTHER.
CLI KEYSEQCK,C'N' Q. WAS KEY SPECIFIED?
BE BEGIN10 NO, DON'T BOTHER.
LA R1,$$KEYLOC
LA R2,SAVE
ST R2,KEYSEQA
*
BEGIN05 LM R14,R15,0(R1)
STM R14,R15,0(R2)
XC 8(0,R2),8(R2)
EX R15,*-6
LA R1,8(R1)
LA R2,9(R2,R15)
CLI 0(R1),0
BE BEGIN05
*
ST R2,KEYSEQA+4
MVI 0(R2),X'FF'
LA R2,4(R2)
MVC 0(256,R2),SAVE
ST R2,KEYSEQB
A R2,KEYSEQA+4
S R2,KEYSEQA
ST R2,KEYSEQB+4
BEGIN10 DS 0H
*
* XC OLDABKEY,OLDABKEY
* MVC OLDABKEY+256,OLDABKEY
GETA TRACE
CLI NOTFILAB,C'N' Q. WAS THERE A KEY SEQ NO MATCH
MVI NOTFILAB,0
BE GETB YES, ONLY READ 'B' FILE.
GET FILEA
ST R1,AB
AP #READA,=P'1'
SP MAXIN,=P'1'
BZ GOODEND
*
CLI $$ASKIP,X'FF'
BE GETANSKP
MVC DW,#READA
LA R2,$$ASKIP
BAL RETREG,QSKIP
LTR R15,R15
BZ GETANSKP
LR R14,R1
PUTOPEN SKIPA,0(R14)
AP #SKIPA,=P'1'
B GETA
GETANSKP TRACE
*
ST R1,FILEA-8
ST R1,NOTA-8
ST R1,NOTAB-8
A R1,OFFSETAB
LA R3,0(R1) SAVE REC ADDR
BAL RETREG,TEST GO TEST FOR EXCLUDED HEADER/FOOTER/???
B GETAEXCL
B GETB
*
GETBEXCL TRACE
AP #DROPB,=P'1'
LM R14,R15,DROPB-8
PUTOPEN DROPB,0(R14)
CLI FLAGEXCL,C' '
BE GETBEXC2
MVC LINE(08),=C'EXCL B ='
MVC LINE+8(0),0(R4)
EX R14,*-6
PUT SYSPRINT,LINE-1
MVC LINE,LINE-1
*
GETBEXC2 TRACE
CLI 11(R2),1
BNH GETB
L R3,8(R2)
BCTR R3,0 SUBT 1
GETBEXC3 TRACE
GET FILEB
LA R4,0(R1)
AP #DROPB,=P'1'
AP #READB,=P'1'
LA R14,0(R1)
PUTOPEN DROPB,0(14)
BCT R3,GETBEXC3
*
GETB TRACE
CLI NOTFILAB+1,C'N' Q. WAS THERE A KEY SEQ NO MATCH
MVI NOTFILAB+1,0
BE GETBGOOD YES, DON'T READ 'B' FILE.
GET FILEB
ST R1,AB+4
AP #READB,=P'1'
SP MAXIN,=P'1'
BZ GOODEND
*
CLI $$BSKIP,X'FF'
BE GETBNSKP
MVC DW,#READB
LA R2,$$BSKIP
BAL RETREG,QSKIP
LTR R15,R15
BNZ GETBNSKP
LR R14,R1
PUTOPEN SKIPB,0(R14)
AP #SKIPB,=P'1'
B GETB
*
GETBNSKP TRACE
*
ST R1,FILEB-8
ST R1,NOTB-8
A R1,OFFSETAB+4
LA R4,0(R1)
* ST R4,AB+12
BAL RETREG,TEST
B GETBEXCL
B GETBGOOD
*
QSKIP TRACE
CLI 0(R2),X'FF'
BE QSKIP12
LM R14,R15,0(R2)
QSKIP10 CLI 0(R14),X'FF'
BE QSKIP12
CP DW,0(8,R14)
BNE QSKIP14
QSKIP12 SR R15,R15
BR RETREG
QSKIP14 BLR RETREG
LA R14,8(R14)
ST R14,0(R2)
CR R14,R15
BL QSKIP10
MVI 0(R2),X'FF'
B QSKIP12
*
GETBGOOD TRACE
STM R3,R4,DW+8
*
L R3,FILEA-8
L R4,FILEB-8
*
LH R1,DCBLRECL-IHADCB+FILEA GOT 2 RECORDS, LOAD LENGTH
LH R2,DCBLRECL-IHADCB+FILEB
*
TM DCBRECFM-IHADCB+FILEA,X'80'
BO ADDR12
LH R1,0(R3)
SH R1,=H'4'
LA R3,4(R3)
ADDR12 A R3,OFFSETAB
S R1,OFFSETAB
*
TM DCBRECFM-IHADCB+FILEB,X'80'
BO ADDR14
LH R2,0(R4)
SH R2,=H'4'
LA R4,4(R4)
ADDR14 TRACE
A R4,OFFSETAB+4
S R2,OFFSETAB+4
*
CR R2,R1 WE ONLY WANT TO COMPARE THE
BNH *+6 SHORTER OF THE 2 RECORDS.
LR R2,R1
STM R2,R4,AB+8
LTR R2,R2
BP *+8
EX 0,*
*
* ------------------------------------------------------------------
* THIS SECTION OF CODE COMPARES THE CURRENT RECORD KEYS TO
* THE PRIOR RECORD KEYS. AT THE SAME TIME, IT STORES THE
* CURRENT RECORD KEYS, TO USE NEXT TIME.
* IF THE KEYS ARE OUT OF SEQUENCE, THAT'S AN ERROR.
* ------------------------------------------------------------------
CLI $$KEYLOC,X'FF' Q. WAS KEY SPECIFIED?
BE QKEYSEQZ
*
QKEYSEQK TRACE
LR R5,R3
L R6,KEYSEQA
MVI QKEYSEQM+16,C'A'
BAL RETREG,QKEYSEQL
*
LR R5,R4
L R6,KEYSEQB
MVI QKEYSEQM+16,C'B'
BAL RETREG,QKEYSEQL
B QKEYSEQZ
*
QKEYSEQL TRACE
LM R14,R15,0(R6)
LA R1,0(R14,R5)
EX R15,QKEYSEQC
QKEYSEQM ER3 BNH,04,'* FILE RECORD KEY OUT OF SEQUENCE.'
EX R15,QKEYSEQC+6
LA R6,9(R6,R15)
CLI 0(R6),0
BE QKEYSEQL
BR RETREG
*
KEYSEQA DC 2F'-1'
KEYSEQB DC 2F'-1'
QKEYSEQC CLC 8(0,R6),0(R1)
MVC 8(0,R6),0(R1)
KEYSEQCK DC C' '
*
QKEYSEQZ TRACE
* ------------------------------------------------------------------
* CLI $$KEYLOC,X'FF' KEY= SPECIFIED?
* BE NOKEY NO
* CLI KEYSEQCK,C'N' SKIP SEQ CHECK SPECIFIED?
* BE NOKEY YES, NO IDEA WHY, BUT DON'T CHECK.
* *
* LM R0,R1,$$KEYLOC LOAD OFFSET/LENGTH -1
* LR R14,R3
* AR R14,R0
* EX R15,CLCAKEY IS OLD KEY HIGHER THAN NEW?
* ER3 BH,02,'FILEA KEYS OUT OF SEQUENCE'
* EX R15,MVCAKEY
* *
* * LM R0,R1,$$KEYLOC
* LR R14,R4
* AR R14,R0
* EX R15,CLCBKEY
* ER3 BH,03,'FILEB KEYS OUT OF SEQUENCE'
* EX R15,MVCBKEY
* *
* B NOKEY
* CLCAKEY CLC OLDABKEY(0),0(R14)
* MVCAKEY MVC OLDABKEY(0),0(R14)
* CLCBKEY CLC OLDABKEY+256(0),0(R14)
* MVCBKEY MVC OLDABKEY+256(0),0(R14)
*
* NOKEY DS 0H
*
*
ST R3,COMPCLCL
ST R2,COMPCLCL+4
ST R4,COMPCLCL+8
ST R2,COMPCLCL+12
*
SH R2,=H'1'
BP *+8
EX 0,*
*
CH R2,=H'255' AND NOT MORE THAN 255 BYTES.
BL *+8
LA R2,255
*
CLI $$COMPAR,0
BNE EXCOMP
XC COMPCLCL(16),COMPCLCL
LA R1,$$COMPAR
COMP10 TRACE
ST R1,$$COMPAR-4 SAVE LOC IN $$COMPAR LIST
*
LM R14,R15,0(R1) LOAD LOC/LEN
LA R15,R15
BM COMP15 IF LENGTH=0, COMPARE REST OF REC
*--
LA R0,1(R14,R15) CALC TOT LEN
CR R0,R2
BNH COMP30
* OH CRAP, REC SHORT, CALC LEN
COMP15 TRACE
LR R15,R2
SR R15,R14
*
COMP30 TRACE
LA R1,0(R14,R4)
LA R14,0(R14,R3)
EX R15,COMPCLC
BNE NOTAMAT
L R1,$$COMPAR-4
LA R1,8(R1)
CLI 0(R1),0
BE COMP10
B CNTMAT
*
COMPCLCL DC 4F'0',4F'0'
NOTMATMG DC C'RECORD 123,456,789,012,345 OF FILEA DOES NOT MATCH RECX
ORD 123,456,789,012,345 OF FILEB'
*
DC F'0'
COMPSAVE DC 8F'0'
*
COMPCLC CLC 0(0,R14),0(R1)
COMP CLC 0(0,R3),0(R4) TEST FOR RECORS THAT MATCH.
*
EXCOMP LM R14,R1,COMPCLCL
STM R14,R1,COMPCLCL+16
EXCOMPT TRACE
LTR R15,R15
BZ EXCOMPC
XC COMPCLCL(16),COMPCLCL
CLCL R14,R0
B EXCOMPCC
*
EXCOMPC TRACE
ST R3,COMPCLCL+16
ST R4,COMPCLCL+24
LA R0,1(R2)
ST R0,COMPCLCL+20
ST R0,COMPCLCL+28
*--
EX R2,COMP
*
EXCOMPCC BE CNTMAT MATCH, GO READ. NO, PRINT BOTH
STM R2,R4,COMPSAVE+16
*--
NOTAMAT TRACE
* ----------------------------------------------------------------
* WHEN THERE IS A MIS-MATCH, CHECK TO SEE IF KEYS MATCH,
* AND IF NOT, ONLY READ THE FILE WITH THE LOWER KEY.
* ----------------------------------------------------------------
CHKKEY CLI $$KEYLOC,0
BNE KEYOK
XC NOTFILAB,NOTFILAB INDICATE NOT TO SKIP A READ
LA R1,$$KEYLOC-8
CHKKEYL LA R1,8(R1)
CLI 0(R1),0 Q. END OF KEY TABLE?
BNE KEYOK YES, KEYS MATCH.
*
LM R14,R15,0(R1) LOAD OFFSET + LENG-1
LA R5,0(R3,R14) POINT TO KEY
LA R6,0(R4,R14)
EX R15,KEYCLC DO THE COMARE
BE CHKKEYL EQUAL, TRY NEXT KEY
BL FILEALOW
BH FILEBLOW
EX 0,*
KEYCLC CLC 0(0,R5),0(R6)
NOTFILAB DC XL2'0000'
*
FILEBLOW LR R5,R4
MVI NOTFILAB,C'N' IF FILEB LOW, SKIP "A" READ.
MVC LINE(L'ED15),ED15
EDMK LINE(L'ED15),#READA
MVC LINE(08),=C'B RECORD'
B FILEAL2
*
FILEALOW LR R5,R3
MVI NOTFILAB+1,C'N' IF FILEA LOW, SKIP "B" READ
MVC LINE(L'ED15),ED15
EDMK LINE(L'ED15),#READA
MVC LINE(08),=C'A RECORD'
*
FILEAL2 MVC LINE+2+L'ED15(23),=C'RECORD KEY LOW, SKIPPED'
MVC LINE+10(60),0(R1)
PUT SYSPRINT,LINE-1
MVC LINE,LINE-1
ZAP DW,=P'1'
*
FILEAL5 LR R6,R2
BAL RETREG,LLPR01
S R2,LISTLEN
BP FILEAL5
B GETA
KEYOK DS 0H
*
NOTAMAT1 AP #NOTMAT,=P'1'
*
STM R3,R4,AB+24
LM R3,R4,AB
PUTOPEN NOTA,0(R3)
PUTOPEN NOTB,0(R4)
*
TM DCBOFLGS-IHADCB+NOTAB,DCBOFOPN
BZ NOTAMAT9
LR R14,R3
LR R15,R4
LA R0,9
TM DCBRECFM-IHADCB+NOTAB,X'80'
BO NOTAMAT5
LA R14,4(R14)
LA R15,4(R15)
XC DW,DW
*
NOTAMAT5 CLC 0(1,R14),0(R15)
BE NOTAMAT6
BCT R0,NOTAMAT5
B NOTAMAT8
NOTAMAT6 STM R14,R15,DW
MVC DW+8(1),0(R14)
MVC DW+9(1),0(R15)
MVI 0(R14),C'A'
MVI 0(R15),C'B'
NOTAMAT8 PUT NOTAB,(R3)
PUT NOTAB,(R4)
LM R14,R15,DW
LTR R14,R14
BZ NOTAMAT9
MVC 0(1,R14),DW+8
MVC 0(1,R15),DW+9
*
NOTAMAT9 LM R3,R4,AB+24
OI RC,4
*
MVC LINE(L'NOTMATMG),NOTMATMG
MVC LINE+6(L'ED15),ED15
MVC LINE+57(L'ED15),ED15
LA R1,LINE+57+L'ED15-3
EDMK LINE+57(L'ED15),#READB
MVC LINE+59(40),0(R1)
LA R1,LINE+6+L'ED15-3
EDMK LINE+6(L'ED15),#READA
MVC LINE+8(80),0(R1)
*
* MVC NOTMATMG+4(L'ED15),ED15
* ED NOTMATMG+4(L'ED15),#READA
* MVC NOTMATMG+52(L'ED15),ED15
* ED NOTMATMG+52(L'ED15),#READB
*
* OI #READA+7,X'0F'
* UNPK NOTMATMG+05(15),#READA
* OI #READB+7,X'0F'
* UNPK NOTMATMG+49(15),#READB
*
PUT SYSPRINT,LINE-1
MVC LINE,LINE-1
CLI LISTLEN+3,0
BNE LONGLIST
CLI FLAGHEX,C' '
BNE PRINTHEX
CLI FLAGLIST,C' '
BE NLISTER
*
* GOT A MISS-MATCH, PRINT BOTH RECS.
MVC LINE,LINE-1 CLEAR
MVI LINE,C'A' INDICATE FILE
MVC LINE+2(0),0(R3) MOVE RECORD TO PRINT AREA
EX R2,*-6
BAL RETREG,PUTPRT GO PRINT IT
MVC LINE(256),LINE-1
MVI LINE,C'B'
MVC LINE+2(0),0(R4)
EX R2,*-6
BAL RETREG,PUTPRT
*
CLI FLAGBYTE,C' '
BE NLISTER
EX R2,NOMATXC
EX R2,NOMATTR
BAL RETREG,PUTPRT
B NLISTER
*
DC 3F'0'
PRINTHEX TRACE
STM R2,R4,PRINTHEX-12
ZAP LISTLOC,=P'1'
NOP PRTHEX05
OI *-3,X'F0'
L R1,LISTLEN
LA R0,120
CR R1,R0
BL *+10
LR R1,R0
ST R1,LISTLEN
CVD R1,DW
ZAP LISTLOC+3,DW
*
PRTHEX05 TRACE
MVC LINE(2),=C'A='
LR R14,R3
LR R15,R2
BAL RETREG,PRTHEX20
*
ZAP DW,LISTLOC
NC DW,=X'0000000000000FFF'
CVB R15,DW
LA R15,SEPLINE+132(R15)
L R14,LISTLEN
BCTR R14,0
MVC SEPLINE+9(0),0(R15)
EX R14,*-6
PUT SYSPRINT,SEPLINE
*
PUT SYSPRINT,SEPLINE
MVC LINE(2),=C'B='
LR R14,R4
LR R15,R2
BAL RETREG,PRTHEX20
CLI FLAGBYTE,C' '
BE NLISTER
*
EX R2,PRTHEXMV
EX R2,PRTHEXNC
EX R2,PRTHEXTR
LA R14,SAVE+4
LR R15,R2
BAL RETREG,PRTHEX20
B NLISTER
*
PRTHEXMV MVC SAVE(0),0(R3)
PRTHEXNC NC SAVE(0),0(R4)
PRTHEXTR TR SAVE(0),NOMATTBL
PRTHEXED DC X'402021202020'
*
DC 4F'0'
PRTHEX20 TRACE
ZAP LISTLOC,=P'1'
PRTHEX21 STM R14,R15,PRTHEX20-16
PRTHEX22 TRACE
MVC LINE+2(6),PRTHEXED
ED LINE+2(6),LISTLOC
AP LISTLOC,LISTLOC+3
L R15,PRINTHEX-12
C R15,LISTLEN
BL *+8
L R15,LISTLEN
BCTR R15,0
STM R14,R15,PRTHEX20-8
EX R15,PRTHEXM
PUT SYSPRINT,LINE-1
CLI FLAGHEX,C'N'
BE PRTHEX28
MVC LINE(2),LINE-1
LM R14,R15,PRTHEX20-8
EX R15,PRTHEXT1
PUT SYSPRINT,LINE-1
MVC LINE,LINE-1
LM R14,R15,PRTHEX20-8
EX R15,PRTHEXM
EX R15,PRTHEXT2
PUT SYSPRINT,LINE-1
PRTHEX28 MVC LINE,LINE-1
LM R14,R15,PRTHEX20-16
S R15,LISTLEN
BMR RETREG
A R14,LISTLEN
AP LISTLOC,LISTLOC+3
B PRTHEX21
SEPLINE DC CL133' '
ORG SEPLINE+8
SEPTEXT DC 2C'----+---10----+---20----+---30----+---40----+---50---X
-+---60----+---70----+---80----+---90----+----0'
ORG
*
PRTHEXM MVC LINE+9(0),0(R14)
PRTHEXT1 TR LINE+9(0),PRTHEXHI
PRTHEXT2 TR LINE+9(0),PRTHEXLO
PRTHEXHI DC 16C'0',16C'1',16C'2',16C'3',16C'4',16C'5',16C'6',16C'7'
DC 16C'8',16C'9',16C'A',16C'B',16C'C',16C'D',16C'E',16C'F'
PRTHEXLO DC 16C'0123456789ABCDEF'
*
GETRECAD TRACE
LM R2,R3,AB
LH R4,DCBLRECL-IHADCB+FILEA
LH R5,DCBLRECL-IHADCB+FILEB
*
TM DCBRECFM-IHADCB+FILEA,X'80'
BO *+12
LA R2,4(R2)
SH R4,=H'4'
*
TM DCBRECFM-IHADCB+FILEB,X'80'
BO *+12
LA R3,4(R3)
SH R5,=H'4'
*
A R2,OFFSETAB
A R3,OFFSETAB+4
S R4,OFFSETAB
S R5,OFFSETAB+4
*
LR R6,R4
CR R6,R5
BL *+6
LR R6,R5
C R6,LISTLEN
BL *+8
L R6,LISTLEN
*
BR RETREG
*
LLT1 TR LINE+9(0),TRUNPRT
LLM1 MVC LINE+9(0),0(R5)
LLPRINT TRACE
OI DW+7,X'0F'
UNPK LINE+2(5),DW+5(3)
LLPR01 C R6,LISTLEN
BL *+8
L R6,LISTLEN
*
SH R6,=H'1'
BM LLPR90
EX R6,LLM1
CLI FLAGHEX,C' '
BE LLPR90
*
LLPR05 MVC LINE+133,LINE
EX R6,LLT1
PUT SYSPRINT,LINE-1
MVC LINE,LINE+133
EX R6,PRTHEXT1
PUT SYSPRINT,LINE-1
MVC LINE,LINE+133
EX R6,PRTHEXT2
MVC LINE+133,LINE+132
LLPR90 PUT SYSPRINT,LINE-1
MVC LINE,LINE-1
BR RETREG
*
LONGLIST TRACE
L R6,LISTLEN
CVD R6,DW+16
ZAP DW,=P'1'
* BAL RETREG,GETRECAD
LM R2,R4,AB+8
*
LL2 LR R5,R3
LR R6,R2
MVI LINE,C'A'
BAL RETREG,LLPRINT
*
MVC DW+8,DW
NC DW+8,=X'0000000000000FFF'
CVB R1,DW+8
LA R1,SEPTEXT-1(R1)
MVC LINE+9(0),0(R1)
EX R6,*-6
PUT SYSPRINT,LINE-1
MVC LINE,LINE-1
*
LR R5,R4
LR R6,R2
MVI LINE,C'B'
BAL RETREG,LLPR01
CLI FLAGBYTE,C' '
BE LL6
*
EX R6,LL12MV
EX R6,LL12NC
EX R6,LL12TR
PUT SYSPRINT,LINE-1
MVC LINE,LINE-1
*
LL6 AP DW,DW+16
A R3,LISTLEN
A R4,LISTLEN
S R2,LISTLEN
LTR R2,R2
BP LL2
B NLISTER
*
LL12MV MVC LINE+9(0),0(R3)
LL12NC XC LINE+9(0),0(R4)
LL12TR TR LINE+9(0),NOMATTBL
*
NLISTER TRACE
MVC LINE(256),LINE-1
PUT SYSPRINT,LINE-1 LEAVE A BLANK LINE
AP #NOTMAT,=P'1'
SP MAXERR,=P'1' Q. MAX ERRORS TO PRINT?
BZ GOODEND
B GETA NO, GO READ MORE.
* L R0,COMPSAVE
* LTR R0,R0
* BZ GETA
* --- COMPARE PRIOR RECORDS
*
* BNZ GETA NO, GO READ MORE.
* B GOODEND YES, EXIT.
*
NOMATXC XC LINE+2(0),0(R3)
NOMATTR TR LINE+2(0),NOMATTBL
* NOMATTBL DC C' ',255C'+'
LISTLEN DC F'100'
LISTLOC DC PL3'1',PL3'120'
FLAGEXCL DC C' '
FLAGTRAC DC C' '
FLAGTABL DC C' '
FLAGNAME DC C' '
OPENFLAG DC C'I'
OPENERR DC C' '
FLAGBYTE DC 2C' '
FLAGLIST DC C' '
FLAGHEX DC 2C' '
AB DC 8F'0'
$$EXCLUD DC 2F'-1'
*
PUTPRT TRACE
PUT SYSPRINT,LINE-1
CH R2,=H'130'
BLR RETREG
MVC FLAGBYTE+1,LINE+132
MVI LINE+132,C' '
PUT SYSPRINT,LINE+132
MVC LINE+132(1),FLAGBYTE+1
BR RETREG
*
MVC LINE+6(0),0(R1)
PARMMSG TRACE
OI RC,16
EX R15,PARMMSG-6
LTR R1,R0
BZ PARMMSG2
LA R15,LINE+9(R15)
MVC 0(20,R15),0(R1)
TR 0(20,R15),TRUNPRT
*
PARMMSG2 LA R14,0(R14)
SR R14,R13
ST R14,DW
UNPK LINE(5),DW+2(3)
TR LINE(4),HEXTBL-240
MVI LINE+4,C' '
PUT SYSPRINT,LINE-1
MVC LINE,LINE-1
B GETSYSIN
*
TRACE TM DCBOFLGS-IHADCB+SYSPRINT,DCBOFOPN IF SYSPRINT NOT OPEN
BZ 8(R14) THEN JUST RETURN.
CLI FLAGTRAC,C'N'
BE 8(R14) THEN JUST RETURN.
ST R14,TRACSAVE-4
CLI TRACLINE+1,C' '
BE TRACE10
PUT SYSPRINT,TRACLINE
MVI TRACLINE+1,C' '
L R14,TRACSAVE-4
TRACE10 MVC TRACLINE+2(8),0(R14)
LA R14,TRACLINE+12
LA R15,TRACSAVE
LA R0,10
BAL R2,TRACUNPK
PUT SYSPRINT,TRACLINE
L R14,TRACSAVE-4
B 8(R14)
*
TRACUNPK UNPK 0(9,R14),0(5,R15)
TR 0(8,R14),HEXTBL-240
MVI 8(R14),C' '
LA R14,9(R14)
LA R15,4(R15)
BCT R0,TRACUNPK
BR R2
*
DC F'0'
TRACSAVE DC 12F'0'
TRACLINE DC CL132' LABEL R14 R15 R0 R1 R2X
R3 R4 R5 R6 RETREG'
* R3 R4 R5 R6 R7 R8 X
* R9'
DC C' '
*
DC F'0'
TRACE2 TRACE
CLI FLAGTRAC,C' '
BNE TRACE2A
CLI FLAGTABL,C' '
BER RETREG
TRACE2A ST RETREG,TRACE2-4
MVC TRACE2Z+1(1),FLAGHEX
MVI FLAGHEX,C'T'
MVC TRACE2Z+5(1),LISTLEN+3
MVI LISTLEN+3,80
MVC LINE,LINE-1
LA R4,TRACE2LI
MSG 'PRINT COMPARE, SORT KEY, SKIPA/B, AND EXCLUDE, TABLES'
TRACE2L L R5,0(R4)
LA R6,80
MVC LINE(24),4(R4)
PUT SYSPRINT,LINE-1
MVC LINE(24),LINE-1
CLI 4(R4),C' ' Q. IS THIS THE EXCLUDE TABLE
BE TRACE2EX YES, PRINT INDIVIDUAL ENTRIES
CLI 5(R4),C' ' Q. IS THIS A SKIPA/B= TABLE
BE TRACE2SK YES, FOLLOW POINTER.
BAL RETREG,LLPR01 OTHER TABLES ARE INLINE.
B TRACE2N
*
TRACE2SK LA R6,8
BAL RETREG,LLPR01
L R5,0(R5)
LA R6,80
BAL RETREG,LLPR01
B TRACE2N
*
TRACE2EX LA R6,8
BAL RETREG,LLPR01
LM R5,R6,0(R5)
CLI 0(R5),0
BNE TRACE2N
LR R3,R6
TRACE2M LA R6,80
BAL RETREG,LLPR01
LA R5,80(R5)
CR R5,R3
BL TRACE2M
*
TRACE2N LA R4,28(R4)
CLI 0(R4),0
BE TRACE2L
*
TRACE2Z MVI FLAGHEX,C'H' DON'T CHANGE THESE 2 INSTRUCTIONS,
MVI LISTLEN+3,80 THEY ARE MODIFIED ABOVE !!!!!!!
L RETREG,TRACE2-4
BR RETREG
*
TRACE2LI DC A($$COMPAR),CL24'COMPARE TABLE ADDRESSES'
DC A($$KEYLOC),CL24'SORT KEY= ENTRIES'
DC A($$ASKIP),CL24'A SKIP RECORD NUMBERS'
DC A($$BSKIP),CL24'B SKIP RECORD NUMBERS'
DC A($$EXCLUD),CL24' EXCLUDE REQUESTS'
DC X'FF'
*
*
HEXTBL DC C'0123456789ABCDEF'
ERR01RGS DC 9F'0'
*
MVC LINE+15(0),4(R15)
ERR01 TRACE
MVC LINE,LINE-1
LH R0,0(R15)
CVD R0,DW
OI DW+7,X'0F'
UNPK LINE+5(3),DW+6(2)
MVC LINE(6),=C'ERROR '
*
LA RETREG,0(R15)
SR RETREG,R13
ST RETREG,12(R13)
UNPK LINE+10(5),14(3,R13)
TR LINE+10(4),HEXTBL-240
MVI LINE+14,C' '
*
LH RETREG,2(R15)
EX RETREG,ERR01-6
LA RETREG,LINE+18(RETREG)
*
* MVC LINE+15(0),0(R3)
* EX R2,ERR01-6
* LA R2,LINE+18(R2)
*
LTR R14,R14
BNP *+10
MVC 0(20,RETREG),0(R14)
LTR R1,R1
BNP *+10
MVC 23(20,RETREG),0(R1)
*
* OI RC,4
* B ERRPUTP
*
* ERRPUT TRACE
* MVC LINE+38(80),0(R1)
ERRPUTP TRACE
PUT SYSPRINT,LINE-1
MVC LINE(140),LINE-1
*
PUT SYSPRINT,TRACLINE-1
LA R14,LINE+12
LA R15,ERR01RGS
LA R0,10
BAL R2,TRACUNPK
PUT SYSPRINT,LINE-1
MVC LINE,LINE-1
*
B BADEND
*
FLGEOD1 DC C' ',CL20'EXTRA RECS IN FILEA'
FLGEOD2 DC C' ',CL20'EXTRA RECS IN FILEB'
EOD1 TRACE
MVI FLGEOD1,C'E'
GET FILEB
BAL RETREG,TEST
B EOD1
*
EOD2 TRACE
MVI FLGEOD2,C'E'
CLI FLGEOD1,C'E'
BE GOODEND
LA R2,2
LA R3,FLGEOD1
EOD2M CLI 0(R3),C' '
BNE EOD2N
MVC LINE(20),1(R3)
PUT SYSPRINT,LINE-1
EOD2N LA R3,21(R3)
BCT R2,EOD2M
MVC LINE,LINE-1
*
EXTRECS PUT SYSPRINT,EXTRECSM
BADEND TRACE
OI RC,8
*
GOODEND TRACE
MVC LINE,LINE-1
MVC LINE(L'VER##-5),VER##
LH R0,RC-1
CVD R0,DW
OI DW+7,X'0F'
UNPK LINE+L'VER##+11(3),DW+6(2)
MVC LINE+L'VER##-2(14),=C'FINISHED. RC='
PUT SYSPRINT,LINE-1
MVC LINE,LINE-1
*
LA R2,MAXERR
*
ENDPRT TRACE
MVC LINE(L'ED15),ED15
ED LINE(L'ED15),0(R2)
MVC LINE+L'ED15+2(32),8(R2)
*
PUT SYSPRINT,LINE-1
LA R2,40(R2)
C R2,=A(MAXIN)
BL ENDPRT
MVC LINE,LINE-1
*
LA R3,DCBLIST
L R2,0(R3)
EXCLOSE TRACE
TM DCBOFLGS-IHADCB(R2),DCBOFOPN
BZ NOTOPEN
C R2,=A(SYSPRINT)
BNE CLOSEIT
MVC LINE,LINE-1
LH R14,RC-1
CVD R14,DW
OI DW+7,X'0F'
MVC LINE(4),=C'RC ='
UNPK LINE+5(3),DW+6(2)
MVI LINE+10,C'='
MVC LINE+11(66),LINE+10
PUTOPEN SYSPRINT,LINE-1
CLOSEIT CLOSE ((2))
MVC LINE(8),DCBDDNAM-IHADCB(R2)
MVC LINE+9(6),=C'CLOSED'
PUTOPEN SYSPRINT,LINE-1
MVC LINE,LINE-1
*
NOTOPEN TRACE
LA R3,4(R3)
L R2,0(R3)
LTR R2,R2
BNZ EXCLOSE
*
LH R15,RC-1
L 13,4(13)
L 14,12(13)
LM 0,12,20(13)
BR 14
*
DCBLIST DC A(SYSIN,NOTA,NOTB,NOTAB,DROPA,DROPB)
DC A(SKIPA,SKIPB,FILEA,FILEB,SYSPRINT,0)
*
SYSIN DCB DDNAME=SYSIN,DSORG=PS,DEVD=DA,EODAD=EODSYSIN,MACRF=GL
DC 2A(SYSPRINT)
SYSPRINT DCB DDNAME=SYSPRINT,DSORG=PS,DEVD=DA,MACRF=PM, X
LRECL=133,BLKSIZE=3990,RECFM=FBA
PRINT NOGEN
DC 2A(FILEA)
FILEA DCB DDNAME=FILEA,DSORG=PS,DEVD=DA,EODAD=EOD1,MACRF=GL, X
EXLST=JFCBEXL
DC 2A(FILEB)
FILEB DCB DDNAME=FILEB,DSORG=PS,DEVD=DA,EODAD=EOD2,MACRF=GL, X
EXLST=JFCBEXL
DC A(NOTA,FILEA)
NOTA DCB DDNAME=NOTA,DSORG=PS,DEVD=DA,EXLST=EXLST,MACRF=PM
DC A(NOTB,FILEB)
NOTB DCB DDNAME=NOTB,DSORG=PS,DEVD=DA,EXLST=EXLST,MACRF=PM
DC A(NOTAB,FILEA)
NOTAB DCB DDNAME=NOTAB,DSORG=PS,DEVD=DA,EXLST=EXLST,MACRF=PM
DC A(DROPA,FILEA)
DROPA DCB DDNAME=DROPA,DSORG=PS,DEVD=DA,EXLST=EXLST,MACRF=PM
DC A(DROPB,FILEB)
DROPB DCB DDNAME=DROPB,DSORG=PS,DEVD=DA,EXLST=EXLST,MACRF=PM
DC A(SKIPA,FILEA)
SKIPA DCB DDNAME=SKIPA,DSORG=PS,DEVD=DA,EXLST=EXLST,MACRF=PM
DC A(SKIPB,FILEB)
SKIPB DCB DDNAME=SKIPB,DSORG=PS,DEVD=DA,EXLST=EXLST,MACRF=PM
DC F'-1'
*
*FCBEXL DC 0F'0',X'93',AL3(JFCB)
JFCBEXL DC 0F'0',X'87',AL3(JFCB)
*
*
$$DOCADR DC 2A(DOC)
DC F'0'
$$COMPAR DC 10F'-1'
$$KEYLOC DC 8F'-1',X'FF'
DC C' PARM = '
PARM DC CL100' ',CL2' '
CARD DC 2CL80' '
DC H'20,0',CL4' '
LINE DC 2CL132' '
*
ED15 DC X'402020206B2020206B2020206B2020206B212020'
*
DC H'0'
RC EQU *-1
DW DC 4D'0'
OFFSETAB DC 2A(0)
*
MAXERR DC PL8'9',CL32'MAXERR LIMIT REMAINING.'
#READA DC PL8'0',CL32'FILEA RECORDS READ.'
#READB DC PL8'0',CL32'FILEB RECORDS READ.'
#MATCH DC PL8'0',CL32' RECORD PAIRS MATCHED.'
#NOTMAT DC PL8'0',CL32' RECORDS NOT MATCHED.'
#DROPA DC PL8'0',CL32'FILEA RECORDS DROPPED/EXCLUDED.'
#DROPB DC PL8'0',CL32'FILEB RECORDS DROPPED/EXCLUDED.'
#SKIPA DC PL8'0',CL32'FILEA RECORDS SKIPPED'
#SKIPB DC PL8'0',CL32'FILEB RECORDS SKIPPED'
*
MAXIN DC PL8'0',CL32'REMAINING INPUT REC LIMIT'
DC X'FF'
LTORG
*
*
EXTRECSM DC CL133' THERE ARE EXTRA RECORDS IN ONE OF THE FILES.'
NDLMMSG DC CL133' ; IS THE INTENDED PARM DELIMITER. ";" BEING USED I
INSTEAD. THERE MUST BE NO OTHER OCCURRENCES OF IT.'
*
CONVHEX EQU *-193
DC AL1(10,11,12,13,14,15),CL58' '
ORG CONVHEX+C'0'
DC AL1(0,1,2,3,4,5,6,7,8,9)
ORG
*
TESTHEX EQU *-C'A'
DC XL6'00',CL58' '
ORG TESTHEX+C'0'
DC XL10'00'
ORG
DC CL4' '
JFCB DC 45C'JFCB'
TRUNPRT DC 64C' '
DC 192AL1(*-TRUNPRT)
NOMATTBL DC C' ',255C'+'
*
*
* WHEN YOU MODIFY DOC, THE LINES ALL CONTAIN 64 BYTES.
* WHEN YOU CODE ''DOC'' OR &&SYSNDX OR ANYTHING THAT MESSES
* WITH THE LENGTH, YOU HAVE TO CODE IT SPECIFICALY.
* IF YOU DON'T DO THAT, IT WON'T MESS UP THE PROGRAM,
* BUT THE DOC WILL READ REALLY FUNNY.
*
DOC DS 0F
DC CL64'BEVERLY, VER 01.00 ASSEMBLED &SYSDATE, AT &SYSTIME WAS '
DC C'WRITTEN TO COMPARE 2 FILES, EXCLUDING HEADERS, TRAILERS, ETC. '
DC C'AND POINTING OUT LOCATIONS WHERE RECORDS DID NOT MATCH. '
DC C' '
DC C'//COMPARE EXEC PGM=BEVERLY, '
DC CL64' PARM=''NODOC;LISTBYTE,EX=1,C"1",DROP=3;OFFSETB=1'' '
DC C' '
DC C' IE CONTROL CARDS IN PARM FIELD, SEPARATED BY ; '
DC C' WHICH MEANS THAT YOU CANNOT HAVE ";" IN ANY PARAM. '
DC C' OR, YOU CAN PROVIDE THE CONTROL CARDS IN //SYSIN '
DC C' '
DC CL64' PARM=''NODOC/LISTBYTE/EX=1,C"1",DROP=3/OFFSETB=1'' '
DC C' '
DC C' IF YOU SPECIFY NODOC, THEN WHATEVER COMES AFTER IT, IF IT IS '
DC C' NOT BLANK, AND IS NOT A VALID UPPERCASE CHAR, WILL BE USED TO '
DC C' DELIMIT PARAMETERS IN THE PARM FIELD. OF COURSE, THERE MUST '
DC C' BE NO OCCURRANCES OF IT OTHERWISE. '
DC C' '
DC C'//COMPARE EXEC PGM=BEVERLY '
DC C'//STEPLIB DD DISP=SHR,DSN= '
DC C'//SYSPRINT DD SYSOUT=* '
DC C'//FILEA DD DISP=SHR,DSN= '
DC C'//FILEB DD DISP=SHR,DSN= '
DC C'//* '
DC C'//NOTA DD DISP=(,CATLG),DSN= //FILEA RECORDS NOT MATCHED '
DC C'//NOTB DD DISP=(,CATLG),DSN= //FILEB RECORDS NOT MATCHED '
DC C'//NOTAB DD DISP=(,CATLG),DSN= RECORDS THAT DID NOT MATCH '
DC C'//DROPA DD DISP=(,CATLG),DSN= "A" RECORDS EXCLUDED '
DC C'//DROPB DD DISP=(,CATLG),DSN= "B" RECORDS EXCLUDED '
DC C'//SKIPA DD DISP=(,CATLG),DSN= "A" RECORDS SKIPA= '
DC C'//SKIPB DD DISP=(,CATLG),DSN= "B" RECORDS SKIPB= '
DC C'//SYSIN DD * '
DC C' '
DC C'//NOTA CONTAINS ALL OF THE FILEA RECORDS THAT DID NOT MATCH, '
DC C' INCLUDING THE EXCLUDED RECORDS. '
DC C'//NOTB CONTAINS ALL OF THE FILEB RECORDS THAT DID NOT MATCH, '
DC C' INCLUDING THE EXCLUDED RECORDS. '
DC C'//NOTAB CONTAINS THE RECORDS THAT FAILED THE COMPARE, FROM '
DC C' BOTH FILES, BUT NOT EXCLUDED RECORDS. THERE IS A "A" '
DC C' A "B" IN THE FIRST MATCHING BYTE OF THE APPROPRIATE '
DC C' RECORDS TO INDICATE WHAT ONE IS LOOKING AT. '
DC C' IF YOU BROWSE THE "AB" FILE, THEN YOU WILL SEE NON-MATCHING '
DC C' RECORDS, WITH THE "A" RECORD FOLLOWED BY THE "B" RECORD. '
DC C' IF THERE WERRE MATCHING BYTES EARLY IN THE RECORD, THERE '
DC C' BE AN INDICATION OF WHICH FILE THE RECORDS CAME FROM. '
DC C' IN ANY CASE, THE "A" RECORD WILL ALWAYS PRECEED THE "B" REC. '
DC C' '
DC C' THIS CONTAINS CONTROL CARD EXAMPLES. NOTE THAT CONTROL CARDS'
DC C' CAN BE CODED IN THE PARM FIELD. THE "NODOC" PARAMETER CAN '
DC C' ONLY BE CODED IN THE PARM FIELD, AND MUST BE FIRST. '
DC C' '
DC C' WHILE PROCESSING THE PARM FIELD, PARAMETERS ARE SEPARATED BY '
DC C' ";". TO INDICATE THAT, THE ";" MUST BE THE FIRST CHAR IN '
DC C' THE PARM FIELD, OTHER THAN NODOC. SO, A PARM MIGHT BE CODED '
DC C' '
DC CL64' PARM=''NODOC;EX=1,C''1'';LISTHEX;MAXERR=33'' '
DC C' THE FIRST SPECIAL CHAR AFTER NODOC, OR LEADING THE PARM WILL '
DC C' BE THE SEPARATER DELIMITER, SO THIS WOULD ALSO WORK. '
DC CL64' PARM=''NODOC/EX=1,C''1''/LISTHEX/MAXERR=33'' '
DC C' '
DC C' OKAY, NOW ON TO THE VARIOUS PARM/SYSIN OPTIONS..... '
DC C' '
DC C' EXCLUDE=LOC,LEN,#,DATA '
DC C' LOCATION OF STRING TO DROP/EXCLUDE '
DC C' LENGTH OF STRING TO DROP/EXCLUDE '
DC C' # OF RECORDS TO DROP (GENERALLY 1) '
DC C' DATA TO IDENTIFY RECORD TO DROP '
DC C' '
DC C' EXCLUDE= CAN BE ABBREVIATED TO EX= '
DC C' EX=1,12,24,CHARACTER STRING TO DROP '
DC C' '
DC C'EXCLUDE=1,1,5,1 EXCLUDE 5 LINES AT TOP OF PAGE '
DC C' EXCLUDE BLANK LINES THIS WAY ... '
DC C'EXCLUDE=1,88,1, '
DC C'EXCLUDE=8,27,2,THIS IS A SUBTITLE. '
DC C'EXCLUDE=07,06,02,FOOTER (LOCATION, LENGTH, TEXT ) '
DC C'EXCLUDE=121,6,2, PAGE '
DC C'EXCLUDE=121,6,2, PAGE DROP LINE WITH PAGE NUMBER AND '
DC C'EXCLUDE=121,6,2, PAGE ONE MORE. "PAGE" LOCATION VARIES '
DC C'EXCLUDE=121,6,2, PAGE DEPENDING ON LENGTH OF NUMBER. '
DC C' '
DC C'SKIPA=12,22,234,1023 SKIP THOSE RECORDS IN FILEA. '
DC C'SKIPB=4,22,3221 SKIP THOSE RECORDS IN FILEB. '
DC C' NOTE, EX= RECORDS MUST PRECEED '
DC C' SKIP RECORDS, AND SKIPA= MUST '
DC C' PRECEED SKIPB= RECORDS. '
DC C' '
DC C'EX=1,1,1,1 ABBREVIATED EXCLUDE= WORKS. '
DC C' '
DC C'EX=5,C"ABCD" ALTERNATE EXCLUDE= SYNTAX '
DC C'EX-11,X"C1C2C3C4" CAN SPECIFY HEX ALSO. '
DC C'EX=25,C"ABCD",DROP=4 DROPS THE NEXT 3 RECORDS TOO. '
DC C' YOU CAN USE EITHER SINGLE OR DOUBLE QUOTES'
DC C' '
DC C'COMPARE=3,50 COMPARES ONLY COLS 3 THRU 52 '
DC C'COMPARE=5,20,27,5 COMPARES COLS 5-24 AND 27-31 '
DC C'COMPARE=5,20,27,9999 COMPARES COLS 5-24 AND 27-END OF REC '
DC C'COMPARE=5,9999 WOULD WORK,NEVER COMPARES PAST END OF REC '
DC C' '
DC C'KEY=LOC,LEN IF THE FILE HAS ASCENDING KEYS, WE CAN '
DC C' USE THEM TO SEE IF THERE ARE MISSING '
DC C' RECORDS IN ONE OF THE FILES. '
DC C'KEYSEQCK=N BY DEFAULT, IF KEYS ARE SPECIFIED, THEN '
DC C' WE CHECK THAT THE KEYS IN EACH FILE ARE '
DC C' IN SEQUENCE. YOU CAN BYPASS THAT CHECK, '
DC C' BUT WHY WOULD YOU? '
DC C' '
DC C'KEY=1,6,14,8,8,4 YOU CAN HAVE UP TO 4 KEYS. '
DC C' '
DC C' NOTE THAT IT IS A NORMAL CHARACTER COMPARE'
DC C' WHICH WORKS WITH BINARY KEYS AND PACKED '
DC C' KEYS IF THEY ARE NOT NEGATIVE, AND PACKED '
DC C' KEYS HAVE SIMILAR SIGNS (EG: 123C OR 123F)'
DC C' '
DC C'MAXERR=123 (LIMIT ERROR LIST, DEFAULT MAXERR=9) '
DC C'MAXIN=333 (STOP AFTER READING 333 RECORDS FROM A+B)'
DC C'OFFSETA=1 (IF RECORDS IN FILEA OR FILEB) '
DC C'OFFSETB=1 (ARE SHIFTED RIGHT 1 BYTE) '
DC C'LISTERR PRINTS RECORDS THAT DO NOT MATCH '
DC C'LISTBYTE FLAGS WHICH BYTES DO NOT MATCH + '
DC C'LISTEXCL PRINTS RECORDS THAT WERE EXCLUDED. '
DC C'LISTHEX PRINTS HEX DATA FOR RECORDS. '
DC C'LISTHEX=N USES THE HEX ROUTINE,BUT DOES NOT PRT HEX'
DC C'LISTLEN NON-MATCH DATA LENGTH ON //SYSPRINT '
DC C'LISTNAME PUTS HEADER RECORDS IN EACH OF THE '
DC C' "REJECT" FILES, TO INDICATE WHICH FILE '
DC C' IT IS. THIS IS USED IN TESTING WHEN ALL '
DC C' THE FILES ARE WRITTEN TO SYSOUT=* '
DC C' '
DC C'TRACE IS USED IN TESTING TO SHOW WHERE THE '
DC C' PROGRAM IS EXECUTING, AND REGISTERS. '
DC C'TABLES IS USED IN TESTING TO SHOW THE CONTENTS '
DC C' OF 5 TABLES THAT ARE USED INTERNALLY. '
DC C' THIS TEST CODE IS PROBABLY REMOVED FROM '
DC C' THE PRODUCTION VERSION, BUT CAN EASILY BE '
DC C' BE PUT BACK IF DESIRED. '
DC C' '
DC C'/* '
DC C'IF THERE ARE MORE RECORDS (AFTER SKIP= AND EXCLUDE=) IN EITHER '
DC C'FILE, THAT IS REPORTED. '
DC C' '
DC C'IF THE RECORDS ARE OF UNEQUAL LENGTH, THE COMPARE ONLY TESTS '
DC C'THE SHORTER LENGTH. YOU CAN COMPARE EITHER FIXED OR VARIABLE '
DC C'LENGTH RECORDS, OR EVEN ONE OF EACH. '
DC C' '
DC C'IF THERE ARE HEADER, OR FOOTER RECORDS, YOU CAN EXCLUDE THEM, '
DC C'HOWEVER THE OFFSET TO THE IDENTIFIABLE STRING IS DONE RIGHT '
DC C'AFTER THE READ, SO THE OFFSET= DOES NOT APPLY YET, AND YOU HAVE '
DC C'TO ALLOW ROOM FOR THE LLBB OF VARIABLE LENGTH RECORDS. '
DC C' '
DC C'IF ONE FILE HAS CARRIAGE CONTROL RECORDS, AND THE OTHER DOES '
DC C'NOT, THEN YOU CAN OFFSETA= THE RECORDS IN THAT FILE. '
DC C'IF YOU HAVE ASA CARRIAGE CONTROL IN ONE FILE, AND MACHINE '
DC C'CARRIAGE CONTROL IN THE OTHER, THEN YOU CAN OFFSET BOTH FILES. '
DC C' '
DC C'THE DEFAULT IS MAXERR=9, AFTER WHICH THE PROGRAM WILL END. '
DC C'YOU CAN SPECIFY MAXERR=0 WHICH ELIMINATES THAT EFFECT. '
DC C' '
DC C'LISTEXCL LISTS RECORDS THAT ARE EXCLUDED, SO YOU CAN SEE IF THE'
DC C' REQUEST IS DOING WHAT YOU WOULD LIKE. '
DC C'LISTERR LISTS RECORDS THAT DO NOT MATCH, THE DEFAULT IS TO '
DC C' JUST PRINT RECORD NUMBERS FOR EACH FILE. '
DC C'LISTBYTE PUTS A + SIGN UNDER THE CHARACTERS THAT DID NOT '
DC C' COMPARE EQUAL, MAKING THE PROBLEM EASIER TO FIND. '
DC C'LISTHEX PRINTS THE HEX IN THE ERROR REPORT. '
DC C'LISTHEX=N USES THE LISTHEX ROUTINE, BUT DOES NOT PRINT THE HEX. '
DC C'LISTLEN WHEN REPORTING NON-MATCH RECORDS, THIS IS THE NUMBER '
DC C' OF BYTES TO PUT ON A REPORT LINE. IF YOU ARE GOING TO'
DC C' LOOK AT IT ON AN 80 BYTE WIDTH SCREEN, THEN YOU WANT '
DC C' THE //SYSPRINT FILE RECORD TO FIT IN THAT WIDTH. '
DC C' '
DC C'THE EXCLUDE= RECORDS ARE PROCESSED IN SEQUENCE. IN TESTING, '
DC C'THERE WERE MULTIPLE REPORTS IN A SINGLE FILE. IF YOU HAD ONE '
DC C'REPORT WITH 5 TITLE RECORDS, AND ALL THE OTHER REPORTS HAD 3 '
DC C'TITLE RECORDS, YOU COULD CODE THE 5-HEADER FILE FIRST, THEN '
DC C'THE OTHERS. NOTE, THIS IS NOT THE ORDER IN WHICH THEY APPEAR '
DC C'IN THE FILE, BUT THE ORDER OF UNIQUE-NESS. THE FILE WITH 5 '
DC C'HEADER RECORDS COULD BE LAST, BUT THE EXCLUDE= IS CODED FIRST '
DC C'SO THAT IT IS THE ONE THAT WE TEST FOR FIRST. '
DC C' '
DC C'EX=1,40,5,1 TITLE OF REPORT WITH 5 HEADER RECORDS '
DC C'EX=1,1,3,1 (THIS DOES ALL THE OTHER REPORTS) '
DC C' '
DC C' TYPICALLY, YOU ONLY EXCLUDE 1 RECORD, '
DC C' SO PRETTY MUCH ALL EXCLUDE CARDS WILL BE ... '
DC C'EX=LOC,LEN,#,DATA '
DC C' '
DC C'PARM=DOC IS USED TO PRINT THIS DOCUMENTATION. '
DC C' HOWEVER, DOC MUST BE FIRST IN THE PARM FIELD. '
DC C' '
DOC#EXCL EQU * SO I CAN FIX THE NEXT RECORD
DC C' IS THE MAXIMUM NUMBER OF EXCLUDE= RECORDS YOU CAN HAVE. '
DC C' '
DC C'ON TERMINATION, RC=0 MEANS A GOOD COMPARE. '
DC C'RC=4 MEANS THAT 1 OR MORE RECORDS DID NOT COMPARE EQUAL. '
DC C'RC=8 MEANS THAT THERE WAS A MORE SERIOUS PROBLEM, (MISSING RECS)'
DC C'RC=16 MEANS THAT THERE WAS AN ERROR PROCESSING CONTROL CARDS. '
DC C' '
DC C'WHEN RECORDS DO NOT MATCH, AND PARM=LISTBYTE IS SPECIFIED, '
DC C'THE REPORT LOOKS LIKE THIS, WITH A "+" SIGN UNDER THE BYTES '
DC C'THAT DO NOT MATCH. "A" AND "B" INDICATE THE FILE THAT THE '
DC C'RECORD WAS FOUND IN. 00001 IS THE BYTE NUMBER, IN THE RECORD. '
DC C'IF LISTHEX IS SPECIFIED, THEN THE HEX REPRESENTATION WILL BE '
DC C'PRINTED IN OVER/UNDER FORMAT. ONE MIGHT NOTE THAT IT IS EASIER '
DC C'TO USE WHEN YOU DO NOT HAVE A PROPORTIONAL FONT. '
DC C' '
DC C'RECORD 05 OF FILEA DOES NOT MATCH RECORD 05 OF FILEB '
DC C'A 00001 TEST DATA, TEST 4, RECORD 4 NO MATCH '
DC C' ----+---10----+---20----+---30----+---40----+---50 '
DC C'B TEST DATA, TEST 4, RECORD 4 '
DC C' ++ +++++ '
DC C' '
DC C'------------------ END OF DOCUMENTATION ------------------------'
ENDDOC DC X'FF'
DC 256X'00'
TRTTBL DC C' ',255X'00'
PRINT NOGEN
DCBD DEVD=DA,DSORG=PS
END BEVERLY