.MCALL SUPER SUPER ; ; COMPARE STRING FUNCTION ; ; THIS FUNCTION COMPARES TWO BYTE STRINGS AND RETURNS ; A VERDICT OF GREATER, EQUALS, OR LESS THAN. THE ; STRINGS ARE SCANNED FROM LEFT (FIRST BYTE) TO RIGHT ; UNTIL A PAIR IS FOUND WHICH ARE NOT EQUAL. IF THE ; ASCII VALUES OF THE TWO BYTES IS LESS, THEN THE ; RESULT OF THE FUNTION IS LESS, ETC. IF NONE OF THE ; CHARACTERS DIFFER, THE RESULT IS EQUAL. ; ; THE SPECIAL CHARACTER '\' IS A "WILD CARD" MATCH CHARACTER. ; IF THIS CHARACTER OCCURS IN EITHER OF THE STRINGS, IT ; ALWAYS MATCHES ANY CHARACTER IN THE OTHER STRING. ; ; THE TWO STRINGS ARE TERMINATED BY: ; ; 1) A NUL BYTE. ; 2) THE LEN'TH BYTE IF THE LEN ARGUMENT IS PRESENT AND ; A NUL IS NOT ENCOUNTERED FIRST. ; 3) THE MAXLEN'TH BYTE IF THE LEN ARGUMENT IS MISSING. ; (SEE THE SETMAX SUBROUTINE FOR THE DEFAULT VALUE ; OF MAXLEN AND HOW TO CHANGE IT) ; 4) TRAILING SPACES. THIS IS ONLY SIGNIFICANT IF ONE OF ; THE STRINGS SI TERMINATED BY NUL. IF THE OTHER ; STRING WAS EQUAL UP TO THAT POINT, AND ALL THE REST ; OF IT'S CHARACTERS ARE SPACES, THE STRINGS ARE ; CONSIDERED TO BE EQUAL. ; ; FORTRAN CALLING CONVENTION: ; ; VERDICT=CMPS(ONE,TWO[,LEN]) ; WHERE: ; VERDICT IS THE RESULT OF THE COMPARE: ; 1 MEANS THE FIRST STRING IS GREATER ; 0 MEANS THE STRINGS ARE EQUAL ; -1 MEANS THE FIRST STRING IS LESS THAN THE SECOND ; ; ONE IS THE FIRST STRING ; TWO IS THE SECOND STRING ; LEN IS THE MAXIMUM LENGTH TO SCAN THE TWO STRINGS ; ; ; MACRO CALLING CONVENTION: ; ; R0 MUST POINT TO THE FIRST CHARACTER OF THE FIRST STRING ; R1 MUST POINT TO THE SECOND STRING ; R2 MUST CONTAIN THE MAXIMUM STRING LENGTH ; ; CALL WITH: RTS PC,$CMPS ; ; R0 RETURNS THE VERDICT ; R1 POINTS SOMEWHERE IN THE SECOND STRING OR PAST IT ; R2 CONTAINS SOME NUMBER LE THE VALUE BEFORE THE CALL ; ALL OTHER REGESTERS ARE UNCHANGED ; ; PROCEDURE CMPS ;(ONE,TWO,[LEN]) ;PARAMETERS ONEP=2 TWOP=4 LENP=6 ;REGESTERS RET=R0 ONE=R0 TWO=R1 LOOP=R2 LNK=R5 LET ONE := ONEP(LNK) LET TWO := TWOP(LNK) IF (LNK) GE #LENP/2 LET LOOP := @LENP(LNK) ELSE LET LOOP := MAXLEN END $CMPS:: THRU LOOP IFB (ONE) EQ #0 IFB (TWO) EQ #0 THEN GOTO EQUALS IFB (TWO)+ NE #40 THEN GOTO LESS ELSE IFB (TWO) EQ #0 IFB (ONE)+ NE #40 THEN GOTO GREAT ELSE IFB (ONE) NE #'\ ANDB (TWO) NE #'\ IFB (ONE)+ NE (TWO)+ IF RESULT IS GT GREAT: LET RET := #1 RETURN ELSE LESS: LET RET := #-1 RETURN END END ELSE TSTB (ONE)+ TSTB (TWO)+ END END END END EQUALS: LET RET := #0 ENDPROCEDURE CMPS .END