.TITLE FILE-NAME MATCHING ROUTINE .IDENT -5.0- ; 19-NOV-79 ; 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 10$ ; 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. 10$: CMPB R4,#'% ; IS TEMPLATE CHARACTER A % ( JOKER CHARACTER ) ? BEQ 15$ ; YES, ACCEPT IT. CMPB R4,#'? ; IS IT THE OTHER JOKER? BNE 20$ ; NOPE. DOESN'T MATCH 15$: CMPB R3,#'; ; YEP, ALLOW MATCH FOR ALL BUT '; ' BNE MATCH0 ; IT WAS ALLOWABLE SO MATCH IT. 20$: SEC ; FILE-NAME DOESN'T MATCH. RETURN ; TELL CALLER THE BAD NEWS & EXIT. ; 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