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

    { Default Compiler Directives}
    {$S-,R-,V-,I-,N-,B-,F-}

    {$IFNDEF Ver40}
      {Allow overlays}
      {$F+,O-,X+,A-}
    {$ENDIF}

    UNIT SEARCH;

    INTERFACE

    function SearchBuffer(var Buffer; BufLength : Word;
                          var Match; MatLength : Word) : Word;
     {-Search through Buffer for Match. BufLength is length of range to search.
       MatLength is length of string to match. Returns number of bytes searched
       to find Match, $FFFF if not found.}

    IMPLEMENTATION

      function SearchBuffer(var Buffer; BufLength : Word;
                      var Match; MatLength : Word) : Word;
       {-Search through Buffer for Match. BufLength is length of range to search.
         MatLength is length of string to match. Returns number of bytes searched
         to find Match, $FFFF if not found.}
      begin
        inline(
          $1E/                   {PUSH DS                 ;Save DS}
          $FC/                   {CLD                     ;Go forward}
          $C4/$7E/<Buffer/       {LES  DI,[BP+<Buffer]    ;ES:DI => Buffer}
          $89/$FB/               {MOV  BX,DI              ;BX = Ofs(Buffer)}
          $8B/$4E/<BufLength/    {MOV  CX,[BP+<BufLength] ;CX = Length of range to scan}
          $8B/$56/<MatLength/    {MOV  DX,[BP+<MatLength] ;DX = Length of match string}
          $85/$D2/               {TEST DX,DX              ;Length(Match) = 0?}
          $74/$24/               {JZ   Error              ;If so, we're done}
          $C5/$76/<Match/        {LDS  SI,[BP+<Match]     ;DS:SI => Match buffer}
          $AC/                   {LODSB                   ;AL = Match[1]; DS:SI => Match[2]}
          $4A/                   {DEC  DX                 ;DX = MatLength-1}
          $29/$D1/               {SUB  CX,DX              ;CX = BufLength-(MatLength-1)}
          $76/$1B/               {JBE  Error              ;Error if BufLength is less}
                                 {;Search for first character in Match}
                                 {Next:}
          $F2/$AE/               {REPNE SCASB             ;Search forward for Match[1]}
          $75/$17/               {JNE  Error              ;Done if not found}
          $85/$D2/               {TEST DX,DX              ;If Length = 1 (DX = 0) ...}
          $74/$0C/               {JZ   Found              ; the "string" was found}
                                 {;Search for remainder of Match}
          $51/                   {PUSH CX                 ;Save CX}
          $57/                   {PUSH DI                 ;Save DI}
          $56/                   {PUSH SI                 ;Save SI}
          $89/$D1/               {MOV  CX,DX              ;CX = Length(Match) - 1}
          $F3/$A6/               {REPE CMPSB              ;Does rest of string match?}
          $5E/                   {POP  SI                 ;Restore SI}
          $5F/                   {POP  DI                 ;Restore DI}
          $59/                   {POP  CX                 ;Restore CX}
          $75/$EC/               {JNE  Next               ;Try again if no match}
                                 {;Calculate number of bytes searched and return}
                                 {Found:}
          $4F/                   {DEC  DI                 ;DX = Offset where found}
          $89/$F8/               {MOV  AX,DI              ;AX = Offset where found}
          $29/$D8/               {SUB  AX,BX              ;Subtract starting offset}
          $EB/$03/               {JMP  SHORT SDone        ;Done}
                                 {;Match was not found}
                                 {Error:}
          $31/$C0/               {XOR  AX,AX              ;Return $FFFF}
          $48/                   {DEC  AX}
                                 {SDone:}
          $1F/                    {POP  DS                 ;Restore DS}
          $89/$46/<SearchBuffer); {MOV [BP+<Search],AX     ;Set func result}
      end;

    END.

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