.TITLE SEARCH - SEARCH FOR SPECIFIED PATTERN .IDENT /01.4/ .ENABL LC ;+ ; ; ; Free software BY ; Project Software & Development, Inc. ; ; This software is furnished for free and may be used and copied as ; desired. This software or any other copies thereof may be provided ; or otherwise made available to any other person. No title to and ; ownership of the software is hereby transferred or allowed. ; ; The information in this software is subject to change without notice ; and should not be construed as a commitment by PROJECT SOFTWARE ; AND DEVELOPMENT, INC. ; ; PROJECT SOFTWARE assumes no responsibility for the use or reliability ; of this software on any equipment whatsoever. ; ; Project Software & Development, Inc. ; 14 Story St. ; Cambridge, Ma. 02138 ; 617-661-1444 ; ; ; Title: SEARCH ; Author: Robin Miller ; Date: January 9, 1982 ; ; Description: ; ; This module will search the remaining records of the input file ; to find the specified pattern. ; ; Modification History: ; ;- .ENABL AMA ; Saved search string information. SRECRD:: .WORD 0,0 ; SEARCH STRING RECORD NUMBER SBEGIN:: .WORD 0 ; START OF SEARCH STRING SEND:: .WORD 0 ; END OF SEARCH STRING SSIZE:: .WORD 0 ; SIZE OF SEARCH STRING .SBTTL SEARCH - SEARCH FOR A SPECIFIED PATTERN ;+ ; ; SEARCH - Search for a specified pattern. ; ; This routine will search forward from the current record looking ; for a match for the specified pattern. The input pattern must ; be all uppercase or the search will fail everytime. ; ; Inputs: ; R2 = Address of pattern terminated by NULL. ; ; Outputs: ; C bit set if search failed. ; ;- SEARCH:: CALL $SAVAL ; SAVE R0 - R5 MOV FDBADR,R4 ; COPY THE FDB ADDRESS MOV R2,R5 ; COPY START OF STRING ; Calculate the length of the search string. 5$: TSTB (R5)+ ; FIND END OF STRING BNE 5$ ; WE SHOULD FIND NULL DEC R5 ; ADJUST FOR THE NULL SUB R2,R5 ; CALCULATE THE SIZE MOV R5,SSIZE ; AND SAVE IT MOV R2,R5 ; SAVE START OF STRING 10$: CALL GET ; GET NEXT RECORD BCS 90$ ; IF CS, ERROR CALL MARKER ; SEE IF RECORD NEEDS MARKED MOV F.NRBD+2(R4),R0 ; COPY THE RECORD ADDRESS MOV F.NRBD(R4),R1 ; AND THE BYTE COUNT CMP R1,SSIZE ; COULD STRING BE HERE ? BLT 10$ ; IF LT, NO (TOO SMALL) ; Search for the pattern. 20$: TSTB (R2) ; END OF STRING BEQ 100$ ; IF EQ, YES (SUCCESS) MOVB (R0)+,R3 ; COPY THE NEXT BYTE BIC #^C377,R3 ; CLEAR SIGN EXTEND (IF ANY) ; Convert VFU skip functions to a formfeed for PAGE command. BIT #VFSW,SWMASK ; LOOK FOR VFC BYTE ? BEQ 25$ ; IF EQ, NO CMPB R3,#301 ; DATA PRINTER SKIP CH #1 ? BEQ 23$ ; IF EQ, YES CMPB R3,#200 ; DATA PRODUCTS SKIP CH #1 ? BNE 25$ ; IF NE, NO 23$: MOVB #FF,R3 ; CONVERT SKIP TO A FORMFEED ; Convert lowercase to uppercase so compare will work. 25$: BIC #^C177,R3 ; CLEAR PARITY BIT (IF ANY) CMPB R3,#'a ; POSSIBLE LOWERCASE ? BLO 30$ ; IF LO, NO CMPB R3,#'z ; REALLY LOWERCASE ? BHI 30$ ; IF HI, NO BICB #40,R3 ; CONVERT TO UPPERCASE 30$: DEC R1 ; ADJUST BYTE COUNT BMI 10$ ; IF MI, GET NEXT RECORD CMPB (R2)+,R3 ; DO THEY COMPARE ? BEQ 20$ ; YES, CHECK NEXT BYTE MOV R5,R2 ; START OF STRING AGAIN CMPB (R2),R3 ; MATCH CURRENT BYTE ? BNE 20$ ; IF NE, NO INC R2 ; PROCEED WITH 2ND THEN BR 20$ ; AND TRY AGAIN ; Did not find the specified search string. 90$: SEC ; SHOW FAILURE RETURN ; Found the specified search string. 100$: MOV CURREC,SRECRD ; SAVE THE CURRENT MOV CURREC+2,SRECRD+2 ; RECORD NUMBER MOV R0,SEND ; ADDRESS OF LAST COMPARE +1 SUB SSIZE,R0 ; CALCULATE STARTING ADDRESS MOV R0,SBEGIN ; NOW SAVE IT CMPB (R5),#FF ; DID WE SEARCH FOR A FORMFEED ? BEQ 120$ ; IF EQ, YES (LEAVE MARGIN ALONE) ; Ensure the search string will be displayed on the screen. SUB F.NRBD+2(R4),R0 ; CALCULATE BYTE POSITION MOV R0,R1 ; COPY IT SUB MARGIN,R1 ; MARGIN INDENT TOO BIG ? BMI 110$ ; IF MI, YES (ADJUST IT) ADD SSIZE,R1 ; ADD IN THE SIZE CMP R1,LINWID ; WILL STRING BE DISPLAYED ? BLT 120$ ; IF LT, YES 110$: MOV R0,MARGIN ; FORCE DISPLAY OF STRING CALL CHKRUL ; CHECK FOR THE RULER 120$: CLC ; SHOW SUCCESS RETURN .END