KString.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:30k
源码类别:

模拟服务器

开发平台:

C/C++

  1. //////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. //  FileName    :   KString.h
  4. //  Version     :   1.0
  5. //  Creater     :   Freeway Chen
  6. //  Date        :   1998-10-16
  7. //  Comment     :   String Rounte from Delphi 4.0
  8. //
  9. //////////////////////////////////////////////////////////////////////////////////////
  10. #ifndef _KSTRING_H_
  11. #define _KSTRING_H_     1
  12. #include "KSChar.h"
  13. #ifdef _XP_LINUX_
  14. #include <ctype.h>
  15. #include <string.h>
  16. inline int StrLen(const char *Str1)
  17. {
  18.     return strlen(Str1);
  19. }
  20. inline char * StrCpy(char *Dest, const char *Source)
  21. {
  22.     return strcpy(Dest, Source);
  23. }
  24. inline char * StrNCpy(char *Dest,const char *Source, int MaxLen)
  25. {
  26.     return strncpy(Dest, Source, MaxLen);
  27. }
  28. inline int StrCmp(const char *Str1, const char *Str2)
  29. {
  30.     return strcmp(Str1, Str2);
  31. }
  32. inline int StrNCmp(const char *Str1, const char *Str2, unsigned MaxLen)
  33. {
  34.     return strncmp(Str1, Str2, MaxLen);
  35. }
  36. inline int StrICmp(const char *Str1, const char *Str2)
  37. {
  38.     int f, l;
  39.     do {
  40.         f = tolower(*Str1);
  41.         Str1++;
  42.         l = tolower(*Str2);
  43.         Str2++;
  44.     } while ( f && (f == l) );
  45.     return (f - l);
  46. }
  47. inline int StrNICmp(const char *Str1, const char *Str2, unsigned Len)
  48. {
  49.     int f, l;
  50.     if (!Len)
  51.         return 0;
  52.     do {
  53.         f = tolower(*Str1);
  54.         Str1++;
  55.         l = tolower(*Str2);
  56.         Str2++;
  57.     } while (--Len && f && (f == l));
  58.     return (f - l);
  59. }
  60. inline char * StrChr(const char *Str1, const char Chr)
  61. {
  62.     return strchr(Str1, Chr);
  63. }
  64. inline char *StrStr(const char *Str1, const char *Str2)
  65. {
  66.     return strstr(Str1, Str2);
  67. }
  68. inline char * StrRChr(const char *Str1, const char Chr)
  69. {
  70.     return strrchr(Str1, Chr);
  71. }
  72. inline void MemCpy(void *Dst, const void *Src, unsigned int tSize)
  73. {
  74.     memcpy(Dst, Src, tSize);
  75. }
  76. inline void MemMove(void *Dst, const void *Src, unsigned int tSize)
  77. {
  78.     memmove(Dst, Src, tSize);
  79. }
  80. // return 0 equal
  81. // return 1 not equal
  82. inline int  FastMemCmp(const void *Dst, const void *Src, unsigned int tSize)
  83. {
  84.     int nRetCode = memcmp(Dst, Src, tSize);
  85.     return !(nRetCode == 0);
  86. }
  87. inline int MemCmp(const void *Dst, const void *Src, unsigned int tSize)
  88. {
  89.     return memcmp(Dst, Src, tSize);
  90. }
  91. inline void MemSet(void *Buffer, char ch1, size_t Count)
  92.     memset(Buffer, ch1, Count);
  93. }
  94. inline void MemZero(void *Buffer, size_t Count)
  95.     memset(Buffer, 0, Count);
  96. }
  97. inline void * MemChr(const void *Buffer, char Chr, size_t Count)
  98. {
  99.     return memchr(Buffer, Chr, Count);
  100. }
  101. // search a Integer
  102. inline void * MemInt(const void *Buffer, int nInt, size_t Count)
  103. {
  104.     int *pnBuffer = (int *)Buffer;
  105.     while (Count--)
  106.     {
  107.         if ((*pnBuffer) == nInt)
  108.             return (void *)pnBuffer;
  109.         
  110.         pnBuffer++;
  111.     }
  112.     return NULL;
  113. }
  114. inline char * StrCat(char *DestStr, const char *SrcStr)
  115. {
  116.     return strcat(DestStr, SrcStr);
  117. }
  118. inline char * StrUpper(char *SrcStr)
  119. {
  120.     char * cp;
  121.     for (cp = SrcStr; *cp; ++cp)
  122.     {
  123.         if (
  124.             ('a' <= *cp) && 
  125.             (*cp <= 'z')
  126.         )
  127.             *cp += 'A' - 'a';
  128.     }
  129.     return SrcStr;
  130. }
  131. inline char * StrSetEmpty(char *pszStr)
  132. {
  133.     *pszStr = '';
  134.     return pszStr;
  135. }
  136. inline int StrIsEmpty(const char *pszStr)
  137. {
  138.     return ('' == *pszStr);
  139. }
  140. inline char * StrSetEnd(char *pszStr)
  141. {
  142.     *pszStr = '';
  143.     return pszStr;
  144. }
  145. inline int StrIsEnd(const char *pszStr)
  146. {
  147.     return ('' == *pszStr);
  148. }
  149. #else   // not _XP_LINUX_                   
  150. // ------------------------------------------------------
  151. // VC Complier general :
  152. // push ebx esi edi
  153. // pop edi esi ebx
  154. // code when One Function
  155. // -------------------------------------------------------
  156. //#ifdef __BORLANDC__
  157. //#pragma inline
  158. //#define inline static
  159. //#define __asm _asm
  160. //#endif
  161. #include "KWString.h"
  162. inline int _fastcall StrLen(const char *Str1)
  163. {
  164.     int Len;
  165.     __asm cld
  166.     __asm MOV    edi, [Str1]
  167.     __asm MOV    ECX,0xFFFFFFFF
  168.     __asm XOR    AL,AL
  169.     __asm REPNE  SCASB
  170.     __asm MOV    EAX,0xFFFFFFFE
  171.     __asm SUB    EAX,ECX
  172.     __asm MOV    [Len], EAX
  173.     return Len;
  174. }
  175. inline char * _fastcall StrCpy(char *Dest, const char *Source)
  176. {
  177.     char *RetStr;
  178.     __asm cld
  179.     __asm MOV    ESI,[Source]
  180.     __asm MOV    EDX,[Dest]
  181.     __asm MOV    EDI,ESI
  182.     __asm MOV    ECX,0xFFFFFFFF
  183.     __asm XOR    AL,AL
  184.     __asm REPNE  SCASB
  185.     __asm NOT    ECX
  186.     __asm MOV    EDI,EDX
  187.     __asm MOV    EDX,ECX
  188.     __asm MOV    EAX,EDI
  189.     __asm SHR    ECX,2
  190.     __asm REP    MOVSD
  191.     __asm MOV    ECX,EDX
  192.     __asm AND    ECX,3
  193.     __asm REP    MOVSB
  194.     __asm MOV    [RetStr], EAX
  195.     return RetStr;
  196. }
  197. inline char * _fastcall StrNCpy(char *Dest,const char *Source, int MaxLen)
  198. {
  199.     char *RetStr;
  200.     __asm cld
  201.     __asm MOV    ESI,[Dest]
  202.     __asm MOV    EDX,[Source]
  203.     __asm MOV    EDI, EDX
  204.     __asm MOV    ECX,[MaxLen]
  205.     __asm MOV    EBX,ECX
  206.     __asm XOR    AL,AL
  207.     __asm TEST   ECX, ECX
  208.     __asm JZ     Label2
  209.     __asm REPNE  SCASB
  210.     __asm JNE    Label1
  211.     __asm INC    ECX
  212.     Label1:
  213.     __asm SUB    EBX,ECX
  214.     __asm MOV    EDI,ESI
  215.     __asm MOV    ESI,EDX
  216.     __asm MOV    EDX,EDI
  217.     __asm MOV    ECX,EBX
  218.     __asm SHR    ECX,2
  219.     __asm REP    MOVSD
  220.     __asm MOV    ECX,EBX
  221.     __asm AND    ECX,3
  222.     __asm REP    MOVSB
  223.     __asm STOSB
  224.     __asm MOV    ESI,EDX
  225.     Label2://Exit
  226.     __asm mov [RetStr], ESI
  227.     return RetStr;
  228. }
  229. inline int _fastcall StrCmp(const char *Str1, const char *Str2)
  230. {
  231.     int RetCode;
  232.     __asm cld
  233.     __asm MOV    EDI,[Str1]
  234.     __asm MOV    ESI,[Str2]
  235.     __asm mov    edx,edi
  236.     __asm MOV    ECX, -1
  237.     __asm XOR    EAX,EAX
  238.     __asm REPNE  SCASB
  239.     __asm NOT    ECX
  240.     __asm MOV    EDI,EDX
  241.     __asm XOR    EDX,EDX
  242.     __asm REPE   CMPSB
  243.     __asm MOV    AL,[EDI-1]
  244.     __asm MOV    DL,[ESI-1]
  245.     __asm SUB    EAX, EDX
  246.     __asm mov    [RetCode], eax
  247.     return RetCode;
  248. }
  249. inline int _fastcall StrNCmp(const char *Str1, const char *Str2, unsigned MaxLen)
  250. {
  251.     int RetCode;
  252.     
  253.     __asm MOV     EDI,[Str1]
  254.     __asm MOV     ESI,[Str2]
  255.     __asm mov     ECX,[MaxLen]
  256.     __asm mov     EDX,EDI
  257.     __asm MOV     EBX,ECX
  258.     __asm XOR     EAX,EAX
  259.     __asm OR      ECX,ECX
  260.     __asm JE      Label1
  261.     __asm REPNE   SCASB
  262.     __asm SUB     EBX,ECX
  263.     __asm MOV     ECX,EBX
  264.     __asm MOV     EDI,EDX
  265.     __asm XOR     EDX,EDX
  266.     __asm REPE    CMPSB
  267.     __asm MOV     AL, [EDI-1]
  268.     __asm MOV     DL, [ESI-1]
  269.     __asm SUB     EAX,EDX
  270. Label1:        
  271.     __asm mov [RetCode], eax
  272.     return RetCode;
  273. }
  274. inline int _fastcall StrICmp(const char *Str1, const char *Str2)
  275. {
  276.     int RetCode;
  277.     __asm cld
  278.     __asm MOV    EDI, [Str1]
  279.     __asm MOV    ESI, [Str2]
  280.     __asm mov    edx, edi
  281.     __asm mov    ebx, offset LowerToUpperTable
  282.     __asm MOV    ECX, -1
  283.     __asm XOR    EAX,EAX
  284.     __asm REPNE  SCASB
  285.     __asm NOT    ECX
  286.     __asm MOV    EDI,EDX
  287.     __asm XOR    EDX,EDX
  288.     Label1:
  289.     __asm REPE   CMPSB
  290.     __asm JE     Lable4 // exit
  291.     __asm MOVZX  EAX, byte ptr [EDI-1]
  292.     __asm MOVZX  EDX, byte ptr [ESI-1]
  293.     __asm MOVZX  EAX, byte ptr [EBX + EAX]
  294.     __asm MOVZX  EDX, byte ptr [EBX + EDX]
  295.     __asm SUB    EAX, EDX
  296.     __asm JE     Label1
  297.     Lable4:
  298.     __asm mov    [RetCode], eax
  299.     return RetCode;
  300. }
  301. inline int _fastcall StrNICmp(const char *Str1, const char *Str2, unsigned Len)
  302. {
  303.     int RetCode;
  304.     __asm cld
  305.     __asm MOV    EDI, [Str1]
  306.     __asm MOV    ESI, [Str2]
  307.     __asm MOV    ECX, [Len]
  308.     __asm mov    edx, edi
  309.     __asm mov    ebx, ecx
  310.     //__asm MOV    ECX, -1
  311.     __asm XOR    EAX,EAX
  312.     __asm REPNE  SCASB
  313.     __asm sub    ebx, ecx
  314.     __asm MOV    EDI,EDX
  315.     __asm mov    ecx, ebx
  316.     __asm XOR    EDX,EDX
  317.     __asm mov    ebx, offset LowerToUpperTable
  318.     Label1:
  319.     __asm REPE   CMPSB
  320.     __asm JE     Lable4 // exit EAX = 0
  321.     __asm MOVZX  EAX, byte ptr [EDI - 1]
  322.     __asm MOVZX  EDX, byte ptr [ESI - 1]
  323.     __asm MOVZX  EAX, byte ptr [EBX + EAX]
  324.     __asm MOVZX  EDX, byte ptr [EBX + EDX]
  325.     __asm SUB    EAX, EDX
  326.     __asm JE     Label1
  327.     Lable4:
  328.     __asm mov    [RetCode], eax
  329.     return RetCode;
  330. }
  331. inline char * _fastcall StrChr(const char *Str1, const char Chr)
  332. {
  333.     char *RetStr;
  334.     __asm cld
  335.     __asm MOV    EAX, [Str1]
  336.     __asm MOV    DL, [Chr]
  337.     __asm PUSH   EAX
  338.     __asm MOV    EDI, EAX
  339.     __asm MOV    ECX,0xFFFFFFFF
  340.     __asm XOR    AL,AL
  341.     __asm REPNE  SCASB
  342.     __asm NOT    ECX
  343.     __asm POP    EDI
  344.     __asm MOV    AL,DL
  345.     __asm REPNE  SCASB
  346.     __asm MOV    EAX,0
  347.     __asm JNE    Label1
  348.     __asm MOV    EAX,EDI
  349.     __asm DEC    EAX
  350.     Label1:
  351.     __asm MOV    [RetStr], EAX
  352.     return RetStr;
  353. }
  354. inline char * _fastcall StrStr(const char *Str1, const char *Str2)
  355. {
  356.     char *RetStr;
  357.     __asm CLD
  358.     __asm MOV     EDX,[Str2]
  359.     __asm MOV     EBX,[Str1]
  360.     __asm MOV     EDI,EDX
  361.     __asm XOR     AL,AL
  362.     __asm MOV     ECX,0FFFFFFFFH
  363.     __asm REPNE   SCASB
  364.     __asm NOT     ECX
  365.     __asm DEC     ECX
  366.     __asm JE      Lable2
  367.     __asm MOV     ESI,ECX
  368.     __asm MOV     EDI,EBX
  369.     __asm MOV     ECX,0FFFFFFFFH
  370.     __asm REPNE   SCASB
  371.     __asm NOT     ECX
  372.     __asm SUB     ECX,ESI
  373.     __asm JBE     Lable2
  374.     __asm MOV     EDI,EBX
  375.     __asm LEA     EBX,[ESI-1]
  376. Lable1:    
  377.     __asm MOV     ESI,EDX
  378.     __asm LODSB
  379.     __asm REPNE   SCASB
  380.     __asm JNE     Lable2
  381.     __asm MOV     EAX,ECX
  382.     __asm PUSH    EDI
  383.     __asm MOV     ECX,EBX
  384.     __asm REPE    CMPSB
  385.     __asm POP     EDI
  386.     __asm MOV     ECX,EAX
  387.     __asm JNE     Lable1
  388.     __asm LEA     EAX,[EDI-1]
  389.     __asm JMP     Lable3
  390. Lable2:    
  391.     __asm XOR     EAX,EAX
  392. Lable3:    
  393.     __asm MOV    [RetStr], EAX
  394.     return RetStr;
  395. }
  396. inline char * _fastcall StrRChr(const char *Str1, const char Chr)
  397. {
  398.     char *RetStr;
  399.     __asm MOV     EDI,[Str1]
  400.     __asm MOV     DL, [Chr]
  401.     __asm MOV     ECX,0xFFFFFFFF
  402.     __asm XOR     AL,AL
  403.     __asm REPNE   SCASB
  404.     __asm NOT     ECX
  405.     __asm STD
  406.     __asm DEC     EDI
  407.     __asm MOV     AL, DL
  408.     __asm REPNE   SCASB
  409.     __asm MOV     EAX,0
  410.     __asm JNE     Lable1
  411.     __asm MOV     EAX,EDI
  412.     __asm INC     EAX
  413.     Lable1:
  414.     __asm CLD
  415.     __asm mov   [RetStr], eax
  416.     return RetStr;
  417. }
  418. /*
  419. #ifdef _INTEL_P4
  420. inline void _fastcall MemCpy(void *Dst, const void *Src, unsigned int tSize)
  421. {
  422.     
  423.     __asm cld
  424.     __asm mov esi, [Src]
  425.     __asm mov edi, [Dst]
  426.     __asm prefetchnta [esi]
  427.     __asm prefetchnta [esi + 64]
  428.     __asm prefetchnta [esi + 128]
  429.     __asm prefetchnta [esi + 192]
  430.     __asm prefetchnta [esi + 256]
  431.     __asm mov ecx, [tSize]
  432.     __asm mov edx, ecx
  433.     __asm shr ecx, 7
  434.     __asm jz Label_Last
  435. Label_Loop:
  436.     __asm prefetchnta [esi + 320]
  437.     __asm movss xmm0, [esi]
  438.     __asm movss xmm1, [esi + 16]
  439.     __asm movss xmm2, [esi + 32]
  440.     __asm movss xmm3, [esi + 48]
  441.     __asm movss xmm4, [esi + 64]
  442.     __asm movss xmm5, [esi + 80]
  443.     __asm movss xmm6, [esi + 96]
  444.     __asm movss xmm7, [esi + 112]
  445.     __asm movss [edi], xmm0
  446.     __asm add esi, 128
  447.     __asm movss [edi + 16], xmm1
  448.     __asm movss [edi + 32], xmm2
  449.     __asm movss [edi + 48], xmm3
  450.     __asm movss [edi + 64], xmm4
  451.     __asm movss [edi + 80], xmm5
  452.     __asm movss [edi + 96], xmm6
  453.     __asm movss [edi + 112], xmm7
  454.     __asm add edi, 128
  455.     __asm dec ecx
  456.     __asm jnz Label_Loop
  457. Label_Last:
  458.     __asm and edx, 0x7f
  459.     __asm mov ecx, edx
  460.     __asm shr ecx, 2
  461.     __asm rep movsd
  462.     __asm mov ecx, edx
  463.     __asm and ecx, 0x3
  464.     __asm rep movsb          // mov BYTE
  465. }
  466. #else
  467. */
  468. inline void _fastcall MemCpy(void *Dst, const void *Src, unsigned int tSize)
  469. {
  470.     //Touch_Register(edx)
  471.     //Touch_Register(ecx)
  472.     //Touch_Register(esi)
  473.     //Touch_Register(edi)
  474.     __asm cld
  475.     __asm mov esi, [Src]
  476.     __asm mov edi, [Dst]
  477.     __asm mov ecx, [tSize]
  478.     __asm mov edx, ecx
  479.     __asm shr ecx, 2   
  480.     __asm rep movsd          // mov DWORD
  481.     __asm mov ecx, edx 
  482.     __asm and ecx, 0x03
  483.     __asm rep movsb          // mov BYTE
  484. }
  485. //#endif
  486. // Get Following Code From C++Builder 5.0
  487. inline void _fastcall MemMove(void *Dst, const void *Src, unsigned int tSize)
  488. {
  489.     __asm mov esi, [Src]
  490.     __asm mov edi, [Dst]
  491.     __asm mov ecx, [tSize]
  492.     __asm cmp edi, esi              // dest < source ?
  493.     __asm mov edx, ecx
  494.     __asm jb  MOV_UP                // yes, do a simple forward move
  495.     __asm je  MOV_END               // dest == source ? do nothing
  496.     
  497.     // MOV_DOWN
  498.     __asm STD                       // force esi and edi to decrement
  499.     __asm lea esi, [esi + ecx - 1]  // point to last byte of source buffer
  500.     __asm lea edi, [edi + ecx - 1]  // point to last byte of dest buffer
  501.     __asm and ecx, 3                // copy trailing bytes
  502.     __asm rep movsb
  503.     __asm mov ecx, edx              // get original count back
  504.     __asm shr ecx, 2                // calculate no. of longwords
  505.     __asm sub esi, 3                // point to previous longword in source
  506.     __asm sub edi, 3                // point to previous longword in dest
  507.     __asm rep movsd                 // copy longwords
  508.     __asm cld                       // clear direction flag
  509.     __asm jmp short MOV_END
  510.     MOV_UP:
  511.     __asm cld
  512.     __asm shr ecx, 2
  513.     __asm rep movsd                 // copy longwords
  514.     __asm mov ecx, edx              // get original count back
  515.     __asm and ecx, 3                // calculate remainder byte count (0-3)
  516.     __asm rep movsb                 // copy remaining bytes
  517.     MOV_END:
  518.     return;
  519. }
  520. // return 0 equal
  521. // return 1 not equal
  522. inline int _fastcall FastMemCmp(const void *Dst, const void *Src, unsigned int tSize)
  523. {
  524.     //Touch_Register(edx)
  525.     //Touch_Register(ecx)
  526.     //Touch_Register(esi)
  527.     //Touch_Register(edi)
  528.     int RetCode;
  529.     __asm cld
  530.     __asm mov esi, [Src]
  531.     __asm mov edi, [Dst]
  532.     __asm mov ecx, [tSize]
  533.     __asm mov eax, 1      // not equal
  534.     __asm mov edx, ecx
  535.     __asm shr ecx, 2
  536.     __asm and edx, 0x03
  537.     __asm rep cmpsd          // cmp DWORD
  538.     __asm jne Exit2
  539.     __asm mov ecx, edx 
  540.     __asm rep cmpsb          // cmp BYTE
  541.     __asm jne Exit2
  542.     __asm dec eax           // equal  0
  543.     Exit2:
  544.     __asm mov [RetCode], eax
  545.     return RetCode;
  546. }
  547. inline int _fastcall MemCmp(const void *Dst, const void *Src, unsigned int tSize){
  548.     //Touch_Register(edx)
  549.     //Touch_Register(ecx)
  550.     //Touch_Register(esi)
  551.     //Touch_Register(edi)
  552.     int RetCode;
  553.     __asm cld
  554.     __asm mov esi, [Src]
  555.     __asm mov edi, [Dst]
  556.     __asm mov ecx, [tSize]
  557.     __asm xor eax, eax
  558.     __asm xor edx, edx
  559.     __asm rep cmpsb          // mov DWORD
  560.     __asm jz Exit1
  561.     // not equal
  562.     __asm mov al, [edi-1]
  563.     __asm mov dl, [esi-1]
  564.     __asm sub eax, edx
  565.     Exit1:
  566.     __asm mov [RetCode], eax
  567.     return RetCode;
  568. }
  569. //#ifdef _INTEL_P4
  570. //
  571. //inline void _fastcall MemSet(void *Buffer, char ch1, size_t Count)
  572. //{
  573. //    __asm CLD
  574. //    __asm MOV     EDI, [Buffer] // Point EDI to destination
  575. //    __asm MOV     ECX, [Count]
  576. //    __asm MOV     DL, [ch1]
  577. //
  578. //    __asm mov     DH, DL
  579. //    __asm mov     eax, edx
  580. //    __asm shl     eax, 16
  581. //    __asm mov     ax, dx
  582. //    __asm movd    xmm0, eax
  583. //    __asm movd    xmm1, eax
  584. //    __asm pslldq  xmm0, 32
  585. //    __asm por     xmm0, xmm1
  586. //    __asm mov     xmm1, xmm0
  587. //    __asm pslldq  xmm0, 64
  588. //    __asm por     xmm0, xmm1
  589. //
  590. //
  591. //
  592. //
  593. //}
  594. //
  595. //#else
  596. inline void _fastcall MemSet(void *Buffer, char ch1, size_t Count)
  597.     __asm CLD
  598.     __asm MOV     EDI, [Buffer] // Point EDI to destination    
  599.     __asm MOV     ECX, [Count]
  600.     __asm MOV     DL, [ch1]
  601.     __asm MOV     DH,DL   // Fill EAX with value repeated 4 times
  602.     __asm MOV     EAX,EDX
  603.     __asm SHL     EAX,16
  604.     __asm MOV     AX,DX
  605.     __asm MOV     EDX, ECX
  606.     __asm SAR     ECX,2
  607.     __asm JS      Exit1
  608.     __asm REP     STOSD   // Fill count DIV 4 dwords
  609.     __asm MOV     ECX,EDX
  610.     __asm AND     ECX,3
  611.     __asm REP     STOSB   // Fill count MOD 4 bytes
  612.     Exit1:
  613.     return;
  614. }
  615. inline void _fastcall MemZero(void *Buffer, size_t Count)
  616.     __asm CLD
  617.     __asm MOV     EDI, [Buffer] // Point EDI to destination    
  618.     __asm MOV     ECX, [Count]
  619.     __asm xor     eax, eax
  620.     __asm MOV     EDX, ECX
  621.     __asm SAR     ECX,2
  622.     __asm JS      Exit1
  623.     __asm REP     STOSD   // Fill count DIV 4 dwords
  624.     __asm MOV     ECX,EDX
  625.     __asm AND     ECX,3
  626.     __asm REP     STOSB   // Fill count MOD 4 bytes
  627.     Exit1:
  628.     return;
  629. }
  630. //#endif
  631. inline void * _fastcall MemChr(const void *Buffer, char Chr, size_t Count)
  632. {
  633.     void *RetBuffer;
  634.     __asm cld
  635.     __asm MOV    EDI, [Buffer]
  636.     __asm MOV   ECX, [Count]
  637.     __asm MOV    AL, [Chr]
  638.     __asm REPNE  SCASB
  639.     __asm MOV    EAX, 0
  640.     __asm JNE    Label1
  641.     __asm MOV    EAX,EDI
  642.     __asm DEC    EAX
  643.     Label1:
  644.     __asm MOV    [RetBuffer], EAX
  645.     return RetBuffer;
  646. }
  647. // search a Integer
  648. inline void * _fastcall MemInt(const void *Buffer, int nInt, size_t Count)
  649. {
  650.     void *RetBuffer;
  651.     __asm MOV    [RetBuffer], 0
  652.     __asm CLD
  653.     __asm MOV    EDI, [Buffer]
  654.     __asm MOV    ECX, [Count]
  655.     __asm SUB    ECX, 4         //
  656.     __asm JB     Label0         // for protect bounds, follow 'cmp eax, [edi]'
  657.     __asm INC    ECX            //
  658.     __asm MOV    EAX, [nInt]
  659.     Loop0:
  660.     __asm REPNE  SCASB
  661.     __asm JNE    Label0
  662.     __asm CMP    EAX, [EDI - 1]
  663.     __asm JNE    Loop0
  664.     __asm LEA    EAX, [EDI - 1]
  665.     __asm MOV    [RetBuffer], EAX
  666.     Label0:
  667.     return RetBuffer;
  668. }
  669. inline char * _fastcall StrEnd(char *Str1)
  670. {
  671.     char *RetStr;
  672.     __asm MOV     ECX,0xFFFFFFFF
  673.     __asm XOR     AL,AL
  674.     __asm MOV     EDI,[Str1]
  675.     __asm REPNE   SCASB
  676.     __asm LEA     EAX,[EDI-1]
  677.     __asm MOV     [RetStr], EAX
  678.     return RetStr;
  679. }
  680. inline char * _fastcall StrCat(char *DestStr, const char *SrcStr)
  681. {
  682.     return StrCpy(StrEnd(DestStr), SrcStr);
  683. }
  684. inline char * _fastcall StrUpper(char *SrcStr)
  685. {
  686.     char *RetStr;
  687.     __asm push esi
  688.     __asm mov esi, [SrcStr]
  689.     __asm mov edx, [SrcStr]
  690.     Label1:
  691.     __asm movzx eax, byte ptr [esi]
  692.     __asm inc esi
  693.     __asm test eax, eax
  694.     __asm jz Label2
  695.     __asm mov al, LowerToUpperTable[eax]
  696.     __asm mov [esi - 1], al
  697.     __asm jmp short Label1
  698.     Label2:
  699.     __asm mov [RetStr], edx
  700.     __asm pop esi
  701.     return RetStr;
  702. }
  703. inline char * _fastcall StrSetEmpty(char *pszStr)
  704. {
  705.     *pszStr = '';
  706.     return pszStr;
  707. }
  708. inline int _fastcall StrIsEmpty(const char *pszStr)
  709. {
  710.     return ('' == *pszStr);
  711. }
  712. inline char * _fastcall StrSetEnd(char *pszStr)
  713. {
  714.     *pszStr = '';
  715.     return pszStr;
  716. }
  717. inline int _fastcall StrIsEnd(const char *pszStr)
  718. {
  719.     return ('' == *pszStr);
  720. }
  721. /*
  722. inline char *StrMove(char *Dest, char *Source,int Count)
  723. {
  724.     __asm{
  725.         MOV     ESI,[Source]
  726.         MOV     EDI,[Dest]
  727.         MOV     EDX,[Count]
  728.         CMP     EDI,ESI
  729.         JA      Label1
  730.         JE      Label2
  731.         SHR     ECX,2
  732.         REP     MOVSD
  733.         MOV     ECX,EDX
  734.         AND     ECX,3
  735.         REP     MOVSB
  736.         JMP     Label2
  737.     }
  738.     Label1:    
  739.     __asm{
  740.         LEA     ESI,[ESI+ECX-1]
  741.         LEA     EDI,[EDI+ECX-1]
  742.         AND     ECX,3
  743.         STD
  744.         REP     MOVSB
  745.         SUB     ESI,3
  746.         SUB     EDI,3
  747.         MOV     ECX,EDX
  748.         SHR     ECX,2
  749.         REP     MOVSD
  750.         CLD
  751.     }
  752.     Lable2:
  753. }
  754. function StrCopy(Dest, Source: PChar): PChar; assembler;
  755. asm
  756.         PUSH    EDI
  757.         PUSH    ESI
  758.         MOV     ESI,EAX
  759.         MOV     EDI,EDX
  760.         MOV     ECX,0FFFFFFFFH
  761.         XOR     AL,AL
  762.         REPNE   SCASB
  763.         NOT     ECX
  764.         MOV     EDI,ESI
  765.         MOV     ESI,EDX
  766.         MOV     EDX,ECX
  767.         MOV     EAX,EDI
  768.         SHR     ECX,2
  769.         REP     MOVSD
  770.         MOV     ECX,EDX
  771.         AND     ECX,3
  772.         REP     MOVSB
  773.         POP     ESI
  774.         POP     EDI
  775. end;
  776. function StrECopy(Dest, Source: PChar): PChar; assembler;
  777. asm
  778.         PUSH    EDI
  779.         PUSH    ESI
  780.         MOV     ESI,EAX
  781.         MOV     EDI,EDX
  782.         MOV     ECX,0FFFFFFFFH
  783.         XOR     AL,AL
  784.         REPNE   SCASB
  785.         NOT     ECX
  786.         MOV     EDI,ESI
  787.         MOV     ESI,EDX
  788.         MOV     EDX,ECX
  789.         SHR     ECX,2
  790.         REP     MOVSD
  791.         MOV     ECX,EDX
  792.         AND     ECX,3
  793.         REP     MOVSB
  794.         LEA     EAX,[EDI-1]
  795.         POP     ESI
  796.         POP     EDI
  797. end;
  798. function StrNCpy(Dest, Source: PChar; MaxLen: Cardinal): PChar; assembler;
  799. asm
  800.         PUSH    EDI
  801.         PUSH    ESI
  802.         PUSH    EBX
  803.         MOV     ESI,EAX
  804.         MOV     EDI,EDX
  805.         MOV     EBX,ECX
  806.         XOR     AL,AL
  807.         TEST    ECX,ECX
  808.         JZ      @@1
  809.         REPNE   SCASB
  810.         JNE     @@1
  811.         INC     ECX
  812. @@1:    SUB     EBX,ECX
  813.         MOV     EDI,ESI
  814.         MOV     ESI,EDX
  815.         MOV     EDX,EDI
  816.         MOV     ECX,EBX
  817.         SHR     ECX,2
  818.         REP     MOVSD
  819.         MOV     ECX,EBX
  820.         AND     ECX,3
  821.         REP     MOVSB
  822.         STOSB
  823.         MOV     EAX,EDX
  824.         POP     EBX
  825.         POP     ESI
  826.         POP     EDI
  827. end;
  828. function StrPCopy(Dest: PChar; const Source: string): PChar;
  829. begin
  830.   Result := StrNCpy(Dest, PChar(Source), Length(Source));
  831. end;
  832. function StrPLCopy(Dest: PChar; const Source: string;
  833.   MaxLen: Cardinal): PChar;
  834. begin
  835.   Result := StrNCpy(Dest, PChar(Source), MaxLen);
  836. end;
  837. function StrCat(Dest, Source: PChar): PChar;
  838. begin
  839.   StrCopy(StrEnd(Dest), Source);
  840.   Result := Dest;
  841. end;
  842. function StrLCat(Dest, Source: PChar; MaxLen: Cardinal): PChar; assembler;
  843. asm
  844.         PUSH    EDI
  845.         PUSH    ESI
  846.         PUSH    EBX
  847.         MOV     EDI,Dest
  848.         MOV     ESI,Source
  849.         MOV     EBX,MaxLen
  850.         CALL    StrEnd
  851.         MOV     ECX,EDI
  852.         ADD     ECX,EBX
  853.         SUB     ECX,EAX
  854.         JBE     @@1
  855.         MOV     EDX,ESI
  856.         CALL    StrNCpy
  857. @@1:    MOV     EAX,EDI
  858.         POP     EBX
  859.         POP     ESI
  860.         POP     EDI
  861. end;
  862. function StrComp(Str1, Str2: PChar): Integer; assembler;
  863. asm
  864.         PUSH    EDI
  865.         PUSH    ESI
  866.         MOV     EDI,EDX
  867.         MOV     ESI,EAX
  868.         MOV     ECX,0FFFFFFFFH
  869.         XOR     EAX,EAX
  870.         REPNE   SCASB
  871.         NOT     ECX
  872.         MOV     EDI,EDX
  873.         XOR     EDX,EDX
  874.         REPE    CMPSB
  875.         MOV     AL,[ESI-1]
  876.         MOV     DL,[EDI-1]
  877.         SUB     EAX,EDX
  878.         POP     ESI
  879.         POP     EDI
  880. end;
  881. function StrIComp(Str1, Str2: PChar): Integer; assembler;
  882. asm
  883.         PUSH    EDI
  884.         PUSH    ESI
  885.         MOV     EDI,EDX
  886.         MOV     ESI,EAX
  887.         MOV     ECX,0FFFFFFFFH
  888.         XOR     EAX,EAX
  889.         REPNE   SCASB
  890.         NOT     ECX
  891.         MOV     EDI,EDX
  892.         XOR     EDX,EDX
  893. @@1:    REPE    CMPSB
  894.         JE      @@4
  895.         MOV     AL,[ESI-1]
  896.         CMP     AL,'a'
  897.         JB      @@2
  898.         CMP     AL,'z'
  899.         JA      @@2
  900.         SUB     AL,20H
  901. @@2:    MOV     DL,[EDI-1]
  902.         CMP     DL,'a'
  903.         JB      @@3
  904.         CMP     DL,'z'
  905.         JA      @@3
  906.         SUB     DL,20H
  907. @@3:    SUB     EAX,EDX
  908.         JE      @@1
  909. @@4:    POP     ESI
  910.         POP     EDI
  911. end;
  912. function StrLComp(Str1, Str2: PChar; MaxLen: Cardinal): Integer; assembler;
  913. asm
  914.         PUSH    EDI
  915.         PUSH    ESI
  916.         PUSH    EBX
  917.         MOV     EDI,EDX
  918.         MOV     ESI,EAX
  919.         MOV     EBX,ECX
  920.         XOR     EAX,EAX
  921.         OR      ECX,ECX
  922.         JE      @@1
  923.         REPNE   SCASB
  924.         SUB     EBX,ECX
  925.         MOV     ECX,EBX
  926.         MOV     EDI,EDX
  927.         XOR     EDX,EDX
  928.         REPE    CMPSB
  929.         MOV     AL,[ESI-1]
  930.         MOV     DL,[EDI-1]
  931.         SUB     EAX,EDX
  932. @@1:    POP     EBX
  933.         POP     ESI
  934.         POP     EDI
  935. end;
  936. function StrLIComp(Str1, Str2: PChar; MaxLen: Cardinal): Integer; assembler;
  937. asm
  938.         PUSH    EDI
  939.         PUSH    ESI
  940.         PUSH    EBX
  941.         MOV     EDI,EDX
  942.         MOV     ESI,EAX
  943.         MOV     EBX,ECX
  944.         XOR     EAX,EAX
  945.         OR      ECX,ECX
  946.         JE      @@4
  947.         REPNE   SCASB
  948.         SUB     EBX,ECX
  949.         MOV     ECX,EBX
  950.         MOV     EDI,EDX
  951.         XOR     EDX,EDX
  952. @@1:    REPE    CMPSB
  953.         JE      @@4
  954.         MOV     AL,[ESI-1]
  955.         CMP     AL,'a'
  956.         JB      @@2
  957.         CMP     AL,'z'
  958.         JA      @@2
  959.         SUB     AL,20H
  960. @@2:    MOV     DL,[EDI-1]
  961.         CMP     DL,'a'
  962.         JB      @@3
  963.         CMP     DL,'z'
  964.         JA      @@3
  965.         SUB     DL,20H
  966. @@3:    SUB     EAX,EDX
  967.         JE      @@1
  968. @@4:    POP     EBX
  969.         POP     ESI
  970.         POP     EDI
  971. end;
  972. function StrScan(Str: PChar; Chr: Char): PChar; assembler;
  973. asm
  974.         PUSH    EDI
  975.         PUSH    EAX
  976.         MOV     EDI,Str
  977.         MOV     ECX,0FFFFFFFFH
  978.         XOR     AL,AL
  979.         REPNE   SCASB
  980.         NOT     ECX
  981.         POP     EDI
  982.         MOV     AL,Chr
  983.         REPNE   SCASB
  984.         MOV     EAX,0
  985.         JNE     @@1
  986.         MOV     EAX,EDI
  987.         DEC     EAX
  988. @@1:    POP     EDI
  989. end;
  990. function StrRScan(Str: PChar; Chr: Char): PChar; assembler;
  991. asm
  992.         PUSH    EDI
  993.         MOV     EDI,Str
  994.         MOV     ECX,0FFFFFFFFH
  995.         XOR     AL,AL
  996.         REPNE   SCASB
  997.         NOT     ECX
  998.         STD
  999.         DEC     EDI
  1000.         MOV     AL,Chr
  1001.         REPNE   SCASB
  1002.         MOV     EAX,0
  1003.         JNE     @@1
  1004.         MOV     EAX,EDI
  1005.         INC     EAX
  1006. @@1:    CLD
  1007.         POP     EDI
  1008. end;
  1009. function StrPos(Str1, Str2: PChar): PChar; assembler;
  1010. asm
  1011.         PUSH    EDI
  1012.         PUSH    ESI
  1013.         PUSH    EBX
  1014.         OR      EAX,EAX
  1015.         JE      @@2
  1016.         OR      EDX,EDX
  1017.         JE      @@2
  1018.         MOV     EBX,EAX
  1019.         MOV     EDI,EDX
  1020.         XOR     AL,AL
  1021.         MOV     ECX,0FFFFFFFFH
  1022.         REPNE   SCASB
  1023.         NOT     ECX
  1024.         DEC     ECX
  1025.         JE      @@2
  1026.         MOV     ESI,ECX
  1027.         MOV     EDI,EBX
  1028.         MOV     ECX,0FFFFFFFFH
  1029.         REPNE   SCASB
  1030.         NOT     ECX
  1031.         SUB     ECX,ESI
  1032.         JBE     @@2
  1033.         MOV     EDI,EBX
  1034.         LEA     EBX,[ESI-1]
  1035. @@1:    MOV     ESI,EDX
  1036.         LODSB
  1037.         REPNE   SCASB
  1038.         JNE     @@2
  1039.         MOV     EAX,ECX
  1040.         PUSH    EDI
  1041.         MOV     ECX,EBX
  1042.         REPE    CMPSB
  1043.         POP     EDI
  1044.         MOV     ECX,EAX
  1045.         JNE     @@1
  1046.         LEA     EAX,[EDI-1]
  1047.         JMP     @@3
  1048. @@2:    XOR     EAX,EAX
  1049. @@3:    POP     EBX
  1050.         POP     ESI
  1051.         POP     EDI
  1052. end;
  1053. function StrUpper(Str: PChar): PChar; assembler;
  1054. asm
  1055.         PUSH    ESI
  1056.         MOV     ESI,Str
  1057.         MOV     EDX,Str
  1058. @@1:    LODSB
  1059.         OR      AL,AL
  1060.         JE      @@2
  1061.         CMP     AL,'a'
  1062.         JB      @@1
  1063.         CMP     AL,'z'
  1064.         JA      @@1
  1065.         SUB     AL,20H
  1066.         MOV     [ESI-1],AL
  1067.         JMP     @@1
  1068. @@2:    XCHG    EAX,EDX
  1069.         POP     ESI
  1070. end;
  1071. function StrLower(Str: PChar): PChar; assembler;
  1072. asm
  1073.         PUSH    ESI
  1074.         MOV     ESI,Str
  1075.         MOV     EDX,Str
  1076. @@1:    LODSB
  1077.         OR      AL,AL
  1078.         JE      @@2
  1079.         CMP     AL,'A'
  1080.         JB      @@1
  1081.         CMP     AL,'Z'
  1082.         JA      @@1
  1083.         ADD     AL,20H
  1084.         MOV     [ESI-1],AL
  1085.         JMP     @@1
  1086. @@2:    XCHG    EAX,EDX
  1087.         POP     ESI
  1088. end;
  1089. */
  1090. extern "C"{
  1091. void *  __cdecl memcpy(void *, const void *, size_t);
  1092. int     __cdecl memcmp(const void *, const void *, size_t);
  1093. void *  __cdecl memset(void *, int, size_t);
  1094. char *  __cdecl strcpy(char *, const char *);
  1095. char *  __cdecl strcat(char *, const char *);
  1096. int     __cdecl strcmp(const char *, const char *);
  1097. size_t  __cdecl strlen(const char *);
  1098. }
  1099. #pragma function(memcpy, memcmp, memset, strlen, strcpy, strcat, strcmp)
  1100. inline void *  __cdecl memcpy(void *pvDst, const void *pvSrc, size_t Count)
  1101. {
  1102.     MemCpy(pvDst, pvSrc, Count);
  1103.     return pvDst;
  1104. }
  1105. inline void *  __cdecl memmove(void *pvDst, const void *pvSrc, size_t Count)
  1106. {
  1107.     MemMove(pvDst, pvSrc, Count);
  1108.     return pvDst;
  1109. }
  1110. inline int     __cdecl memcmp(const void *pvDst, const void *pvSrc, size_t Count)
  1111. {
  1112.     return MemCmp(pvDst, pvSrc, Count);
  1113. }
  1114. inline void *  __cdecl memset(void *pvDst, int ch, size_t Count)
  1115. {
  1116.     
  1117.     MemSet(pvDst, (char)ch, Count);
  1118.     return pvDst;
  1119. }
  1120. inline void *  __cdecl memchr(const void *pvBuf, int ch, size_t Count)
  1121. {
  1122.     return MemChr(pvBuf, (char)ch, Count);
  1123. }
  1124. inline char *  __cdecl strcpy(char *pszDst, const char *pszSrc)
  1125. {
  1126.     return StrCpy(pszDst, pszSrc);
  1127. }
  1128. inline char *  __cdecl strcat(char *pszDst, const char *pszSrc)
  1129. {
  1130.     return StrCat(pszDst, pszSrc);
  1131. }
  1132. inline int     __cdecl strcmp(const char *pszStr1, const char *pszStr2)
  1133. {
  1134.     return StrCmp(pszStr1, pszStr2);
  1135. }
  1136. inline int __cdecl stricmp(const char *pszStr1, const char *pszStr2)
  1137. {
  1138.     return StrICmp(pszStr1, pszStr2);
  1139. }
  1140. inline size_t  __cdecl strlen(const char *pszStr)
  1141. {
  1142.     return StrLen(pszStr);
  1143. }
  1144. inline char *  __cdecl strncpy(char *pszDst, const char *pszSrc, size_t MaxLen)
  1145. {
  1146.     return StrNCpy(pszDst, pszSrc, MaxLen);
  1147. }
  1148. inline int     __cdecl strncmp(const char *pszStr1, const char *pszStr2, size_t MaxLen)
  1149. {
  1150.     return StrNCmp(pszStr1, pszStr2, MaxLen);
  1151. }
  1152. inline char *  __cdecl strchr(const char *pszStr, int ch)
  1153. {
  1154.     return StrChr(pszStr, (char)ch);
  1155. }
  1156. inline char *  __cdecl strrchr(const char *pszStr, int ch)
  1157. {
  1158.     return StrRChr(pszStr, (char)ch);
  1159. }
  1160. inline char * __cdecl strsetempty(char *pszStr)
  1161. {
  1162.     *pszStr = '';
  1163.     return pszStr;
  1164. }
  1165. inline int __cdecl strisempty(const char *pszStr)
  1166. {
  1167.     return ('' == *pszStr);
  1168. }
  1169. inline char * __cdecl strsetend(char *pszStr)
  1170. {
  1171.     *pszStr = '';
  1172.     return pszStr;
  1173. }
  1174. inline int __cdecl strisend(const char *pszStr)
  1175. {
  1176.     return ('' == *pszStr);
  1177. }
  1178. #endif  // _XP_LINUX_
  1179. #endif  // _KSTRING_H_