Subversion Repositories Kolibri OS

Rev

Rev 2825 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. //------------------------------------------------------------------------------
  2. // strcmp( ESI, EDI)
  3. // strlen( EDI)
  4. // strcpy( EDI, ESI)
  5. // strcat( EDI, ESI)
  6. // strchr( ESI,BL)
  7. // strrchr( ESI,BL)
  8. // strstr( EBX, EDX)
  9. //
  10. // IntToStr( ESI)
  11. // StrToInt()
  12. // upcase( ESI)
  13. // lowcase( ESI)
  14. //------------------------------------------------------------------------------
  15.  
  16.  
  17. inline fastcall unsigned int strlen( EDI)
  18. {
  19.         $xor eax, eax
  20.         $mov ecx, -1
  21.         $REPNE $SCASB
  22.         EAX-=2+ECX;
  23. }
  24.  
  25.  
  26. inline fastcall strcpy( EDI, ESI)
  27. {
  28.         $cld
  29. l2:
  30.         $lodsb
  31.         $stosb
  32.         $test al,al
  33.         $jnz l2
  34. }
  35.  
  36.  
  37. inline fastcall strcat( EDI, ESI)
  38. {
  39.   asm {
  40.     mov ebx, edi
  41.     xor ecx, ecx
  42.     xor eax, eax
  43.     dec ecx
  44.     repne scasb
  45.     dec edi
  46.     mov edx, edi
  47.     mov edi, esi
  48.     xor ecx, ecx
  49.     xor eax, eax
  50.     dec ecx
  51.     repne scasb
  52.     xor ecx, 0ffffffffh
  53.     mov edi, edx
  54.     mov edx, ecx
  55.     mov eax, edi
  56.     shr ecx, 2
  57.     rep movsd
  58.     mov ecx, edx
  59.     and ecx, 3
  60.     rep movsb
  61.     mov eax, ebx
  62.         }
  63. }
  64.  
  65. char buffer[11];
  66. inline fastcall dword IntToStr( ESI)
  67. {
  68.      $mov     edi, #buffer
  69.      $mov     ecx, 10
  70.      $test     esi, esi
  71.      $jns     f1
  72.      $mov     al, '-'
  73.      $stosb
  74.      $neg     esi
  75. f1:
  76.      $mov     eax, esi
  77.      $push     -'0'
  78. f2:
  79.      $xor     edx, edx
  80.      $div     ecx
  81.      $push     edx
  82.      $test     eax, eax
  83.      $jnz     f2
  84. f3:
  85.      $pop     eax
  86.      $add     al, '0'
  87.      $stosb
  88.      $jnz     f3
  89.      $mov     eax, #buffer
  90.      $ret
  91. }
  92.  
  93.  
  94. inline fastcall dword StrToInt()
  95. {
  96.         ESI=EDI=EAX;
  97.         IF(DSBYTE[ESI]=='-')ESI++;
  98.         EAX=0;
  99.         BH=AL;
  100.         do{
  101.                 BL=DSBYTE[ESI]-'0';
  102.                 EAX=EAX*10+EBX;
  103.                 ESI++;
  104.         }while(DSBYTE[ESI]>0);
  105.         IF(DSBYTE[EDI]=='-') -EAX;
  106. }
  107.  
  108.  
  109. inline fastcall signed int strcmp( ESI, EDI)
  110. {
  111.         loop()
  112.         {
  113.                 IF (DSBYTE[ESI]<DSBYTE[EDI]) RETURN -1;
  114.                 IF (DSBYTE[ESI]>DSBYTE[EDI]) RETURN 1;
  115.                 IF (DSBYTE[ESI]=='\0') RETURN 0;
  116.                 ESI++;
  117.                 EDI++;
  118.         }
  119. }
  120.  
  121. inline fastcall unsigned int strchr( ESI,BL)
  122. {
  123.         int jj=0;
  124.         do{
  125.                 jj++;
  126.                 $lodsb
  127.                 IF(AL==BL) return jj;
  128.         } while(AL!=0);
  129. }
  130.  
  131.  
  132. inline fastcall unsigned int strrchr( ESI,BL)
  133. {
  134.         int jj=0, last=-1;
  135.         do{
  136.                 jj++;
  137.                 $lodsb
  138.                 IF(AL==BL) last=jj;
  139.         } while(AL!=0);
  140.         return last;
  141. }
  142.  
  143.  
  144. inline fastcall upcase( ESI)
  145. {
  146.         do{
  147.                 AL=DSBYTE[ESI];
  148.                 IF(AL>='a')IF(AL<='z')DSBYTE[ESI]=AL&0x5f;
  149.                 ESI++;
  150.         }while(AL!=0);
  151. }
  152.  
  153. inline fastcall lowcase( ESI)
  154. {
  155.         do{
  156.                 $LODSB
  157.                 IF(AL>='A')&&(AL<='Z'){
  158.                         AL+=0x20;
  159.                         DSBYTE[ESI-1]=AL;
  160.                         CONTINUE;
  161.                 }
  162.         }while(AL!=0);
  163. }
  164.  
  165.  
  166. inline fastcall unsigned int strstr( EBX, EDX)
  167. {
  168.   asm {
  169.     mov edi, edx
  170.     xor ecx, ecx
  171.     xor eax, eax
  172.     dec ecx
  173.     repne scasb
  174.     not ecx
  175.     dec ecx
  176.     je ls2
  177.     mov esi, ecx
  178.     xor ecx, ecx
  179.     mov edi, ebx
  180.     dec ecx
  181.     repne scasb
  182.     not ecx
  183.     sub ecx, esi
  184.     jbe ls2
  185.     mov edi, ebx
  186.     lea ebx, DSDWORD[ esi-1]
  187. ls1: mov esi, edx
  188.     lodsb
  189.     repne scasb
  190.     jne ls2
  191.     mov eax, ecx
  192.     push edi
  193.     mov ecx, ebx
  194.     repe cmpsb
  195.     pop edi
  196.     mov ecx, eax
  197.     jne ls1
  198.     lea eax, DSDWORD[ edi-1]
  199.     jmp short ls3
  200. ls2: xor eax, eax
  201. ls3:
  202.   }
  203. }