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


Unit BMoore;

Interface

Type
  bigarray = Array [0..65520] Of
  Byte;
  baptr    = ^bigarray;
  BMTable  = Array [0..255] Of
  Byte;
  
  
Type  pBMSearchObj = ^bmsearchobj;
  bmsearchobj = Object
  Constructor Init (s:string);
  Function   Search (Var buff; size : Word) : Word;
  Destructor Done;

  Private
  Btable : BMTable;
  ss     : String;
End;

Implementation

Constructor bmsearchobj.Init (s:string);
  
Var
  st   : BMTable Absolute s;
  slen : Byte Absolute s;
  x    : Byte;
Begin
{  Move (s, ss, Byte (s) );}
  ss:=s;

  FillChar (Btable, SizeOf (Btable), slen);
  For x := slen DownTo 1 Do
      If (Btable [st [x] ] = slen) Then
         Btable [st [x] ] := slen - x
  End;

Function bmsearchobj.Search (Var buff; size : Word) : Word;

Var
  buffer : bigarray Absolute buff;
  s      : Array [0..255] Of byte Absolute ss;
  len    : Byte Absolute ss;
  s1     : String Absolute ss;
  s2     : String;
  count,
  x      : Word;
  found  : Boolean;
Begin
  s2 [0] := Chr (len);       
  found := False;
  
  count := Pred (len);
  While (Not found) And (count < (size - len) ) Do
        Begin
        If (buffer [count] = s [len]) Then 
           Begin
           If buffer [count - Pred (len) ] = s [1] Then 
              Begin
              Move (buffer [count - Pred (len) ], s2 [1], len);
              found := s1 = s2;                   
              Search := count - Pred (len);      
              End;
           Inc (count);                
           End
        Else
           Inc (count, Btable [buffer [count] ]);   
        End;
  If Not found Then
     Search := $ffff;
End;  

Destructor bmsearchobj.Done;
Begin
End;

End.

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