[Back to FINDREPL SWAG index] [Back to Main SWAG index] [Original]

      Hi, Andy:

      ...Just for fun I also threw together a "PosSearch" routine
      that uses the built-in TP "POS" function. It actually performs
      better than I thought it would, as it takes a string longer than
      15 characters before it starts to become slower than the Boyer-
      Moore function I just posted. (ie: PosSearch is faster than the
      Boyer-Moore routine for strings that are smaller than 16 chars)
      Here's a demo program of the "PosSearch" search routine I put
      together. *Remember* to turn-off "range-checking" {$R-} in your
      finished program, otherwise the PosSearch will take longer than
      it should to execute.

                  (* Public-domain Search routine, using the standard TP  *)
                  (* POS function. Guy McLoughlin - May 1, 1993.          *)
    program DemoPosSearch;

      (***** PosSearch function. Returns 0 if string is not found.        *)
      (*     Returns 65,535 if BufferSize is too large.                   *)
      (*     ie: Greater than 65,520 bytes.                               *)
      (*                                                                  *)
      function PosSearch({input } var Buffer;
                                      BuffSize : word;
                                      Pattern  : string) : {output} word;
      type
        arwo_2    = array[1..2] of word;
        arch_255  = array[1..255] of char;
      var
        po_Buffer  : ^arch_255;
        by_Temp,
        by_IncSize : byte;
        wo_Index   : word;
      begin
        if (BuffSize > 65520) then
          begin
            PosSearch := $FFFF;
            exit
          end;
        wo_Index := 0;
        by_IncSize := (255 - pred(length(Pattern)));
        po_Buffer := addr(Buffer);
        repeat
          by_Temp := pos(Pattern, po_Buffer^);
          if (by_Temp = 0) then
            begin
              inc(wo_Index, by_IncSize);
              inc(arwo_2(po_Buffer)[1], by_IncSize)
            end
          else
            inc(wo_Index, by_Temp)
        until (by_Temp <> 0) or (wo_Index > BuffSize);
        if (by_Temp = 0) then
          PosSearch := 0
        else
          PosSearch := wo_Index
      end;        (* PosSearch.                                           *)

    type
      arby_64K = array[1..65520] of byte;

    var
      Index   : word;
      st_Temp : string[20];
      Buffer  : ^arby_64K;

    BEGIN
      new(Buffer);
      fillchar(Buffer^, sizeof(Buffer^), 0);
      st_Temp := '12345678901234567890';
      move(st_Temp[1], Buffer^[65501], length(st_Temp));
      Index := PosSearch(Buffer^, sizeof(Buffer^), st_Temp);
      writeln(st_Temp, ' found at offset ', Index)
    END.

                                   - Guy
    ---
     þ DeLuxeý/386 1.25 #5060 þ
     * Rose Media, Toronto, Canada : 416-733-2285
     * PostLink(tm) v1.04  ROSE (#1047) : RelayNet(tm)

[Back to FINDREPL SWAG index] [Back to Main SWAG index] [Original]