LEX 'FINDLEX' TITLE Basic utilities \ 01/05/86-01/07/86 \ J-J MOREAU FindId ID #5E MSG Msgtbl POLL 0 ENTRY Find CHAR #7 KEY 'FIND' TOKEN 14 * * * Looks for a string in the current BASIC file, from the CURRL * down to the last line of the file * * =AVE=D1 EQU #18BB8 =BF2DSP EQU #01C0E =BLDDSP EQU #01898 =BSERR EQU #0939A =CK"ON" EQU #076AD =CSLW5 EQU #0ED3D =CSRW5 EQU #0ED2C =CURRL EQU #2F7E8 =CURSRT EQU #096C1 =DSPCNO EQU #09716 =EXPEXC EQU #0F186 =FINDL EQU #0FFE4 =GETPRO EQU #06BEE =GETSTC EQU #07726 =LDCM10 EQU #04F6F =LDCOMP EQU #04F69 =LDCSPC EQU #2F6C1 =MAIN30 EQU #0037E =MFERR EQU #09393 =NULLP EQU #07999 =NXTLIN EQU #10031 =NXTSTM EQU #08A48 =OUTBS EQU #2F58F =REVPOP EQU #0BD31 =S-R1-2 EQU #2F88B =S-R1-3 EQU #2F890 =STREQL EQU #1B1EF =STRNGP EQU #0379D =eFTYPE EQU #0003F ENDTXT eNSTRG EQU (#5E)*256+1 Not Found Msgtbl CON(2) 1 Lowest message number in table CON(2) 1 Highest message number in table CON(2) 24 Offset to next message CON(2) 1 Message number 1 CON(1) 9-1 Len(msg$)-1 NIBASC 'Not Foun' NIBASC 'd' CON(1) 12 NIBHEX FF End of message table Strngp GOVLNG =STRNGP REL(5) Strngp FIND "Search$" Find GOSBVL =EXPEXC Move search$ to stack GOSBVL =REVPOP Reverse search$ ?A=0 A Len(search$) =0? GOYES NStrng D0=(5) =S-R1-2 Len(search$) DAT0=A A -> S-R1-2; CD1EX Start(search$) D1=C C=C+A A C=C-1 A C=C-1 A (C @ lastchar(search$)) D0=D0+ 5 DAT0=C A -> S-R1-3; GOSBVL =AVE=D1 Update AVMEME to @ 1stchar(search$) GOSBVL =GETPRO Private file? GOC Mferr GOSBVL =GETSTC BASIC file? GONC Find20 LC(2) =eFTYPE Mferr GOVLNG =MFERR Find20 GOSBVL =NULLP Empty file? GONC Find30 No NStrng P= 0 LC(4) eNSTRG GOVLNG =BSERR Find30 D1=(5) =CURRL Find CURRL C=0 A C=DAT1 4 GOSBVL =FINDL GONC NStrng CD1EX C(A) @ line # (2 nibs past tEOL) B=C A Save pointer to CURRL in B(A) CD1EX Restore D1 GOSBVL =NXTLIN Find next line ?C A(A); D0=(5) =LDCSPC Start(object$) C=DAT0 A C=C+A A R2=C -> R2 D1=C -> D1; D0=(5) =S-R1-3 Start(search$) C=DAT0 A R1=C -> R1; D0=D0- 5 C=DAT0 A * * * This code from POS (EQU #0C0B1) * It trys to find search$ in object$ * POS scans from high-mem to low-mem * * A=A-C A Len(object$)-len(search$) 0>? IF Pos5 GOC Pos5 B=0 M B=A A BSRB (len(object$)-len(search$))/2 -> Scanindex; C=C-1 A Len(search$)-1 P=C 0 RMD(Len(search$)-1,16) -> Partword; CSR A DIV(Len(search$)-1,16) D=C A -> Wordcount; GONC Pos3 (B.E.T.) Pos2 C=B A RSTK=C Scanindex -> Stack; CD1EX RSTK=C Scanpt -> Stack; CD1EX D0=D0+ 2 D1=D1+ 2 C=D A B=C A Wordcount -> B; GOSBVL =STREQL ?Search$Object$ IF Pos6 C=RSTK D1=C Scanpt -> D1; C=RSTK B=C A Scanindex -> B; GONC Pos6 B=B-1 A Scanindex-1 <0? IF Pos5 Pos3 C=R1 Start(search$) D0=C -> D0; GOC Pos5 A=DAT0 B 1stchar(search$) -> A; Pos4 D1=D1- 2 Scanpt-2 -> Scanpt; C=DAT1 B Object$[Scanpt,Scanpt] -> C; ?A=C B IF Pos2 ; GOYES Pos2 B=B-1 A Scanindex-1 >=0? IF Pos4; GONC Pos4 Pos5 C=R2 D1=C Start(Object$) -> Scanpt; Pos6 C=R2 A=0 W A=C A CD1EX Scanpt -> C; A=A-C A Start(Object$)-Scanpt -> A; ASRB A/2 -> A; * * Main Loop * P= 0 C=R3 Findindex -> C; D1=C D1 @ line # ?A=0 A POS(Object$,Search$) NOT IF Find60 GOYES Find60 * * * This code from DCPLIN * * GOSBVL =LDCOMP Decompile line @ D1; update CURRL D0=(5) =OUTBS C=DAT0 A D0=C D0 @ 1stchar(line$) D1=(5) =LDCSPC A=0 M A=DAT1 A A @ Space after line# A=A-C A Difference ASRB Len(line$)-Len(line#) R0=A -> R0; C=B A 2*Len(line$) RSTK=C -> RSTK; GOSUB Find* Display PROMPT NIBHEX B1C3 NIBASC '>' NIBHEX B1E3 NIBHEX FF Find* C=RSTK D1=C GOSBVL =BF2DSP C=RSTK Restore # characters to B(A) B=C A GOSBVL =DSPCNO Display Ouput Buffer C=R0 #cursor right GOSBVL =CURSRT CURSFL, then move cursor right GOSBVL =BLDDSP Build display GOVLNG =MAIN30 Return to Main, keep display Find60 GOSBVL =CSRW5 End of file D=C A -> D; GOSBVL =NXTLIN Find next line P= 0 ?C C; CD1EX Update Findindex[Findpt,Findpt] R3=C Save Findindex in R3 GOSBVL =CK"ON" C=R3 D1=C D1 @ Line # GOC Findx+ ATTN key not down? GOVLNG =NXTSTM Findx+ GOTO Findx Repeat