.TITLE COMP -- COMPARE TWO FILES .IDENT -000000- ; ; ABSTRACT: COMP ; ; THIS PROGRAM PRINTS THE BLOCK NUMBERS WHICH DIFFER ; IN TWO FILES. ; ; OPERATING PROCEDURES: ; MCR>RUN COMP$ ; COM>DEV:OUTFILE=DEV:INFILE1,DEV:INFILE2 ; COM>^Z ; MCR> ; ; FILES: ; OUTFILE THE OUTPUT FILENAME (DEFAULTS TO SY0:COMP.LST) ; INFILE1 THE INPUT FILENAME (DEFAULTS TO SY0:.MAC) ; INFILE2 THE INPUT FILENAME (DEFAULTS TO SY0:.MAC) ; ; ERRORS: ; COMMAND STRING ERRORS ARE SELF-EXPLANATORY. IF AN ERROR ; OCCURRS ON THE FILES PROCESSED, THE ERROR CODE WILL BE ; PRINTED. ALL ERRORS ARE REPORTED TO TI: ONLY. ; ; WRITTEN: ; BRUCE C. WRIGHT ; CLINICAL EPIDEMIOLOGY LABORATORY ; DUKE UNIVERSITY MEDICAL CENTER ; DURHAM, N. C. 27710 ; 01-MAR-78 ; .MCALL OPEN$R,OPEN$W,READ$,WAIT$,PUT$,CLOSE$ .MCALL GCMLB$,GCML$,CSI$,CSI$1,CSI$2 .MCALL QIOW$,EXIT$S .MCALL BDOFF$,FINIT$ BUFLEN = 1000 BDOFF$ DEF$L .PSECT CODE,RO,I START: FINIT$ MOV SP,SPSAVE BEGIN: MOV SPSAVE,SP GCML$ #CMLBLK ;GET COMMAND LINE BCC GETOK ;SKIP IF GOTTEN OK. MOV #1,R2 ;ASSUME WE WILL LEAVE. CMPB CMLBLK+G.ERR,#GE.IOR BEQ CMDERR ;I/O ERROR CMPB CMLBLK+G.ERR,#GE.OPR BEQ CMDOPE ;OPEN ERROR CMPB CMLBLK+G.ERR,#GE.BIF BEQ CMDSYN ;SYNTAX ERROR CMPB CMLBLK+G.ERR,#GE.MDE BEQ CMDMAX ;MAX @ FILE DEPTH CMPB CMLBLK+G.ERR,#GE.EOF BNE CMDUNK ;EOF ON COMMAND FILE EXIT$S CMDERR: MOV #L.ERR,R1 MOV #M.ERR,R0 BR CMDQIO CMDOPE: MOV #L.OPE,R1 MOV #M.OPE,R0 CLR R2 BR CMDQIO CMDSYN: MOV #L.SYN,R1 MOV #M.SYN,R0 CLR R2 BR CMDQIO CMDMAX: MOV #L.MAX,R1 MOV #M.MAX,R0 CLR R2 BR CMDQIO CMDPS1: MOV #L.PS1,R1 MOV #M.PS1,R0 CLR R2 BR CMDQIO CMDPS2: MOV #L.PS2,R1 MOV #M.PS2,R0 CLR R2 BR CMDQIO CMDUNK: MOV #L.UNK,R1 MOV #M.UNK,R0 CMDQIO: MOV R0,$QIOW+Q.IOPL+0 MOV R1,$QIOW+Q.IOPL+2 MOV #$QIOW,-(SP) CALL .DIRDL RSTART: CLOSE$ #FDB1 CLOSE$ #FDB2 CLOSE$ #FDBL TST R2 ;LEAVE YET? BEQ BEGIN ;NO EXIT$S GETOK: TST CMLBLK+G.CMLD BEQ BEGIN ;LOOP IF NULL INPUT LINE. CSI$1 #CSIBLK,CMLBLK+G.CMLD+2,CMLBLK+G.CMLD BCS CMDPS1 ;PRINT ERROR MESSAGE IF SYNTAX ERROR CSI$2 #CSIBLK,INPUT BCS CMDPS2 ;PRINT ERROR MESSAGE IF TOO MANY SWITCHES OPEN$R #FDB1,,#CSIBLK+C.DSDS,,,,CMDOPN CSI$2 #CSIBLK,INPUT BCS CMDPS2 OPEN$R #FDB2,,#CSIBLK+C.DSDS,,,,CMDOPN CSI$2 #CSIBLK,OUTPUT BCS CMDPS2 OPEN$W #FDBL,,#CSIBLK+C.DSDS,,,,CMDOPN CLR R1 ;CLEAR RECORD COUNT CLR ERRCNT ;CLEAR ERROR REPORT COUNT. LOOP: INC R1 ;INCREMENT THE RECORD NUMBER. READ$ #FDB1,,,,,,,EOFMOD WAIT$ R0,,,EOFMOD READ$ #FDB2,,,,,,,EOFMOD WAIT$ R0,,,EOFMOD MOV #BUF1,R3 MOV #BUF2,R2 MOV #BUFLEN/2,R4 10$: CMP (R3)+,(R2)+ BNE 20$ SOB R4,10$ BR LOOP 20$: TST ERRCNT ;ANY ERRORS SO FAR? BNE 30$ ;YES -- NO HEADER MESSAGE PUT$ #FDBL,CMLBLK+G.CMLD+2,CMLBLKL+G.CMLD 30$: INC ERRCNT ;INC ERROR COUNT. MOV #M.MSGN,R0 ;GET ADDR OF NUMBER BUF CLR R2 ;SET FLAG WORD MOV R1,-(SP) ;SAVE R1 CALL $CBDSG ;CONVERT IT. MOV (SP)+,R1 ;RECOVER R1 SUB #M.MSG,R0 ;COMPUTE LENGTH MOV R0,R2 PUT$ #FDBL,#M.MSG,R2 BR LOOP ;AND LOOP. ; ; THE ERROR HANDLING ROUTINE. ; IF AN END-OF-FILE IS DETECTED, THE PROGRAM JUST EXITS. ; EOFMOD: CMPB F.ERR(R0),#IE.EOF BNE CMDOPN CMP R0,#FDB1 ;FIRST INPUT FILE? BEQ 10$ ;YES TST ERRCNT ;ANY ERRORS? BNE 5$ ;YES PUT$ #FDBL,CMLBLK+G.CMLD+2,CMLBLK+G.CMLD 5$: PUT$ #FDBL,#M.1L,#L.1L INC ERRCNT BR EOF2 10$: READ$ #FDB2,,,,,,,EOF1 ;READ OTHER FILE. WAIT$ R0,,,EOF1 ;END IF EOF. TST ERRCNT ;ANY ERRORS YET? BNE 15$ ;YES PUT$ #FDBL,CMLBLK+G.CMLD+2,CMLBLK+G.CMLD 15$: PUT$ #FDBL,#M.2L,#L.2L INC ERRCNT BR EOF2 EOF1: CMPB F.ERR(R0),#IE.EOF ;WAS LAST I/O ERROR END-OF-FILE? BNE CMDOPN ;NO -- PRINT ERROR. EOF2: CLOSE$ #FDB1 CLOSE$ #FDB2 MOV #M.ERRN,R0 ;GET ADDR OF NUMBER MOV ERRCNT,R1 ;GET ERROR COUNT. BEQ 90$ ;SKIP IF NONE. CLR R2 ;GET FLAG WORD CALL $CBDSG ;CONVERT IT. SUB #M.NUM,R0 ;COMPUTE LENGTH OF MSG MOV R0,R2 PUT$ #FDBL,#M.NUM,R2 90$: CLOSE$ #FDBL JMP BEGIN CMDOPN: MOV #M.COM,R1 MOV #L.COM,R2 TST @#$DSW ;WAS IT A DSW ERROR? BGE 10$ ;NO MOV @#$DSW,F.ERR(R0) ;YES -- MOVE IN ERROR CODE 10$: CALL .PRFCS CLR R2 ;DON'T LEAVE YET. JMP RSTART .PSECT PDATA,RO,D .NLIST BIN M.COM: .ASCII "COM" L.COM = .-M.COM .EVEN M.ERR: .ASCII "COM -- I/O ERROR ON @ FILE" L.ERR = .-M.ERR .EVEN M.OPE: .ASCII "COM -- OPEN ERROR ON @ FILE" L.OPE = .-M.OPE .EVEN M.SYN: .ASCII "COM -- SYNTAX ERROR FOR @ FILE" L.SYN = .-M.SYN .EVEN M.MAX: .ASCII "COM -- MAX @ FILE DEPTH" L.MAX = .-M.MAX .EVEN M.UNK: .ASCII "COM -- UNKNOWN COMMAND ERROR" L.UNK = .-M.UNK .EVEN M.PS1: .ASCII "COM -- SYNTAX ERROR" L.PS1 = .-M.PS1 .EVEN M.PS2: .ASCII "COM -- ILLEGAL SWITCH" L.PS2 = .-M.PS2 .EVEN M.1L: .ASCII "PREMATURE EOF ON FILE #2" L.1L = .-M.1L .EVEN M.2L: .ASCII "PREMATURE EOF ON FILE #1" L.2L = .-M.2L .EVEN .PSECT IDATA,RW,D M.MSG: .ASCII "ERROR ON BLOCK " M.MSGN: .ASCII " " .EVEN M.NUM: .ASCII "NUMBER OF ERRORS = " M.ERRN: .ASCII " " .EVEN .MCALL FSRSZ$,FDBDF$,FDRC$A,FDOP$A,FDBK$A,NMBLK$ .MCALL FDAT$A CMLBLK: GCMLB$ 1,COM,USRBUF,1 USRBUF: .BLKB 82. CSI$ CSIBLK: .BLKB C.SIZE .EVEN FSRSZ$ 2,2* .PSECT IDATA,RW,D FDB1: FDBDF$ FDAT$A R.VAR FDRC$A FD.RWM FDOP$A 2,,INDFN FDBK$A BUF1,BUFLEN INDFN: NMBLK$ ,MAC,,SY,0 FDB2: FDBDF$ FDAT$A R.VAR FDOP$A 3,,INDFN FDBK$A BUF2,BUFLEN FDRC$A FD.RWM FDBL: FDBDF$ FDAT$A R.VAR,FD.CR FDOP$A 5,,OUTDFN FDRC$A OUTDFN: NMBLK$ COMP,LST,,TI,0 SPSAVE: .WORD 0 ERRCNT: .WORD 0 BUF1: .BLKB BUFLEN BUF2: .BLKB BUFLEN .EVEN $QIOW: QIOW$ IO.WVB,4,4,,,,<0,0,40> .END START