; ******************************************************* ; * * ; * THIS SOFTWARE WAS DEVELOPED WITH SUPPORT * ; * FROM THE NATIONAL INSTITUTES OF HEALTH: * ; * NIH CA06927 * ; * NIH CA22780 * ; * * ; * DIRECT INQUIRIES TO: * ; * COMPUTER CENTER * ; * THE INSTITUTE FOR CANCER RESEARCH * ; * 7701 BURHOLME AVENUE * ; * PHILADELPHIA, PENNSYLVANIA 19111 * ; * * ; * NO WARRANTY OR REPRESENTATION, EXPRESS OR * ; * IMPLIED, IS MADE WITH RESPECT TO THE * ; * CORRECTNESS, COMPLETENESS, OR USEFULNESS * ; * OF THIS SOFTWARE, NOR THAT USE OF THIS * ; * SOFTWARE MIGHT NOT INFRINGE PRIVATELY * ; * OWNED RIGHTS. * ; * * ; * NO LIABILITY IS ASSUMED WITH RESPECT TO * ; * THE USE OF, OR FOR DAMAGES RESULTING FROM * ; * THE USE OF THIS SOFTWARE * ; * * ; ******************************************************* ; * * ; * THIS SOFTWARE WAS DESIGNED FOR USE ON A * ; * PDP-11/70 OPERATING UNDER IAS V3.0 USING * ; * THE IAS PDP-11 MACRO ASSEMBLER. * ; * * ; ******************************************************* .TITLE WSRCH SEARCH WITH WILD (* ?) AND CLASS CHARACTERS ; ; BY BILL CAEL AND BILL WOOD, JANUARY 1982 ; ADDED COLUMN RANGES - BILL WOOD, MARCH 1982 ; .IDENT /ICR001/ .PSECT $MACOD RW,I,LCL,CON ; WILD = -128. ;MATCHES ANY STRING (MAY BE NULL) ANY = -127. ;MATCHES ANY SINGLE CHARACTER BREAK = -126. ;MATCHES ANY BREAK CHARACTER EOL = -125. ;END OF LINE BOL = -124. ;BEGINNING OF LINE ALPHA = -123. ;ALPHA NUMBER = -122. ;NUMBER ; NOT = 1 ;NOT PATTERN FLAG AND = 2 ;AND PATTERN FLAG COLUMNS = 4 ;COLUMN RANGE FLAG ; ; R0 - TEXT POINTER ; R1 - END OF TEXT ; R2 - PATTERN POINTER ; R3 - END OF PATTERN ; R4 - CURRENT PATTERN CHARACTER ; R5 - SCRATCH ; WSRCH:: MOV 2(R5),TEXTPT ;SAVE TEXT POINTER MOV @4(R5),TEXTLN ;SAVE TEXT LENGTH MOV 6(R5),R3 ;PATTERN POINTER CLR STATUS ;ASSUME FAILURE 10$: MOV R3,R2 ;POINT TO NEXT PATTERN MOVB (R2)+,R5 ;LENGTH OF PATTERN ADD #128.,R5 BNE 15$ ;NE - TRY NEXT PATTERN MOV STATUS,R0 ;RETURN STATUS RETURN ;END OF ALL PATTERNS 15$: ADD R5,R3 ;END OF THIS PATTERN STRING MOVB (R2)+,FLAGS ;NEGATION, AND FLAGS TST STATUS ;SUCCESSFUL STATUS SO FAR? BEQ 17$ ;EQ - NO BITB #AND,FLAGS ;OR WITH SUCCESS? BEQ 10$ ;EQ - YES SO SKIP PATTERN BR 18$ ;CONTINUE WITH PATTERN 17$: BITB #AND,FLAGS ;AND WITH FAILURE? BNE 10$ ;NE - YES SO SKIP PATTERN 18$: MOV TEXTPT,R0 ;RESTORE TEXT POINTER MOV TEXTLN,R1 ;TEXT LENGTH BITB #COLUMNS,FLAGS ;COLUMN RANGE SPECIFIED? BEQ 19$ ;EQ - NO MOVB (R2)+,SCRAT ;GET COLUMN OFFSET MOVB (R2)+,SCRAT+1 ADD SCRAT,R0 ;POINT TO FIRST COLUMN MOVB (R2)+,SCRAT ;GET HIGH COLUMN MOVB (R2)+,SCRAT+1 CMP SCRAT,R1 ;HIGH COLUMN NUMBER >= ACTUAL LENGTH? BGE 19$ ;GE - YES, USE ACTUAL LENGTH MOV SCRAT,R1 ;HIGH COLUMN NUMBER 19$: ADD TEXTPT,R1 ;END OF TEXT STRING IN R1 MOV R2,PATBT ;PATTERN BACK TRACK MOV R0,TEXTBT ;TEXT BACKTRACK CMP R2,R3 ;END OF PATTERN? BHIS 100$ ;HIS - YES SO SUCCESS CMPB (R2),#BREAK ;BREAK? BNE 20$ ;NE - NO INC R2 ;INCREMENT PATTERN POINTER DEC TEXTBT ;DECREMENT TEXT BACKTRACK 20$: CMP R2,R3 ;END OF PATTERN? BHIS 100$ ;HIS - YES SO SUCCESS MOVB (R2)+,R4 ;NEXT PATTERN CHARACTER BMI 50$ ;MI - WILD OR SPECIAL CHARACTER CMP R0,R1 ;END OF TEXT? BHIS 110$ ;HIS - YES SO FAIL MOVB (R0)+,R5 ;GET TEXT CHARACTER BISB (R2)+,R5 ;OR IN CASE MASK CMPB R4,R5 ;MATCH? BEQ 20$ ;EQ - YES 30$: MOV PATBT,R2 ;BACK TRACK PATTERN BEQ 110$ ;EQ - NO BACK TRACK SO FAIL INC TEXTBT MOV TEXTBT,R0 ;AND TEXT BR 20$ 50$: CMP R4,#WILD ;WILD? BNE 90$ ;NE - NO MOV R0,TEXTBT ;SAVE TEXT POINTER MOV R2,PATBT ;AND PATTERN POINTER BR 20$ 90$: CMP R4,#BOL ;BOL? BNE 60$ ;NE - NO CLR PATBT ;CLEAR PATTERN BACKTRACK BR 20$ 60$: CMP R0,R1 ;END OF TEXT? BLO 70$ ;LO - NO CMP R4,#EOL ;EOL? BEQ 100$ ;EQ - YES, SUCCESS CMP R4,#BREAK ;BREAK? BNE 110$ ;NE - NO, FAIL CMP R2,R3 ;END OF PATTERN? BLO 110$ ;LO - NO, FAIL BR 100$ ;ELSE SUCCESS 70$: CMP R4,#ANY ;ANY? BNE 80$ ;NE - NO INC R0 ;MATCHES ANYTHING BR 20$ 80$: MOVB (R0),R5 ;GET CHARACTER TYPE CMPB R4,CTYPE+128.(R5) ;SAME TYPE? BNE 30$ ;NE - TRY BACK TRACK INC R0 BR 20$ 100$: ;SUCCESS MOV #1,R5 ;ASSUME SUCCESS BITB #NOT,FLAGS ;NEGATION BEQ 120$ ;EQ - NO CLR R5 BR 120$ 110$: ;FAILURE CLR R5 ;ASSUME FAILURE BITB #NOT,FLAGS ;NEGATION? BEQ 120$ ;EQ - NO INC R5 120$: BITB #AND,FLAGS ;IS THIS AN AND BNE 125$ ;NE - YES BIS R5,STATUS ;OR IN STATUS JMP 10$ ;TRY NEXT PATTERN 125$: COM R5 ;AND IN STATUS BIC R5,STATUS JMP 10$ ;TRY NEXT PATTERN ; ;CHARACTER TYPE ARRAY ; .PSECT $MADAT RW,D,LCL,CON .NLIST BEX ; CTYPE: .REPT 128. .BYTE BREAK .ENDR .REPT 48. .BYTE BREAK .ENDR .REPT 10. .BYTE NUMBER .ENDR .REPT 7. .BYTE BREAK .ENDR .REPT 26. .BYTE ALPHA .ENDR .REPT 6. .BYTE BREAK .ENDR .REPT 26. .BYTE ALPHA .ENDR .REPT 5. .BYTE BREAK .ENDR ; ;LOCAL VARIABLES ; TEXTPT: .WORD 0 TEXTLN: .WORD 0 STATUS: .WORD 0 FLAGS: .WORD 0 TEXTBT: .WORD 0 PATBT: .WORD 0 SCRAT: .WORD 0 .END