.TITLE SRDTST TEST FOR MATCH .IDENT -6.1- ; 01-DEC-81 ;**NEW** ;**-1 ; ON ENTRY: ; R1 POINTS TO THE ACTUAL FILE-NAME ; R2 POINTS TO THE MATCH TEMPLATE ; NB: ; THE TEMPLATE IS GUARANTEED TO CONTAIN (AT LEAST) ONE ; FULL STOP AND ONE SEMI-COLON, AND IS TERMINATED BY A NULL. ; ; THE TEMPLATE IS A FILESPEC (NAME.EXT;VER) WITH ANY OF THE ; FOLLOWING SPECIAL CHARACTERS IN IT:- ; % - MATCHES ONE WILDCARD CHARACTER ; ? - SAME AS % ; * - MATCHES ANY NUMBER (INCL 0) OF WILDCARD CHARACTERS ; NOTE THAT ONCE * IS USED, THEN THE TERMINATING CHARACTER OF THE ; TEMPLATE MUST MATCH THAT OF THE FILENAME (UNLESS, OF COURSE, IT IS *) ; THIS MEANS THAT WHILE 'SRD /SE:F??L' WILL MATCH ; FILL ; FIXLE ; FIILXXL ; BUT NOT ; FIL ; FIIIL ; 'SRD /SE:F*L' WILL MATCH ; FL ; FILL ; FILIL ; BUT NOT ; FILE ; FLLLX ; THESE WILDCARDS CAN BE COMBINED IN ANY VARIETY, SO THAT ; 'SRD /SE:S?V*X*Y' WILL MATCH ALL NAMES WHICH START WITH ; S, END WITH Y, HAVE A V AS THE 3RD CHARACTER AND AN X ; SOMEWHERE AFTER THE THIRD CHARACTER. ; ;**-6 ; RETURNS SUCCESS OR FAILURE INDICATOR IN THE 'C'-BIT ; WLDFLG: .BYTE ; WILD-CARD PROCESSING FLAG TERMRS: .ASCIZ \.;\ ; FILE-NAME FIELD TERMINATORS .EVEN SRDTST:: 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). MOV R5,-(SP) ; MOV #TERMRS,R5 ; CLRB WLDFLG ; CALL MATCH0 ; GO DO THE COMPLEX WORK MOV (SP)+,R5 ; 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$ ;IF NE DIFFERENT - CHECK FOR SPECIALS CMPB R4,(R5) ;IS IT THE NEXT TERMINATOR? BEQ 16$ ;YES - DROP INTO THAT CODE BR MATCH0 ;NO - CHECK NEXT CHAR ; 1$: CMPB R4,(R5) ;IS IT A FIELD TERMINATOR? BNE 20$ ;IF NE NO - CHECK FOR WILDCARDS ; 10$: TSTB WLDFLG ;HAVE WE A WILD CARD HERE? BNE 13$ ; If NE Yes - Jump over rest BIT #WISW,SWMS2$ ; /WI specified? BEQ 12$ ; If EQ no - leave it alone BIT #WDSW,SWMS2$ ; /WD specified? BNE 15$ ; If NE yes - omit check BIT #,SWMSK$ ; IS THIS A DELETE OPERATION? BEQ 15$ ; If EQ no - carry on ; 12$: CMPB R3,#' ; No - Is This a Blank? BEQ MATCH1 ; If EQ Yes - Ignore it BR 30$ ; No - Error ; 13$: CMPB (R1),#' ;IF SO - IS THIS A BLANK? BNE 30$ ;IF NE NO - ERROR ; 15$: CMPB (R1)+,(R5) ;YES - ADVANCE OVER ANY REMAINING FIELDS BNE 10$ ; ; 16$: INC R5 ;SET TO NEXT TERMINATOR TSTB WLDFLG ;IN A WILD-CARD RECURSIVE SUBROUTINE? BNE 17$ ;IF NE YES - RETURN TSTB R4 ;NO - HAVE WE FINISHED? BNE MATCH0 ;IF NE NO - GET NEXT CHAR ; 17$: CLC ;SET SUCCESS INDICATOR RETURN ;RETURN 20$: CMPB R4,#'% ;IS TEMPLATE CHARACTER A % ( JOKER CHARACTER ) ? BEQ 25$ ;IF EQ YES - SEE IF OK CMPB R4,#'? ;THE OTHER ONE? BNE 30$ ;NOPE. DOESN'T MATCH 25$: CMPB R3,#'; ;YEP, ALLOW MATCH FOR ALL BUT ';' BEQ 30$ ;IF EQ ERROR CMPB R3,#'. ;WHAT ABOUT A '.' BEQ 30$ ;THAT'S ILLEGAL AS WELL TSTB R3 ;A NULL? BEQ 30$ ;SURE THING! CMPB R3,#' ;A ' '? BNE MATCH0 ;IT WAS ALLOWABLE SO MATCH IT. 30$: SEC ;FILE-NAME DOESN'T MATCH. RETURN ;TELL CALLER THE BAD NEWS & EXIT. ; MWILD: INCB WLDFLG ;COUNT NEXT RECURSION ; 10$: MOVB (R2)+,R4 ;GET NEXT CHARACTER FROM TEMPLATE CMPB R4,#'* ;ANOTHER WILD CARD ?? BEQ 10$ ;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. TSTB @(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 DECB WLDFLG ;DECREMENT RECURSION COUNT BNE 4$ ;IF NE MORE TO GO - KEEP GOING TSTB R4 ;END OF THE ROAD? BEQ 4$ ;IF EQ YES - FINAL EXIT JMP MATCH0 ;NO - START GOING AGAIN ; 4$: 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