home *** CD-ROM | disk | FTP | other *** search
/ POINT Software Programming / PPROG1.ISO / pascal / swag / findrepl.swg / 0002_BMSEARCH.PAS.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-05-28  |  3.7 KB  |  72 lines

  1. { Default Compiler Directives}
  2. {$S-,R-,V-,I-,N-,B-,F-}
  3.  
  4. {$IFNDEF Ver40}
  5.   {Allow overlays}
  6.   {$F+,O-,X+,A-}
  7. {$ENDIF}
  8.  
  9. UNIT SEARCH;
  10.  
  11. INTERFACE
  12.  
  13. function SearchBuffer(var Buffer; BufLength : Word;
  14.                       var Match; MatLength : Word) : Word;
  15.  {-Search through Buffer for Match. BufLength is length of range to search.
  16.    MatLength is length of string to match. Returns number of bytes searched
  17.    to find Match, $FFFF if not found.}
  18.  
  19. IMPLEMENTATION
  20.  
  21.   function SearchBuffer(var Buffer; BufLength : Word;
  22.                   var Match; MatLength : Word) : Word;
  23.    {-Search through Buffer for Match. BufLength is length of range to search.
  24.      MatLength is length of string to match. Returns number of bytes searched
  25.      to find Match, $FFFF if not found.}
  26.   begin
  27.     inline(
  28.       $1E/                   {PUSH DS                 ;Save DS}
  29.       $FC/                   {CLD                     ;Go forward}
  30.       $C4/$7E/<Buffer/       {LES  DI,[BP+<Buffer]    ;ES:DI => Buffer}
  31.       $89/$FB/               {MOV  BX,DI              ;BX = Ofs(Buffer)}
  32.       $8B/$4E/<BufLength/    {MOV  CX,[BP+<BufLength] ;CX = Length of range to scan}
  33.       $8B/$56/<MatLength/    {MOV  DX,[BP+<MatLength] ;DX = Length of match string}
  34.       $85/$D2/               {TEST DX,DX              ;Length(Match) = 0?}
  35.       $74/$24/               {JZ   Error              ;If so, we're done}
  36.       $C5/$76/<Match/        {LDS  SI,[BP+<Match]     ;DS:SI => Match buffer}
  37.       $AC/                   {LODSB                   ;AL = Match[1]; DS:SI => Match[2]}
  38.       $4A/                   {DEC  DX                 ;DX = MatLength-1}
  39.       $29/$D1/               {SUB  CX,DX              ;CX = BufLength-(MatLength-1)}
  40.       $76/$1B/               {JBE  Error              ;Error if BufLength is less}
  41.                              {;Search for first character in Match}
  42.                              {Next:}
  43.       $F2/$AE/               {REPNE SCASB             ;Search forward for Match[1]}
  44.       $75/$17/               {JNE  Error              ;Done if not found}
  45.       $85/$D2/               {TEST DX,DX              ;If Length = 1 (DX = 0) ...}
  46.       $74/$0C/               {JZ   Found              ; the "string" was found}
  47.                              {;Search for remainder of Match}
  48.       $51/                   {PUSH CX                 ;Save CX}
  49.       $57/                   {PUSH DI                 ;Save DI}
  50.       $56/                   {PUSH SI                 ;Save SI}
  51.       $89/$D1/               {MOV  CX,DX              ;CX = Length(Match) - 1}
  52.       $F3/$A6/               {REPE CMPSB              ;Does rest of string match?}
  53.       $5E/                   {POP  SI                 ;Restore SI}
  54.       $5F/                   {POP  DI                 ;Restore DI}
  55.       $59/                   {POP  CX                 ;Restore CX}
  56.       $75/$EC/               {JNE  Next               ;Try again if no match}
  57.                              {;Calculate number of bytes searched and return}
  58.                              {Found:}
  59.       $4F/                   {DEC  DI                 ;DX = Offset where found}
  60.       $89/$F8/               {MOV  AX,DI              ;AX = Offset where found}
  61.       $29/$D8/               {SUB  AX,BX              ;Subtract starting offset}
  62.       $EB/$03/               {JMP  SHORT SDone        ;Done}
  63.                              {;Match was not found}
  64.                              {Error:}
  65.       $31/$C0/               {XOR  AX,AX              ;Return $FFFF}
  66.       $48/                   {DEC  AX}
  67.                              {SDone:}
  68.       $1F/                    {POP  DS                 ;Restore DS}
  69.       $89/$46/<SearchBuffer); {MOV [BP+<Search],AX     ;Set func result}
  70.   end;
  71.  
  72. END.