KEYCOMPR

Compare 2 files that have keys. You can compare only the keys, or, both keys and data. A couple days ago, I posted my version of a program named UTLPRINT. This is my version of a program named UTLCOMPR.
Again, email me, and I'll send you a good copy.


AGO .START


C:\USERS\LIN\DOCUMENTS\Z390CODE\KEYCOMPR


SET PA="1,11,A,12,10,A,22,33,A "

SET G=C:\USERS\LIN\DOCUMENTS\Z390CODE\KEYCOMPR

SET IN1=%G%.IN1.TXT

SET IN2=%G%.IN2.TXT

SET MATCH1=%G%.MATCH1.TXT

SET MATCH2=%G%.MATCH2.TXT

SET NMATCH1=%G%.NMATCH1.TXT

SET NMATCH2=%G%.NMATCH2.TXT

SET DATA1=%G%.DATA1.TXT

SET DATA2=%G%.DATA2.TXT

SET SYSPRINT=%G%.SYSPRINT.TXT

ASMLG %G%.MLC TIME(1) PARM(%PA%


.START ANOP

*

KEYCOMPR START 0

YREGS

USING *,13

DS 18F

ORG *-72

STM 14,12,12(13)

ST 13,4(15) C=(1,4,A,6,2,A,11,12,D)

ST 15,8(13)

LR 13,15

L R1,0(R1)

LH R2,0(R1)

SH R2,=H'1'

BM NOPARM

MVC PARM(0),2(R1)

EX R2,*-6

B GOTPARM

ORG

* ----------------------------------------------

PUSH PRINT

PRINT NOGEN

USING IHADCB,2

OPENCOPY LR R1,R2

MVI DCBRECFM,0

BAL R14,2(R12)

OPENOUT TM DCBOFLGS,DCBOFOPN

BOR R9

MVC OPENMSG(8),DCBDDNAM

MVC OPENMSG+51(6),=C'OUTPUT'

OPEN ((2),OUTPUT)

B OPENM

OPENIN TM DCBOFLGS,DCBOFOPN

BOR R9

MVC OPENMSG(8),DCBDDNAM

MVC OPENMSG+51(6),=C' INPUT'

OPEN ((2),INPUT)

POP PRINT

OPENM TM DCBOFLGS,DCBOFOPN

BZ OPENXX

MVC OPENMSG+45(4),=C'OPEN'

UNPK OPENMSG+15(3),DCBRECFM(2)

TR OPENMSG+15(2),HEX-240

MVI OPENMSG+17,C' '

LH R0,DCBLRECL

CVD R0,DW

OI DW+7,X'0F'

UNPK OPENMSG+24(5),DW+5(3)

LH R0,DCBBLKSI

CVD R0,DW

OI DW+7,X'0F'

UNPK OPENMSG+38(5),DW+5(3)

MVC LINE(L'OPENMSG),OPENMSG

PUT SYSPRINT,LINE-1

*

* CLC OPENMSG+51(6),=C'OUTPUT'

* BNE NOPUTL

* PUT (2),LINE

* NOPUTL DS 0H

MVC LINE,LINE-1

BR R9

OPENXX MVC LINE(8),OPENMSG

MVC LINE+9(12),=C'DID NOT OPEN'

PUT SYSPRINT,LINE-1

MVC LINE,LINE-1

BR R9

OPENMSG DC CL60'........ RECFM=.. LRECL=..... BLKSIZE=.....'

* ----------------------------------------------

DC F'0'

QPARM ST R9,QPARM-4

LA R2,SYSPRINT

BAL R9,OPENOUT

PUT SYSPRINT,PARM-1

LA R4,PARM

B QP10

QP5 MVC PARM,PARM+1

QP4 MVC PARM,PARM+4

QP10 CLC =C'TEST,',PARM

BNE NPTEST

MVI FLAGTEST,C'T'

B QP5

NPTEST CLC =C'ALL,',PARM

BNE NPALL

MVI FLAGALL,C'A'

B QP4

NPALL CLC =C'DOC,',PARM

BNE NPDOC

MVI FLAGDOC,C'D'

B QP4

NPDOC CLC =C'LIST,',PARM

BNE NPLIST

MVI FLAGLIST,C'L'

B QP5

NPLIST CLC =C'STOP=',PARM

BNE NPLISTE

LA R4,PARM+5

LA R2,16(R13)

BAL R14,GET#

* ZAP LIST#,DW

MVC LIST#,DW+2

MVC PARM,0(R4)

B QP10

LIST# DC P'99999999999'

*

NPLISTE LM R2,R3,=A(DOC,ENDDOC-4)

MVCDOC MVC LINE(L'DOC),0(R2)

PUT SYSPRINT,LINE-1

LA R2,L'DOC(R2)

CR R2,R3

BNL GETLOC

CLI FLAGDOC,C'D'

BE MVCDOC

* ----------------------------------------------

GETLOC LA R4,PARM

LA R2,DOC-4

GETLOCL MVC LINE(99),0(R4)

PUT SYSPRINT,LINE-1

BAL R14,GET#

BAL R14,GET#

CLI 0(R4),C'A'

BE MVCAD

CLI 0(R4),C'D'

BE MVCAD

BAL R14,R4ERR

MVCAD MVC 1(1,R2),0(R4) C=(2,11,A,44,3,D)

LA R4,2(R4)

MVI 4(R2),X'FF'

CLI 0(R4),C' '

BNE GETLOCL

L R9,QPARM-4

BR R9

* ----------------------------------------------

GET# CLI 0(R4),C'0'

BNL *+8

BAL R14,R4ERR

LR R15,R4

LA R15,1(R15)

CLI 0(R15),C'0'

BNL *-8

LA R0,1(R15)

SR R15,R4

BCTR R15,0

EX R15,GET#PACK

CVB R1,DW

LA R2,4(R2)

SH R1,=H'1'

BNM *+8

BAL R14,R4ERR

ST R1,0(R2)

LR R4,R0

BR R14

GET#PACK PACK DW,0(0,R4)

* ----------------------------------------------

NOPARM LA R2,SYSIN

BAL R9,OPENIN

GET SYSIN,PARM

GOTPARM BAL R9,QPARM

* ----------------------------------------------

OPEN LA R2,IN1

BAL R9,OPENIN

LA R2,IN2

BAL R9,OPENIN

*

LH R2,DCBLRECL-IHADCB+IN1

LH R3,DCBLRECL-IHADCB+IN2

LR R4,R2

CR R4,R3

BL *+6

LR R4,R3

BCTR R4,0

ST R4,COMPLEN

*

CR R2,R3

BH *+8

LR R2,R3

*

LA R2,256(R2)

LR R0,R2

MH R0,=H'3'

ST R0,LGETMAIN

GETMAIN R,LV=(0)

ST R1,AGETMAIN

AR R2,R1

ST R2,AGETMAIN+4

MVI 0(R1),C' '

MVC 1(255,R1),0(R1)

MVC 0(256,R2),0(R1)

* LA R1,17(R1)

* LA R2,17(R2)

* STM R1,R2,BUFFER

*

LA R12,OPENX+4

LA R2,MATCH1

BAL R9,OPENCOPY

LA R2,MATCH2

BAL R9,OPENCOPY

LA R2,NMATCH1

BAL R9,OPENCOPY

LA R2,NMATCH2

BAL R9,OPENCOPY

*

CLI FLAGALL,C'A'

BNE *+20

LA R2,DATA1

BAL R9,OPENCOPY

LA R2,DATA2

BAL R9,OPENCOPY

*

MVC LINE,LINE-1

PUT SYSPRINT,LINE-1

LM R2,R3,AGETMAIN

SR R10,R10

B GETBOTH

*

MAT SP LIST#,=P'1'

BNP END##

CLI FLAGALL,C'A'

BNE NOTDATA

LA R14,16(R2)

LA R15,16(R3)

LA R0,255

L R1,COMPLEN

CR R1,R0

BNH SHORT

*

COMPLONG CLC 0(256,R14),0(R15)

BNE NOTSAME

LA R14,255(R14)

LA R15,255(R15)

SR R1,R0

CR R1,R0

BH COMPLONG

B SHORT

NOTSAME BAL R10,ND1

BAL R10,ND2

SR R10,R10

B GETBOTH

CLC 0(0,R14),0(R15)

SHORT EX R1,SHORT-6

BNE NOTSAME

*

NOTDATA PUT MATCH1,16(2)

PUT MATCH2,16(3)

AP #MATCH,=P'1'

*

OI #IN1+4,X'0F'

OI #IN2+4,X'0F'

UNPK 1(5,R2),#IN1+2(3)

MVI 6(R2),C'/'

UNPK 7(5,R2),#IN2+2(3)

MVC 12(4,R2),=C' M= '

LR R14,R2

BAL R9,QLIST

*

GETBOTH BAL R9,GET1

BAL R9,GET2

CLI FLAGTEST,C'T'

BNE COMPARE

* ----------------------------------------------

LA R4,DCBS+8

LA R5,6

TESTLOOP L R1,0(R4)

PUT (1),(2)

L R1,0(R4)

PUT (1),(3)

LA R4,4(R4)

BCT R5,TESTLOOP

B GETBOTH

FLAGTEST DC C' '

* ----------------------------------------------

CLCA CLC 0(0,R4),0(R5)

CLCD CLC 0(0,R5),0(R4)

COMPARE L R8,=A(DOC)

COMPAREL LM R14,R15,0(R8)

LA R4,16(R2,R14)

LA R5,16(R3,R14)

*

LA R1,CLCA

CLI 5(R8),C'D'

BNE *+8

LA R1,CLCD

*

EX R15,0(R1)

BL NOM1

BH NOM2

LA R8,8(R8)

CLI 0(R8),0

BE COMPAREL

B MAT

* ----------------------------------------------

PREFIX DC CL16' '

ND2 LA R1,DATA2

MVC PREFIX+11(5),=C' D2= '

AP #D2,=P'1'

B N2PUT

NOM2 LA R1,NMATCH2

MVC PREFIX+11(5),=C' N2= '

AP #2N,=P'1'

N2PUT PUT (1),16(3)

*

OI #IN2+4,X'0F'

UNPK PREFIX+1(9),#IN2

MVC 0(16,R3),PREFIX

LR R14,R3

BAL R9,QLIST

*

BAL R9,GET2

LTR R10,R10

BZ COMPARE

BR R10

*

QLIST CLI FLAGLIST,C'L'

BNER R9

PUT SYSPRINT,(14)

SP LIST#,=P'1'

BPR R9

B END##

*

ND1 LA R1,DATA1

MVC PREFIX+11(5),=C' D1= '

AP #D1,=P'1'

B N1PUT

NOM1 LA R1,NMATCH1

MVC PREFIX+11(5),=C' N1= '

AP #1N,=P'1'

N1PUT PUT (1),16(2)

*

OI #IN1+4,X'0F'

UNPK PREFIX+1(9),#IN1

MVC 0(16,R2),PREFIX

LR R14,R2

BAL R9,QLIST

*

BAL R9,GET1

LTR R10,R10

BZ COMPARE

BR R10

* ----------------------------------------------

GET1 GET IN1,16(2)

AP #IN1,=P'1'

BR R9

GET2 GET IN2,16(3)

AP #IN2,=P'1'

BR R9

* ----------------------------------------------

USING IHADCB,2

CLOSEIT TM DCBOFLGS,DCBOFOPN

BZR R9

CLOSE ((2))

TM DCBOFLGS-IHADCB+SYSPRINT,DCBOFOPN

BZR R9

MVC LINE(8),DCBDDNAM

MVC LINE+9(6),=C'CLOSED'

PUT SYSPRINT,LINE-1

MVC LINE,LINE-1

BR R9

DROP 2

*

ZFLAG DC CL4' '

Z1 CLC ZFLAG,SPACES

BNE COUNTS

MVI ZFLAG+1,C'Z'

Z1GET BAL R9,GET2

BAL R10,NOM2

B Z1GET

*

Z2 CLC ZFLAG,SPACES

BNE COUNTS

MVI ZFLAG+2,C'Z'

Z2GET BAL R9,GET1

BAL R10,NOM1

B Z2GET

*

END##M DC C'ENDED DUE TO STOP=##'

END## MVC LINE(L'END##M),END##M

PUT SYSPRINT,LINE-1

COUNTS MVC LINE,LINE-1

LA R2,#IN1

CLI FLAGALL,C'A'

BNE CNTLOOP

LA R2,#D1

CNTLOOP MVC LINE(L'ED9),ED9

ED LINE(L'ED9),0(R2)

MVC LINE+L'ED9+2(32),5(R2)

PUT SYSPRINT,LINE-1

LA R2,#2N-#1N(R2)

CLI 0(R2),X'99'

BL CNTLOOP

MVC LINE,LINE-1

B Z

*

DCBS DC A(IN1,IN2,MATCH1,MATCH2,NMATCH1,NMATCH2,DATA1,DATA2)

DC A(SYSIN,SYSPRINT),X'FF'

Z LA R3,DCBS-4

LA R3,4(R3)

L R2,0(R3)

BAL R9,CLOSEIT

CLI 4(R3),0

BE Z+4

*

LM R0,R1,LGETMAIN

LTR R0,R0

BZ NOFREEM

FREEMAIN R,LV=(0),A=(1)

*

NOFREEM SR 15,15

IC 15,RC

L 13,4(13)

L 14,12(13)

LM 0,12,20(13)

BR 14

*

ZZ LA R4,=C'PARM/SYSIN'

BAL R14,R4ERR

R4ERR MVC ERRMSG+21(10),0(R4)

LA R14,0(R14)

SR R14,R13

ST R14,DW

UNPK ERRMSG+2(5),DW+2(3)

TR ERRMSG+2(4),HEX-240

MVI ERRMSG+6,C')'

PUT SYSPRINT,ERRMSG

MVI RC,12

LM R2,R3,=A(DOC+64,ENDDOC-4)

ERRDOC MVC LINE(64),0(R2)

PUT SYSPRINT,LINE

LA R2,64(R2)

CR R2,R3

BL ERRDOC

MVC LINE,LINE-1

B Z

ERRMSG DC CL133' (....) ERROR, DATA= '

*

LTORG

FLAGLIST DC C' '

FLAGDOC DC C' '

FLAGALL DC C' '

#D1 DC PL5'0',CL33'//IN1 KEYS MATCH, REC DIDN''T'

#D2 DC PL5'0',CL33'//IN2 KEYS MATCH, REC DIDN''T'

#IN1 DC PL5'0',CL33'//IN1 RECORDS READ '

#IN2 DC PL5'0',CL33'//IN2 RECORDS READ '

#1N DC PL5'0',CL33'//IN1 RECORD KEYS NOT MATCHED'

#2N DC PL5'0',CL33'//IN2 RECORD KEYS NOT MATCHED'

#MATCH DC PL5'0',CL33'//IN1, //IN2 KEYS MATCHED ',X'FF'

RC DC X'00'

HEX DC C'0123456789ABCDEF'

ED9 DC X'402020206B2020206B212020'

DW DC D'0'

COMPLEN DC F'0'

LGETMAIN DC F'0'

AGETMAIN DC 2F'0'

BUFFER DC 2F'0',C' '

PARM DC CL102' '

SPACES DC CL32' '

LINE DC CL133' '

* ----------------------------------------------

OPENX DC 0F'0',X'85',AL3(OPENX+4)

PUSH USING

DROP 13

USING *,12

LR 12,15

USING IHADCB,1

OPENXC CLI DCBRECFM,0

BNER R14

LA R8,IN1

C R1,=A(IN2)

BL *+8

LA R8,IN2

MVC DCBLRECL,DCBLRECL-IHADCB(R8)

MVC DCBBLKSI,DCBBLKSI-IHADCB(R8)

MVC DCBRECFM,DCBRECFM-IHADCB(R8)

BR R14

LTORG

* ----------------------------------------------

PUSH PRINT

PRINT NOGEN

DS 0D

SYSPRINT DCB DDNAME=SYSPRINT,DSORG=PS,MACRF=PM,LRECL=133,RECFM=FT

SYSIN DCB DDNAME=SYSIN,DSORG=PS,EODAD=ZZ,MACRF=GL,LRECL=133,RECFM=FT

IN1 DCB DDNAME=IN1,DSORG=PS,EODAD=Z1,MACRF=GM,LRECL=166,RECFM=FT

MATCH1 DCB DDNAME=MATCH1,DSORG=PS,MACRF=PM

NMATCH1 DCB DDNAME=NMATCH1,DSORG=PS,MACRF=PM

DATA1 DCB DDNAME=DATA1,DSORG=PS,MACRF=PM

IN2 DCB DDNAME=IN2,DSORG=PS,EODAD=Z2,MACRF=GM,LRECL=166,RECFM=FT

MATCH2 DCB DDNAME=MATCH2,DSORG=PS,MACRF=PM

NMATCH2 DCB DDNAME=NMATCH2,DSORG=PS,MACRF=PM

DATA2 DCB DDNAME=DATA2,DSORG=PS,MACRF=PM

POP PRINT

*

* SYSPRINT DS 0D

* DCB DEVD=DA,DDNAME=SYSPRINT,DSORG=PS,MACRF=PM,LRECL=133,RECFM=FB

* SYSIN DCB DEVD=DA,DDNAME=SYSIN,DSORG=PS,EODAD=ZZ,MACRF=GL

* IN1 DCB DEVD=DA,EXLST=OPENX.DDNAME=IN1,DSORG=PS,EODAD=Z1,MACRF=GM

* MATCH1 DCB DEVD=DA,EXLST=OPENX.DNAME=MATCH1,DSORG=PS,MACRF=PM

* DATA1 DCB DEVD=DA,EXLST=OPENX.DNAME=DATA1,DSORG=PS,MACRF=PM

* NMATCH1 DCB DEVD=DA,EXLST=OPENX.DDNAME=NMATCH1,DSORG=PS,MACRF=PM

* IN2 DCB DEVD=DA,EXLST=OPENX.DDNAME=IN2,DSORG=PS,EODAD=Z2,MACRF=GM

* MATCH2 DCB DEVD=DA,EXLST=OPENX.DDNAME=MATCH2,DSORG=PS,MACRF=PM

* DATA2 DCB DEVD=DA,EXLST=OPENX.DNAME=DATA2,DSORG=PS,MACRF=PM

* NMATCH2 DCB DEVD=DA,EXLST=OPENX.DDNAME=NMATCH2,DSORG=PS,MACRF=PM

*

* DCBD DEVD=DA

*

DOC DC CL64'KEYCOMPR V01.01 ASM &SYSDATE AT &SYSTIME COMPARES 2 FILES'

DC C'INPUT MUST BE 2 FILES THAT ARE SORTED ON KEYS. '

DC C'CONTROL CAN BE EITHER PARM FIELD OR //SYSIN '

* AGO .END

DC C' '

DC C'/COMPARE EXEC PGM=KEYCOMPR,PARM="1,9,A,12,4,A,33,5,D" '

DC C'//STEPLIB DD DISP=SHR,DSN= '

DC C'//SYSPRINT DD SYSOUT=* '

DC C'//SYSIN DD * <== DO NOT USE IF YOU USED PARM= '

DC C'LIST,DOC,ALL,1,9,A,12,4,A,33,5,D '

DC C'//IN1 DD DISP=SHR,DSN= '

DC C'//IN2 DD DISP=SHR,DSN= 2 '

DC C'//MATCH1 DD DUMMY (CAUSE YOU REALLY DON"T WANT TO SEE IT) '

DC C'//MATCH2 DD DUMMY DITTO '

DC C'//NMATCH1 DD SYSOUT=* (CAUSE YOU DO WANT TO SEE THESE) '

DC C'//NMATCH2 DD SYSOUT=* '

DC C'//DATA1 DD SYSOUT=* CONTAINS RECORDS WHERE THE KEYS MATCHED'

DC C'//DATA2 DD SYSOUT=* BUT THE REST OF THE DATA DID NOT. '

DC C' '

DC C'PARM=DOC,##,## PRINTS THIS DESCRIPTION. '

DC C'PARM=LIST,##,## ... LISTS MATCHING AND NON-MATCHING RECORDS. '

DC C'PARM=STOP=123,##,## STOP COMPARE AFTER ABOUT 123 RECORDS. '

DC C'PARM=ALL,##, ... COMPARE ENTIRE RECORD, NOT JUST KEY. '

DC C' '

DC C'IF YOU USE LIST, THEN //SYSPRINT WILL CONTAIN RECORDS LIKE: '

DC C' '

*

*DC C'000001704 N2=CBUF2 DC F"-1" '

*DC C'01145/01705 M=CHAIN LR R14,R7 '

*DC C'01146/01706 M=CHAIN04 L R14,DNEXT-DSECT(R14) '

*DC C'01147/01707 M=CHAIN05 OI RC,8 '

*DC C'01148/01708 M=CHAIN05M MSG "GOTO= DESTINATION LABEL NOT FOUND"'

*DC C'01149/01709 M=CLOSE TM DCBOFLGS-IHADCB(R2),DCBOFOPN '

*DC C'000001710 N2=CLOSLOOP BAL R9,CLOSE '

*DC C'000001150 N1=CLOSLOOP LA R2,4(R2) '

*DC C'01151/01711 M=CLOSMSG MSG " CLOSED" '

*DC C'000001712 N2=COND CLI DSTR1LEN,X"FF" Q. NULL STRING?'

*

*DC C'000000861 N1= DC C'.@,EDIT= ..... STARTS WITH ORIGINAL RECORD. '

*DC C'000000862 N1= DC C'.@,IF= ..... STARTS WITH ORIGINAL RECORD. '

*DC C'00863/01343 M= DC C'.A,EDIT=(1,0,C"EWRT",C"TRE"),WRITE=DD8,1,11 '

*DC C'000001344 N2= DC C'.AA,IF= ..... STARTS WITH ORIGINAL RECORD.'

*DC C'00864/01345 M= DC C'.B,WRITE=DD11 '

*DC C'000001346 N2= DC C'.BC,EDIT= ..... STARTS WITH ORIGINAL RECORD.'

*DC C' '

*DC C' '

DC C' 000000747 N2= LA R0,255 '

DC C' 000000748 N2= LA R0,255 '

DC C' 00454/00749 M= LA R0,32 '

DC C' 00455/00750 M= LA R0,4 '

DC C' 00456/00751 M= LA R0,4 '

DC C' 00457/00752 M= LA R0,64 '

DC C' 000000458 N1= LA R0,DSTR2LEN '

DC C' 000000459 N1= LA R0,DSTR2LEN '

DC C' '

DC C' 000001903 N2=QDUPDD CLI DOPCODE-DSECT(R1),C"W" '

DC C' 000001904 N2=QDUPDDB L R1,DNEXT '

DC C' 01277/01905 M=QF10 SR R15,R15 '

DC C' 01278/01906 M=QF20 LA R2,1(R2) '

DC C' 000001907 N2=QFREQ CLI DSTR1LEN,0 '

DC C' 000001279 N1=QFREQ LA R0,1 '

DC C' '

DC C'M= MEANS THAT THE KEYS (NOT NECESSARILY THE RECORDS) MATCH. '

DC C'N1= MEANS THERE IS NO MATCHING KEY IN THE //IN2 FILE. '

DC C'N2= MEANS THERE IS NO MATCHING KEY IN THE //IN1 FILE. '

DC C' '

DC C'RECORD #S ARE SHOWN IN CASE YOU WANT TO FIND THEM IN THE FILE. '

DC C'LOTS-A LUCK. -LIN LYONS (RETIRED, I CAN PUT MY NAME ANYWHERE)'

DC C' '

.END ANOP

ENDDOC EQU *

*

* @@PAD#1 EQU ((*-KEYCOMPR)/4096+1)*4096

* @@PAD#2 EQU @@PAD#1-(*-KEYCOMPR)

ORG *+@@PAD#2

*

END KEYCOMPR