home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / sd386v50.zip / sd386src.zip / FINDVSTR.ASM < prev    next >
Assembly Source File  |  1992-03-02  |  3KB  |  93 lines

  1.         page    ,132
  2.         title   Variable Length String Match Routine
  3.         subttl  Copyright (C) 1988 by IBM (J.E.Christensen)
  4.         name    FINDVSTR
  5.  
  6.         .386
  7.  
  8. _TEXT   SEGMENT  DWORD USE32 PUBLIC 'CODE'
  9. _TEXT      ENDS
  10. _DATA   SEGMENT  DWORD USE32 PUBLIC 'DATA'
  11.         align 4
  12. _DATA      ENDS
  13.         ASSUME   CS: FLAT, DS: FLAT, SS: FLAT, ES: FLAT
  14. PUBLIC  FindVstr
  15. _TEXT   SEGMENT  DWORD USE32 PUBLIC 'CODE'
  16. ;------------------------------------------------------------------------------;
  17. ; name          findvstr -- String matching
  18. ;
  19. ; synopsis      n = findvstr( sptr, vstrs, nvstrs );
  20. ;               int n;          /* index of matching varstr (1..N), or zero */
  21. ;               varstr *sptr;   /* variable length string to find (len,chars) */
  22. ;               varstr *vstrs;  /* concatenation of varstrs to match against */
  23. ;               int nvstrs;     /* # of variable length strings */
  24. ;
  25. ; description   This function returns the index (1..N) of the matching varstr,
  26. ;               or zero if no match is found.
  27. ;
  28. ; assumptions   Pointers are 32-bits, and a near (32) call was used.
  29. ;------------------------------------------------------------------------------;
  30.  
  31. sptr      =  8
  32. vstrs     = 12
  33. nvstrs    = 16
  34.  
  35. FindVstr  PROC NEAR
  36.         push    EBP
  37.         mov     EBP,ESP
  38.         push    ESI
  39.         push    EDI
  40.         push    EBX
  41.         push    ECX
  42.         push    EDX
  43.  
  44.         mov     ECX, [EBP+nvstrs]
  45.         jcxz    fs30                    ;jump if no varstrs to match
  46.  
  47. ;       les     EBX, [EBP+sptr]         ;es:Ebx -> pattern
  48.         mov     EBX, [EBP+sptr]         ;es:Ebx -> pattern          209
  49.         mov     ah,es:[EBX]             ;ah = length of pattern
  50.         inc     EBX                     ;es:EBX -> 1st char of pattern
  51.  
  52. ;       lds     EDX, [EBP+vstrs]        ;ds:EDX -> 1st varstr to match against
  53.         mov     EDX, [EBP+vstrs]        ;ds:EDX -> 1st varstr to match     209
  54. fs10:
  55.         mov     ESI, EDX                ;ds:ESI -> next varstr to match
  56.         lodsb                           ;al = length of varstr to match
  57.         cmp     ah, al                  ;if same length as pattern
  58.         je      fs40                    ;then jump
  59. fs20:
  60.         inc     EDX
  61.         PUSH    EBX
  62.         MOVZX   EBX, AL
  63.         ADD     EDX, EBX
  64.         POP     EBX
  65.  
  66.         loop    fs10
  67. fs30:
  68.         xchg    EAX, ECX
  69.         pop     EDX
  70.         pop     ECX
  71.         pop     EBX
  72.         pop     EDI
  73.         pop     ESI
  74.         pop     EBP
  75.         ret
  76. fs40:
  77.         push    ECX
  78.         XOR     ECX,ECX
  79.         mov     cl, al
  80.         mov     EDI, EBX
  81.         repe    cmpsb
  82.         pop     ECX
  83.         jne     fs20
  84.  
  85.         sub     ECX, [EBP+nvstrs]
  86.         neg     ECX                      ;cx = 0 to nvstrs-1
  87.         inc     ECX                      ;cx = 1 to nvstrs
  88.         jmp     fs30
  89. FindVstr endp
  90.  
  91. _TEXT   ends
  92.         end
  93.