home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 19 / CD_ASCQ_19_010295.iso / dos / prg / pas / swag / findrepl.swg / 0012_STRPOS.PAS.pas < prev    next >
Pascal/Delphi Source File  |  1993-05-28  |  3KB  |  84 lines

  1.  
  2.   Hi, Andy:
  3.  
  4.   ...Just for fun I also threw together a "PosSearch" routine
  5.   that uses the built-in TP "POS" function. It actually performs
  6.   better than I thought it would, as it takes a string longer than
  7.   15 characters before it starts to become slower than the Boyer-
  8.   Moore function I just posted. (ie: PosSearch is faster than the
  9.   Boyer-Moore routine for strings that are smaller than 16 chars)
  10.   Here's a demo program of the "PosSearch" search routine I put
  11.   together. *Remember* to turn-off "range-checking" {$R-} in your
  12.   finished program, otherwise the PosSearch will take longer than
  13.   it should to execute.
  14.  
  15.               (* Public-domain Search routine, using the standard TP  *)
  16.               (* POS function. Guy McLoughlin - May 1, 1993.          *)
  17. program DemoPosSearch;
  18.  
  19.  
  20.   (***** PosSearch function. Returns 0 if string is not found.        *)
  21.   (*     Returns 65,535 if BufferSize is too large.                   *)
  22.   (*     ie: Greater than 65,520 bytes.                               *)
  23.   (*                                                                  *)
  24.   function PosSearch({input } var Buffer;
  25.                                   BuffSize : word;
  26.                                   Pattern  : string) : {output} word;
  27.   type
  28.     arwo_2    = array[1..2] of word;
  29.     arch_255  = array[1..255] of char;
  30.   var
  31.     po_Buffer  : ^arch_255;
  32.     by_Temp,
  33.     by_IncSize : byte;
  34.     wo_Index   : word;
  35.   begin
  36.     if (BuffSize > 65520) then
  37.       begin
  38.         PosSearch := $FFFF;
  39.         exit
  40.       end;
  41.     wo_Index := 0;
  42.     by_IncSize := (255 - pred(length(Pattern)));
  43.     po_Buffer := addr(Buffer);
  44.     repeat
  45.       by_Temp := pos(Pattern, po_Buffer^);
  46.       if (by_Temp = 0) then
  47.         begin
  48.           inc(wo_Index, by_IncSize);
  49.           inc(arwo_2(po_Buffer)[1], by_IncSize)
  50.         end
  51.       else
  52.         inc(wo_Index, by_Temp)
  53.     until (by_Temp <> 0) or (wo_Index > BuffSize);
  54.     if (by_Temp = 0) then
  55.       PosSearch := 0
  56.     else
  57.       PosSearch := wo_Index
  58.   end;        (* PosSearch.                                           *)
  59.  
  60.  
  61. type
  62.   arby_64K = array[1..65520] of byte;
  63.  
  64. var
  65.   Index   : word;
  66.   st_Temp : string[20];
  67.   Buffer  : ^arby_64K;
  68.  
  69. BEGIN
  70.   new(Buffer);
  71.   fillchar(Buffer^, sizeof(Buffer^), 0);
  72.   st_Temp := '12345678901234567890';
  73.   move(st_Temp[1], Buffer^[65501], length(st_Temp));
  74.   Index := PosSearch(Buffer^, sizeof(Buffer^), st_Temp);
  75.   writeln(st_Temp, ' found at offset ', Index)
  76. END.
  77.  
  78.                                - Guy
  79. ---
  80.  ■ DeLuxe²/386 1.25 #5060 ■
  81.  * Rose Media, Toronto, Canada : 416-733-2285
  82.  * PostLink(tm) v1.04  ROSE (#1047) : RelayNet(tm)
  83.  
  84.