(FILECREATED "12-Mar-84 20:29:21" {PHYLUM}<LISP>LIBRARY>BSEARCH.;7 11482        changes to:  (FNS STRPOS)      previous date: " 9-Mar-84 19:17:19" {PHYLUM}<LISP>LIBRARY>BSEARCH.;6)(* Copyright (c) 1983, 1984 by Xerox Corporation)(PRETTYCOMPRINT BSEARCHCOMS)(RPAQQ BSEARCHCOMS ((FNS STRPOS STRPOSL BFILEPOS)		    (GLOBALRESOURCES (\STRPOSLARRAY (NCREATE (QUOTE CHARTABLE))))		    (VARS \BFILEPOS.SHORTPATTERNL)		    (DECLARE: DONTEVAL@LOAD DOCOPY (P (MOVD? (QUOTE STRPOS)							     (QUOTE BSTRPOS))						      (MOVD? (QUOTE STRPOSL)							     (QUOTE BSTRPOSL))))))(DEFINEQ(STRPOS  (LAMBDA (PAT STRING START SKIP ANCHOR TAIL CASEARRAY BACKWARDSFLG)                                                             (* JonL "12-Mar-84 20:26")    (DECLARE (GLOBALVARS \TRANSPARENT))    (PROG (PATLEN PATBASE PATOFFST STRINGLEN STRINGBASE STRINGOFFST MAXI JMAX 1stPATchar jthPATchar)          (if (LITATOM PAT)	      then (SETQ PATBASE (fetch (LITATOM PNAMEBASE) of PAT))		   (SETQ PATOFFST 1)		   (SETQ PATLEN (fetch (LITATOM PNAMELENGTH) of PAT))	    else (OR (STRINGP PAT)		     (SETQ PAT (MKSTRING PAT)))		 (SETQ PATBASE (fetch (STRINGP BASE) of PAT))		 (SETQ PATOFFST (fetch (STRINGP OFFST) of PAT))		 (SETQ PATLEN (fetch (STRINGP LENGTH) of PAT)))          (if (LITATOM STRING)	      then (SETQ STRINGBASE (fetch (LITATOM PNAMEBASE) of STRING))		   (SETQ STRINGOFFST 1)		   (SETQ STRINGLEN (fetch (LITATOM PNAMELENGTH) of STRING))	    else (OR (STRINGP STRING)		     (SETQ STRING (MKSTRING STRING)))		 (SETQ STRINGBASE (fetch (STRINGP BASE) of STRING))		 (SETQ STRINGOFFST (fetch (STRINGP OFFST) of STRING))		 (SETQ STRINGLEN (fetch (STRINGP LENGTH) of STRING)))          (if (IGEQ 0 (SETQ MAXI (ADD1 (IDIFFERENCE STRINGLEN PATLEN))))	      then                                           (* Who's he kidding? The PATTERN length is greater than 							     the STRING length)		   (RETURN))          (if (NULL START)	      then (SETQ START (if BACKWARDSFLG				   then MAXI				 else 1))	    elseif (ILESSP START 0)	      then (add START (ADD1 STRINGLEN))		   (if (ILESSP START 1)		       then (RETURN))	    elseif (IGREATERP START MAXI)	      then (RETURN))                                 (* Normalize start to a 1-origin index between 1 and 							     LEN)          (if (ILEQ PATLEN 0)	      then (RETURN START))                           (* Null pattern matches anything)          (AND SKIP (SETQ SKIP (CHCON1 SKIP)))          (if (NULL CASEARRAY)	      then (SETQ CASEARRAY \TRANSPARENT)	    elseif (NOT (AND (ARRAYP CASEARRAY)			     (EQ \ST.BYTE (fetch (ARRAYP TYP) of CASEARRAY))			     (EQ (CONSTANT (EXPT 2 BITSPERBYTE))				 (fetch (ARRAYP LENGTH) of CASEARRAY))))	      then (\ILLEGAL.ARG CASEARRAY))                 (* Oh, for a LET here!)          (add STRINGOFFST -1)          (add PATOFFST -1)          (RETURN (PROG ((CAOFFST (fetch (ARRAYP OFFST) of CASEARRAY))			 (CABASE (fetch (ARRAYP BASE) of CASEARRAY))			 (OFFST.I (IPLUS STRINGOFFST START (if BACKWARDSFLG							       then 1							     else -1)))			 (LASTI (IPLUS STRINGOFFST				       (if ANCHOR					   then START					 elseif BACKWARDSFLG					   then 1					 else MAXI)))			 (JSTART (IPLUS PATOFFST 2))			 (JMAX (IPLUS PATOFFST PATLEN)))     (* Remember! START is a 1-origin index)                                                             (* There will be at least one pass thru the following 							     loop, or else we would have (RETURN) before now)		        (OR (ZEROP CAOFFST)			    (SHOULDNT "NonZero OFFST for a CASEARRAY?"))		        (SETQ 1stPATchar (\GETBASEBYTE CABASE (\GETBASEBYTE PATBASE (ADD1 PATOFFST))))		    LP  (if (if BACKWARDSFLG				then (ILESSP (add OFFST.I -1)					     LASTI)			      else (IGREATERP (add OFFST.I 1)					      LASTI))			    then (RETURN)			  elseif (AND (OR (EQ 1stPATchar SKIP)					  (EQ 1stPATchar (\GETBASEBYTE CABASE (\GETBASEBYTE 										       STRINGBASE 											  OFFST.I))))				      (for J from JSTART to JMAX as K from (ADD1 OFFST.I)					 always (OR (EQ SKIP (SETQ jthPATchar							  (\GETBASEBYTE CABASE (\GETBASEBYTE PATBASE 											     J))))						    (EQ jthPATchar (\GETBASEBYTE CABASE										 (\GETBASEBYTE 										       STRINGBASE K)))						    )))			    then (RETURN (IDIFFERENCE (if TAIL							  then (IPLUS OFFST.I PATLEN)							else OFFST.I)						      STRINGOFFST)))		        (GO LP)                              (* Fall out thru bottom if didn't find it)		    )))))(STRPOSL  (LAMBDA (A STRING START NEG CASEARRAY BACKWARDSFLG)        (* JonL " 8-Mar-84 14:33")    (GLOBALRESOURCE \STRPOSLARRAY (PROG (BASE OFFST LEN I LASTI)				        (OR (type? CHARTABLE A)					    (SETQ A (MAKEBITTABLE A NIL \STRPOSLARRAY)))				        (if (LITATOM STRING)					    then (SETQ BASE (fetch (LITATOM PNAMEBASE) of STRING))						 (SETQ LEN (fetch (LITATOM PNAMELENGTH) of STRING))						 (SETQ OFFST 1)					  else (OR (STRINGP STRING)						   (SETQ STRING (MKSTRING STRING)))					       (SETQ BASE (fetch (STRINGP BASE) of STRING))					       (SETQ LEN (fetch (STRINGP LENGTH) of STRING))					       (SETQ OFFST (fetch (STRINGP OFFST) of STRING)))				        (if (NULL START)					    then (SETQ START (if BACKWARDSFLG								 then LEN							       else 1))					  elseif (ILESSP START 0)					    then (add START (ADD1 LEN))						 (if (ILESSP START 1)						     then (RETURN))					  elseif (IGREATERP START LEN)					    then (RETURN))   (* Normalize start to a 1-origin index between 1 and 							     LEN)				        (add OFFST -1)       (* Bias the OFFST since START is 1-origin and the loop 							     deals in 0-origin)				        (SETQ NEG (if NEG						      then                                                              (* Convert NEG to match the correct value returned by 							     \SYNCODE)							   0						    else 1))				        (if (NULL CASEARRAY)					    then (SETQ CASEARRAY \TRANSPARENT)					  elseif (NOT (AND (ARRAYP CASEARRAY)							   (EQ \ST.BYTE (fetch (ARRAYP TYP)									   of CASEARRAY))							   (EQ (CONSTANT (EXPT 2 BITSPERBYTE))							       (fetch (ARRAYP LENGTH) of CASEARRAY))))					    then (\ILLEGAL.ARG CASEARRAY))				        (SETQ I (IPLUS OFFST START))				        (SETQ LASTI (IPLUS OFFST (if BACKWARDSFLG								     then (add I 1)									  1								   else (add I -1)									LEN)))				        (OR (ZEROP (fetch (ARRAYP OFFST) of CASEARRAY))					    (SHOULDNT "NonZero OFFST for CASEARRAY?"))				        (SETQ CASEARRAY (fetch (ARRAYP BASE) of CASEARRAY))                                                             (* There will be at least one pass thru the following 							     loop, or else we would have (RETURN) before now)				    LP  (if (if BACKWARDSFLG						then (ILESSP (add I -1)							     LASTI)					      else (IGREATERP (add I 1)							      LASTI))					    then (RETURN)					  elseif (EQ NEG (\SYNCODE A (\GETBASEBYTE CASEARRAY										   (\GETBASEBYTE										     BASE I))))					    then (RETURN (IDIFFERENCE I OFFST)))				        (GO LP)))))(BFILEPOS  (LAMBDA (PATTERN FILE LOWINDEX HIGHINDEX SKIP TAIL CASEARRAY)                                                             (* JonL " 1-Jan-84 02:34")    (OR (STRINGP PATTERN)	(LITATOM PATTERN)	(SETQ PATTERN (MKSTRING PATTERN)))    (RESETLST (PROG ((PLEN (NCHARS PATTERN))		     (INCREMENT 128)		     (FF (FUNCTION FILEPOS))		     (OFPOS 0)		     ORIGINALLYOPENP FLEN QUARTERFLEN STARTI NEXTI MAXI TEM STRM)		    (if (SETQ TEM (OPENP FILE))			then (SETQ ORIGINALLYOPENP T)			     (SETQ STRM (\GETSTREAM TEM))		      else (RESETSAVE (SETQ STRM (OPENSTREAM FILE (QUOTE INPUT)))				      (QUOTE (PROGN (CLOSEF? OLDVALUE)))))		    (SETQ FLEN (GETFILEINFO STRM (QUOTE LENGTH)))		    (if (IGREATERP 0 (SETQ MAXI (IDIFFERENCE FLEN PLEN)))			then                                 (* Who's he kidding? The PATTERN length is greater than 							     the file length)			     (RETURN))		    (SETQ QUARTERFLEN (IMAX 2 (LRSH FLEN 2)))		    (SETQ OFPOS (GETFILEPTR STRM))		    (if (NULL LOWINDEX)			then (SETQ LOWINDEX OFPOS)		      elseif (ILESSP LOWINDEX 0)			then (add LOWINDEX (ADD1 MAXI))			     (if (ILESSP LOWINDEX 0)				 then (SETQ LOWINDEX 0))		      elseif (IGREATERP LOWINDEX MAXI)			then (RETURN))                       (* Note that LOWINDEX really means low-end limit for 							     search)		    (if (NULL HIGHINDEX)			then (SETQ HIGHINDEX MAX.FIXP)		      elseif (ILESSP HIGHINDEX 0)			then (add HIGHINDEX (ADD1 MAXI)))		    (SETQ HIGHINDEX (IMIN HIGHINDEX MAXI))		    (if (ILESSP HIGHINDEX LOWINDEX)			then (ERROR "High-end index less than low-end"))		    (if ORIGINALLYOPENP			then (RESETSAVE (LIST STRM OFPOS)					(QUOTE (AND RESETSTATE (APPLY (QUOTE SETFILEPTR)								      OLDVALUE)))))		    (SETQ NEXTI)		    (SETQ STARTI (ADD1 HIGHINDEX))		    (SETQ TAIL (if TAIL				   then PLEN				 else 0))		FINDFIRST		    (if NEXTI			then (SETQ STARTI NEXTI)		      elseif (ILEQ STARTI LOWINDEX)			then                                 (* Looks like we never found any instance of the 							     PATTERN)			     (RETURN)		      else (SETQ MAXI (SUB1 STARTI))			   (SETQ STARTI (IMAX (PROG1 LOWINDEX                                                              (* Comment PPLossage))					      (IDIFFERENCE STARTI (if (ILESSP INCREMENT QUARTERFLEN)								      then (PROG1 INCREMENT										  (SETQ INCREMENT										    (LLSH INCREMENT 1)										    ))								    else QUARTERFLEN))))			   (SETQ NEXTI (FFILEPOS PATTERN STRM STARTI MAXI SKIP NIL CASEARRAY))			   (GO FINDFIRST))		NARROWDOWN                                   (* At this point, we have one instance found at STARTI 							     and certification that none occur at or beyond MAXI)		    (SETQ NEXTI (IPLUS STARTI (LRSH (IDIFFERENCE MAXI STARTI)						    1)))		    (if (IEQP NEXTI STARTI)			then (RETURN (IPLUS STARTI TAIL)))		    (if (SETQ TEM (FFILEPOS PATTERN STRM NEXTI MAXI SKIP NIL CASEARRAY))			then (SETQ STARTI TEM)		      else (SETQ MAXI NEXTI))		    (GO NARROWDOWN))))))(DECLARE: DOEVAL@COMPILE DONTCOPY (PUTDEF (QUOTE \STRPOSLARRAY)	(QUOTE GLOBALRESOURCES)	(QUOTE (NCREATE (QUOTE CHARTABLE)))))(DECLARE: DOEVAL@COMPILE DONTCOPY(ADDTOVAR GLOBALVARS \STRPOSLARRAY))(RPAQQ \STRPOSLARRAY NIL)(RPAQQ \BFILEPOS.SHORTPATTERNL 16)(DECLARE: DONTEVAL@LOAD DOCOPY (MOVD? (QUOTE STRPOS)       (QUOTE BSTRPOS))(MOVD? (QUOTE STRPOSL)       (QUOTE BSTRPOSL)))(PUTPROPS BSEARCH COPYRIGHT ("Xerox Corporation" 1983 1984))(DECLARE: DONTCOPY  (FILEMAP (NIL (591 10997 (STRPOS 601 . 4913) (STRPOSL 4915 . 7768) (BFILEPOS 7770 . 10995)))))STOP