!TITLE 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 !>