Source of COMPARE
%SYSTEMINTEGERFNSPEC pd addr(%STRING(255) FILE)
%SYSTEMINTEGERMAPSPEC COMREG(%INTEGER I)
%EXTERNALINTEGERFN SSFAIL
%RESULT=COMREG(24)
%END
%EXTERNALROUTINESPEC DEFINE(%STRING(255) STREAMS)
%EXTERNALROUTINESPEC SSFOFF
%SYSTEMSTRINGFNSPEC FAILURE MESSAGE(%INTEGER I)
%EXTERNALROUTINE COMPARE(%STRING(255)STREAMS); !COMPARE FILES A LA hd
%STRING(63)IN1,IN2,OUT
%CONSTINTEGER MAX=16, LINEMAX=128
%CONSTINTEGER NONE=0
%INTEGER ASTREAM,BSTREAM
%OWNINTEGER SKIP=1; !TO IGNORE BLANK LINES
%OWNINTEGER ABASE=0, BBASE=0, ACOUNT=0, BCOUNT=0
%INTEGER ANUM,BNUM,INSTREAM,END OF FILE,IN1END,IN2END
%INTEGERARRAY AA,BB(1:MAX*LINEMAX)
%INTEGERFN REM(%INTEGER N,D)
%RESULT = N-N//D*D
%END
%INTEGERMAP A(%INTEGER I,J)
%RESULT == AA(REM(ABASE+I,MAX)*LINEMAX+J)
%RESULT == AA(((ABASE+I)&15)<<7+J); !FOR SPEED (**MAX=16**)
%END
%INTEGERMAP B(%INTEGER I,J)
%RESULT == BB(REM(BBASE+I,MAX)*LINEMAX+J)
%RESULT == BB(((BBASE+I)&15)<<7+J)
%END
%ROUTINE REPLENISH(%INTEGERMAP X(%INTEGER I,J),%INTEGER N,%INTEGERNAME COUNT)
%INTEGER I,J,K
%CYCLE I = MAX-N+1,1,MAX
%SIGNAL %EVENT 9 %IF INSTREAM=END OF FILE
K=BYTE INTEGER(INSTREAM) %AND INSTREAM=INSTREAM+1 %UNTIL K # NL %OR SKIP = 0 %C
%OR INSTREAM=END OF FILE
%CYCLE J = 1,1,LINEMAX
X(I,J) = K
%EXIT %IF K = NL
%RETURN %IF INSTREAM=END OF FILE
K=BYTE INTEGER(INSTREAM); INSTREAM=INSTREAM+1
%REPEAT
COUNT = COUNT+1
%REPEAT
%END
%ROUTINE PRINT(%INTEGERMAP X(%INTEGER I,J),%INTEGER N,CODE)
%INTEGER I,J
%RETURN %IF N = 0
%CYCLE I = 1,1,N
PRINT SYMBOL(CODE); PRINT SYMBOL(':'); SPACE
J = 0
J = J+1 %AND PRINT SYMBOL(X(I,J)) %UNTIL X(I,J) = NL
%REPEAT
%END
%INTEGERFN DIFF(%INTEGER AL,BL)
%INTEGER J
%IF AL > ACOUNT %OR BL > BCOUNT %START
%RESULT = 0 %IF AL > ACOUNT %AND BL > BCOUNT
%RESULT = 1
%FINISH
%CYCLE J = 1,1,LINEMAX
%RESULT = 1 %IF A(AL,J) # B(BL,J)
%RESULT = 0 %IF A(AL,J) = NL
%REPEAT
%RESULT = 0
%END
%ROUTINE FIND MATCH(%INTEGERNAME AN,BN)
%INTEGER I,J
%CYCLE I = 1,1,MAX
AN=I %AND BN=I %AND %RETURN %IF DIFF(I,I) = 0
%IF I # 1 %START; %CYCLE J = 1,1,I-1
AN=I %AND BN=J %AND %RETURN %IF DIFF(I,J) = 0
AN=J %AND BN=I %AND %RETURN %IF DIFF(J,I) = 0
%REPEAT; %FINISH
%REPEAT
AN = MAX+1; BN = MAX+1
%END
%ON %EVENT 9 %START
%STOP
%FINISH
OUT = ".OUT"
%UNLESS (STREAMS -> IN1.("/").OUT %C
%AND IN1 -> IN1.(",").IN2) %C
%OR STREAMS -> IN1.(",").IN2 %START
PRINTSTRING("Compare IN1,IN2/Out")
NEWLINE
%STOP
%FINISH
SSFOFF
ASTREAM=pd addr(IN1)
BSTREAM=pd addr(IN2)
%IF ASTREAM<=0 %OR BSTREAM<=0 %START
PRINTSTRING("COMPARE FAILS - CANNOT ACCESS INPUT FILE")
NEWLINE
%STOP
%FINISH
%IF INTEGER(ASTREAM+12)#3 %OR INTEGER(BSTREAM+12)#3 %START
PRINTSTRING("COMPARE FAILS - NOT A TEXT FILE")
NEWLINE
%STOP
%FINISH
IN1END=INTEGER(ASTREAM)+ASTREAM
IN2END=INTEGER(BSTREAM)+BSTREAM
ASTREAM=ASTREAM+INTEGER(ASTREAM+4)
BSTREAM=BSTREAM+INTEGER(BSTREAM+4)
DEFINE("4,".OUT)
%IF SSFAIL#0 %START
PRINTSTRING("Compare fails - ".FAILURE MESSAGE(SSFAIL));NEWLINE
%STOP
%FINISH
SELECT OUTPUT(4)
ANUM = MAX; BNUM = MAX
%CYCLE
INSTREAM=ASTREAM
END OF FILE=IN1END
REPLENISH(A,ANUM,ACOUNT)
ASTREAM=INSTREAM
INSTREAM=BSTREAM
END OF FILE=IN2END
REPLENISH(B,BNUM,BCOUNT)
BSTREAM=INSTREAM
%EXIT %IF ACOUNT <= 0 %AND BCOUNT <= 0
FIND MATCH(ANUM,BNUM)
%IF ANUM # 1 %OR BNUM # 1 %START
PRINT(A,ANUM-1,'1')
PRINT(B,BNUM-1,'2')
NEWLINE
%FINISH
ABASE = ABASE+ANUM; ACOUNT = ACOUNT-ANUM
BBASE = BBASE+BNUM; BCOUNT = BCOUNT-BNUM
%REPEAT
%END
%ENDOFFILE