home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / progm / tptools.zip / ALLINST.ZIP / SEARCH.ASM < prev    next >
Assembly Source File  |  1987-12-21  |  3KB  |  83 lines

  1.  
  2. ;       SEARCH.ASM
  3. ;       Editor Toolbox 4.0
  4. ;       Copyright (c) 1985, 87 by Borland International, Inc.
  5.  
  6.  
  7. CODE    SEGMENT BYTE PUBLIC
  8.  
  9.         ASSUME  CS:CODE
  10.  
  11.         PUBLIC  Search
  12.  
  13. ;****************************************************** Search
  14.  
  15. ;function Search(var Buffer; BufLength : Word; St : String) : Word;
  16.  
  17. ;Search through Buffer for St. BufLength is length of range to search.
  18. ;Returns number of bytes searched to find St, 0 if not found
  19.  
  20. ;equates for parameters:
  21. SearchSt        EQU     DWORD PTR [BP+6]
  22. BufLength       EQU     WORD PTR  [BP+10]
  23. Buffer          EQU     DWORD PTR [BP+12]
  24.  
  25. Search  PROC FAR
  26.  
  27.         PUSH    BP                      ;Save BP
  28.         MOV     BP,SP                   ;Set up stack frame
  29.         PUSH    DS                      ;Save DS
  30.         CLD                             ;Go forward
  31.         LES     DI,Buffer               ;ES:DI => Buffer
  32.         MOV     BX,DI                   ;BX = Ofs(Buffer)
  33.         MOV     CX,BufLength            ;CX = Length of range to scan
  34.         LDS     SI,SearchSt             ;DS:SI => SearchSt[0]
  35.         MOV     DL,[SI]                 ;DL = Length(St)
  36.         INC     SI                      ;DS:SI => SearchSt[1]
  37.         LODSB                           ;AL = St[1]; DS:SI => SearchSt[2]
  38.         TEST    DL,DL                   ;Length(St) = 0?
  39.         JZ      Error                   ;If so, we're done
  40.         XOR     DH,DH                   ;Clear DH
  41.         DEC     DL                      ;DX = Length(St)-1
  42.         SUB     CX,DX                   ;CX = BufLength - (Length(St)-1)
  43.         JBE     Error                   ;Error if BufLength is less
  44.  
  45. Next:   ;Search for first character in St
  46.  
  47.         REPNE   SCASB                   ;Search forward for St[1]
  48.         JNE     Error                   ;Done if not found
  49.         TEST    DX,DX                   ;If Length = 1 (DX = 0) ...
  50.         JZ      Found                   ; the "string" was found
  51.  
  52.         ;Search for remainder of St
  53.  
  54.         PUSH    CX                      ;Save CX
  55.         PUSH    DI                      ;Save DI
  56.         PUSH    SI                      ;Save SI
  57.         MOV     CX,DX                   ;CX = Length(St) - 1
  58.         REPE    CMPSB                   ;Does rest of string match?
  59.         POP     SI                      ;Restore SI
  60.         POP     DI                      ;Restore DI
  61.         POP     CX                      ;Restore CX
  62.         JNE     Next                    ;Try again if no match
  63.  
  64. Found:  ;Calculate number of bytes searched and return in St
  65.  
  66.         DEC     DI                      ;DX = Offset where found
  67.         MOV     AX,DI                   ;AX = Offset where found
  68.         SUB     AX,BX                   ;Subtract starting offset
  69.         JMP     Done                    ;Done
  70. Error:
  71.         XOR     AX,AX                   ;Return 0
  72. Done:
  73.         POP     DS                      ;Restore DS
  74.         MOV     SP,BP                   ;Restore SP
  75.         POP     BP                      ;Restore BP
  76.         RET     10                      ;Remove parameters and return
  77.  
  78. Search  ENDP
  79.  
  80. CODE    ENDS
  81.  
  82.         END
  83.