Subversion Repositories delphiutils

Rev

Rev 5 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. unit PosEx;
  2.  
  3. // © 1997-2005 by FNS Enterprize's™
  4. //   2003-2005 by himitsu @ Delphi-PRAXiS
  5.  
  6. // http://www.delphipraxis.net/topic61002,0,asc,0.html
  7.  
  8. interface
  9.  
  10. Function _Pos       (Const SubStr, S: AnsiString): LongInt; overload;
  11. Function _Pos       (Const SubStr, S: WideString): LongInt; overload;
  12. Function _PosEx     (Const SubStr, S: AnsiString; Offset: LongInt = 1): LongInt; overload;
  13. Function _PosEx     (Const SubStr, S: WideString; Offset: LongInt = 1): LongInt; overload;
  14. Function CountString(Const SubStr, S: AnsiString): Word; overload;
  15. Function CountString(Const SubStr, S: WideString): Word; overload;
  16.  
  17. implementation
  18.  
  19. Function _Pos(Const SubStr, S: AnsiString): LongInt;
  20.   ASM
  21.     PUSH    ESI
  22.     PUSH    EDI
  23.     PUSH    EBX
  24.     TEST    &SubStr, &SubStr
  25.     JE      @Exit
  26.     TEST    &S, &S
  27.     JE      @Exit0
  28.     MOV     ESI, &SubStr
  29.     MOV     EDI, &S
  30.     PUSH    EDI
  31.     MOV     ECX, [EDI - 4]
  32.     MOV     EDX, [ESI - 4]
  33.     DEC     EDX
  34.     JS      @Fail
  35.     MOV     AL, [ESI]
  36.     INC     ESI
  37.     SUB     ECX, EDX
  38.     JLE     @Fail
  39.  
  40.     @Loop:
  41.     REPNE   SCASB
  42.     JNE     @Fail
  43.     MOV     EBX, ECX
  44.     PUSH    ESI
  45.     PUSH    EDI
  46.     MOV     ECX, EDX
  47.     REPE    CMPSB
  48.     POP     EDI
  49.     POP     ESI
  50.     JE      @Found
  51.     MOV     ECX, EBX
  52.     JMP     @Loop
  53.  
  54.     @Fail:
  55.     POP     EDX
  56.  
  57.     @Exit0:
  58.     XOR     EAX, EAX
  59.     JMP     @Exit
  60.  
  61.     @Found:
  62.     POP     EDX
  63.     MOV     EAX, EDI
  64.     SUB     EAX, EDX
  65.  
  66.     @Exit:
  67.     POP     EBX
  68.     POP     EDI
  69.     POP     ESI
  70.   End;
  71.  
  72. Function _Pos(Const SubStr, S: WideString): LongInt;
  73.   ASM
  74.     PUSH    ESI
  75.     PUSH    EDI
  76.     PUSH    EBX
  77.     TEST    &SubStr, &SubStr
  78.     JE      @Exit
  79.     TEST    &S, &S
  80.     JE      @Exit0
  81.     MOV     ESI, &SubStr
  82.     MOV     EDI, &S
  83.     PUSH    EDI
  84.     MOV     ECX, [EDI - 4]
  85.     SAL     EAX, 1
  86.     MOV     EDX, [ESI - 4]
  87.     SAL     EDX, 1
  88.     DEC     EDX
  89.     JS      @Fail
  90.     MOV     AX, [ESI]
  91.     ADD     ESI, 2
  92.     SUB     ECX, EDX
  93.     JLE     @Fail
  94.  
  95.     @Loop:
  96.     REPNE   SCASW
  97.     JNE     @Fail
  98.     MOV     EBX, ECX
  99.     PUSH    ESI
  100.     PUSH    EDI
  101.     MOV     ECX, EDX
  102.     REPE    CMPSW
  103.     POP     EDI
  104.     POP     ESI
  105.     JE      @Found
  106.     MOV     ECX, EBX
  107.     JMP     @Loop
  108.  
  109.     @Fail:
  110.     POP     EDX
  111.  
  112.     @Exit0:
  113.     XOR     EAX, EAX
  114.     JMP     @Exit
  115.  
  116.     @Found:
  117.     POP     EDX
  118.     MOV     EAX, EDI
  119.     SUB     EAX, EDX
  120.     SHR     EAX, 1
  121.  
  122.     @Exit:
  123.     POP     EBX
  124.     POP     EDI
  125.     POP     ESI
  126.   End;
  127.  
  128. Function _PosEx(Const SubStr, S: AnsiString; Offset: LongInt = 1): LongInt;
  129.   ASM
  130.     PUSH    ESI
  131.     PUSH    EDI
  132.     PUSH    EBX
  133.     TEST    &SubStr, &SubStr
  134.     JE      @Exit
  135.     TEST    &S, &S
  136.     JE      @Exit0
  137.     TEST    &Offset, &Offset
  138.     JG      @POff
  139.     MOV     &Offset, 1
  140.     @POff:
  141.     MOV     ESI, &SubStr
  142.     MOV     EDI, &S
  143.     PUSH    EDI
  144.     MOV     EAX, &Offset
  145.     DEC     EAX
  146.     MOV     ECX, [EDI - 4]
  147.     MOV     EDX, [ESI - 4]
  148.     DEC     EDX
  149.     JS      @Fail
  150.     SUB     ECX, EAX
  151.     ADD     EDI, EAX
  152.     MOV     AL, [ESI]
  153.     INC     ESI
  154.     SUB     ECX, EDX
  155.     JLE     @Fail
  156.  
  157.     @Loop:
  158.     REPNE   SCASB
  159.     JNE     @Fail
  160.     MOV     EBX, ECX
  161.     PUSH    ESI
  162.     PUSH    EDI
  163.     MOV     ECX, EDX
  164.     REPE    CMPSB
  165.     POP     EDI
  166.     POP     ESI
  167.     JE      @Found
  168.     MOV     ECX, EBX
  169.     JMP     @Loop
  170.  
  171.     @Fail:
  172.     POP     EDX
  173.  
  174.     @Exit0:
  175.     XOR     EAX, EAX
  176.     JMP     @Exit
  177.  
  178.     @Found:
  179.     POP     EDX
  180.     MOV     EAX, EDI
  181.     SUB     EAX, EDX
  182.  
  183.     @Exit:
  184.     POP     EBX
  185.     POP     EDI
  186.     POP     ESI
  187.   End;
  188.  
  189. Function _PosEx(Const SubStr, S: WideString; Offset: LongInt = 1): LongInt;
  190.   ASM
  191.     PUSH    ESI
  192.     PUSH    EDI
  193.     PUSH    EBX
  194.     TEST    &SubStr, &SubStr
  195.     JE      @Exit
  196.     TEST    &S, &S
  197.     JE      @Exit0
  198.     TEST    &Offset, &Offset
  199.     JG      @POff
  200.     MOV     &Offset, 1
  201.     @POff:
  202.     MOV     ESI, &SubStr
  203.     MOV     EDI, &S
  204.     PUSH    EDI
  205.     PUSH    &Offset
  206.     MOV     ECX, [EDI - 4]
  207.     SAL     ECX, 1
  208.     MOV     EDX, [ESI - 4]
  209.     SAL     EDX, 1
  210.     POP     EAX
  211.     DEC     EAX
  212.     DEC     EDX
  213.     JS      @Fail
  214.     SUB     ECX, EAX
  215.     ADD     EDI, EAX
  216.     ADD     EDI, EAX
  217.     MOV     AX, [ESI]
  218.     ADD     ESI, 2
  219.     SUB     ECX, EDX
  220.     JLE     @Fail
  221.  
  222.     @Loop:
  223.     REPNE   SCASW
  224.     JNE     @Fail
  225.     MOV     EBX, ECX
  226.     PUSH    ESI
  227.     PUSH    EDI
  228.     MOV     ECX, EDX
  229.     REPE    CMPSW
  230.     POP     EDI
  231.     POP     ESI
  232.     JE      @Found
  233.     MOV     ECX, EBX
  234.     JMP     @Loop
  235.  
  236.     @Fail:
  237.     POP     EDX
  238.  
  239.     @Exit0:
  240.     XOR     EAX, EAX
  241.     JMP     @Exit
  242.  
  243.     @Found:
  244.     POP     EDX
  245.     MOV     EAX, EDI
  246.     SUB     EAX, EDX
  247.     SHR     EAX, 1
  248.  
  249.     @Exit:
  250.     POP     EBX
  251.     POP     EDI
  252.     POP     ESI
  253.   End;
  254.  
  255. Function CountString(Const SubStr, S: AnsiString): Word;
  256.   ASM
  257.     PUSH    ESI
  258.     PUSH    EDI
  259.     PUSH    EBX
  260.     TEST    &SubStr, &SubStr
  261.     JE      @Exit
  262.     TEST    &S, &S
  263.     JE      @Exit0
  264.     MOV     ESI, &SubStr
  265.     MOV     EDI, &S
  266.     PUSH    EDI
  267.     MOV     ECX, [EDI - 4]
  268.     MOV     EDX, [ESI - 4]
  269.     DEC     EDX
  270.     JS      @Fail
  271.     XOR     EAX, EAX
  272.     MOV     AL, [ESI]
  273.     INC     ESI
  274.     SUB     ECX, EDX
  275.     JLE     @Fail
  276.  
  277.     @Loop:
  278.     REPNE   SCASB
  279.     JNE     @Ready
  280.     MOV     EBX, ECX
  281.     PUSH    ESI
  282.     PUSH    EDI
  283.     MOV     ECX, EDX
  284.     REPE    CMPSB
  285.     POP     EDI
  286.     POP     ESI
  287.     JNE     @noInc
  288.     CMP     EAX, $FFFF0000
  289.     JAE     @Ready
  290.     ADD     EAX, $00010000
  291.     @noInc:
  292.     MOV     ECX, EBX
  293.     JMP     @Loop
  294.  
  295.     @Fail:
  296.     POP     EDX
  297.  
  298.     @Exit0:
  299.     XOR     EAX, EAX
  300.     JMP     @Exit
  301.  
  302.     @Ready:
  303.     POP     EDX
  304.     SHR     EAX, 16
  305.  
  306.     @Exit:
  307.     POP     EBX
  308.     POP     EDI
  309.     POP     ESI
  310.   End;
  311.  
  312. Function CountString(Const SubStr, S: WideString): Word;
  313.   ASM
  314.     PUSH    ESI
  315.     PUSH    EDI
  316.     PUSH    EBX
  317.     TEST    &SubStr, &SubStr
  318.     JE      @Exit
  319.     TEST    &S, &S
  320.     JE      @Exit0
  321.     MOV     ESI, &SubStr
  322.     MOV     EDI, &S
  323.     PUSH    EDI
  324.     MOV     ECX, [EDI - 4]
  325.     SAL     ECX, 1
  326.     MOV     EDX, [ESI - 4]
  327.     SAL     EDX, 1
  328.     DEC     EDX
  329.     JS      @Fail
  330.     XOR     EAX, EAX
  331.     MOV     AX, [ESI]
  332.     ADD     ESI, 2
  333.     SUB     ECX, EDX
  334.     JLE     @Fail
  335.  
  336.     @Loop:
  337.     REPNE   SCASW
  338.     JNE     @Ready
  339.     MOV     EBX, ECX
  340.     PUSH    ESI
  341.     PUSH    EDI
  342.     MOV     ECX, EDX
  343.     REPE    CMPSW
  344.     POP     EDI
  345.     POP     ESI
  346.     JNE     @noInc
  347.     CMP     EAX, $FFFF0000
  348.     JAE     @Ready
  349.     ADD     EAX, $00010000
  350.     @noInc:
  351.     MOV     ECX, EBX
  352.     JMP     @Loop
  353.  
  354.     @Fail:
  355.     POP     EDX
  356.  
  357.     @Exit0:
  358.     XOR     EAX, EAX
  359.     JMP     @Exit
  360.  
  361.     @Ready:
  362.     POP     EDX
  363.     SHR     EAX, 16
  364.  
  365.     @Exit:
  366.     POP     EBX
  367.     POP     EDI
  368.     POP     ESI
  369.   End;
  370.  
  371. end.
  372.