.TITLE SRDTST FILE-NAME MATCHING ROUTINE ;**V5.0 .IDENT /V5.0/ ; UPDATE AUDIT CONTROL-13 NOV 1979 12:10:02 ;**V5.0 ; EDIT # 0001 8 JAN 1979 11:46:30 DR1:[300,3]SRDTST.MAC;3 ;**V5.0 ; PREVIOUS EDIT 15 DEC 1978 17:56:40 DR1:[300,3]SRDTST.MAC;2 ;**V5.0 ;**-2 ; ON ENTRY: ; R1 POINTS TO THE ACTUAL FILE-NAME ; R2 POINTS TO THE MATCH TEMPLATE ; NB: ; BOTH THE FILE-NAME AND THE TEMPLATE MUST TERMINATE ; IN A SEMICOLON (;). ; ; RETURNS SUCCESS OR FAILURE INDICATOR IN THE 'C'-BIT ; MATCH:: MOV R1,-(SP) ;SAVE THE REGISTERS THAT WE WILL USE MOV R2,-(SP) ;(GOOD CODING PRACTICE, IF RATHER TOO MOV R3,-(SP) ; MUCH LIKE HARD WORK FOR THE AVERAGE MOV R4,-(SP) ; [WHERE AVERAGE=MEAN] PROGRAMMER). CALL MATCH0 ; GO DO THE COMPLEX WORK MOV (SP)+,R4 ;> N.B. A COMPLEX PROBLEM IS ONE WHICH MOV (SP)+,R3 ;>> CONTAINS BOTH REAL AND IMAGINARY MOV (SP)+,R2 ;>>> DIFFICULTIES... MOV (SP)+,R1 ;>>>> RETURN ;---> ALL DONE - GO HOME TO MOTHER. ; MATCH0: MOVB (R2)+,R4 ;GET CHARACTER FROM MATCH TEMPLATE CMPB R4,#'* ;IS IT A '*' ? ( WILD STRING CHARACTER ) BEQ MWILD ;BR IF YES MATCH1: CALL NEXTCH ;GET NEXT CHARACTER FROM FILE-NAME BNE 1$ ;BR IF THEY DON'T MATCH CMPB R3,#'; ;BOTH AT END OF THEIR RESPECTIVE STRINGS ? BNE MATCH0 ;NO, TRY MATCH REST OF FILE-NAME RETURN ;YES, FILE-NAME MATCHES TEMPLATE SO QUIT. 1$: CMPB R4,#'% ;IS TEMPLATE CHARACTER A % ( JOKER CHARACTER ) ? BNE 2$ ;NOPE. DOESN'T MATCH 11$: CMPB R3,#'; ;YEP, ALLOW MATCH FOR ALL BUT ';' ;**V5.0 BNE MATCH0 ;IT WAS ALLOWABLE SO MATCH IT. ;**V5.0 2$: CMPB R4,#'? ;**V5.0 BEQ 11$ ;**V5.0 SEC ;FILE-NAME DOESN'T MATCH. ;**V5.0 RETURN ;TELL CALLER THE BAD NEWS & EXIT. ;**-3 ; MWILD: MOVB (R2)+,R4 ;GET NEXT CHARACTER FROM TEMPLATE CMPB R4,#'* ;ANOTHER WILD CARD ?? BEQ MWILD ;YES, DON'T BE B....Y SILLY ! MOV R2,-(SP) ;SAVE CONTEXT FOR LATER MOV R1,-(SP) ;.. 1$: CALL MATCH1 ;TRY TO MATCH REMAINDER OF TEMPLATE. BCC 3$ ;WE MANAGED IT. CMPB @(SP)+,#'; ;IT DIDN'T. WAS IT BECAUSE FILE-NAME RAN OUT ? BEQ 2$ ;YES, TOTAL FAILURE. GO UNWIND & QUIT. MOV (SP),R2 ;RECOVER ORIGINAL POSITION IN FILE-NAME MOVB -1(R2),R4 ;GET TEMPLATE CHARACTER AGAIN INC -(SP) ;SKIP A CHARACTER IN FILE-NAME THAT WAS WRONG MOV (SP),R1 ;GET POINTER BACK TO R1 BR 1$ ;TRY TO MATCH FURTHER DOWN THE FILE-NAME. 2$: TST (SP)+ ;TIDY UP STACK SEC ;SAY IT WAS BAD RETURN ;GO HOME WITH TAIL BETWEEN LEGS 3$: CMP (SP)+,(SP)+ ;TIDY STACK ON SUCESS CLC ;CHUFFED TO BITS RETURN ; ; NEXTCH: MOVB (R1)+,R3 ;GET NEXT CHARACTER FROM FILE-NAME CMPB R3,#040 ;IS IT A SPACE ? BEQ NEXTCH ;YES - IGNORE IT CMPB R3,R4 ;NO - SET CONDITION CODES FOR LATER RETURN ;AND RETURN ; .END