Subversion Repositories Kolibri OS

Rev

Rev 5423 | Rev 5574 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. //------------------------------------------------------------------------------
  2. // strcmp( ESI, EDI)
  3. // strlen( EDI)
  4. // strcpy( EDI, ESI) --- 0 if ==
  5. // strncpy(dword text1,text2,signed length)
  6. // strcat( EDI, ESI)
  7. // strncat(dword text1,text2,signed length) --- pasting the text of a certain length
  8. // strchr( ESI,BL) --- find first BL
  9. // strrchr( ESI,BL) --- find last BL
  10. // strstr( EBX, EDX)
  11. // itoa(signed long number) --- convert the number as a string
  12. // atoi(dword text) --- convert a string as a number
  13. // strupr( ESI)
  14. // strlwr( ESI) --- kyrillic symbols may not work
  15. // strttl( EDX)
  16. // strtok( ESI)
  17. // strltrim(dword text) --- removes "blank" characters on the left (\r, \n and space)
  18. // strrtrim(dword text) --- removes "blank" characters on the right (\r, \n and space)
  19. // strtrim(dword text) --- delete "empty" characters (\ r \ n and space) on both sides
  20. // chrnum(dword searchin, char symbol)
  21. // strcpyb(dword searchin, copyin, startstr, endstr) --- copy string between strings
  22. // strnumb(dword searchin, startstr, endstr) --- get number between strings
  23. // strdup(dword text) --- allocation under the text
  24. //------------------------------------------------------------------------------
  25.  
  26. /*
  27. inline fastcall signed int strcmp( ESI, EDI)
  28. {
  29.     loop()
  30.     {
  31.         IF (DSBYTE[ESI]<DSBYTE[EDI]) RETURN -1;
  32.         IF (DSBYTE[ESI]>DSBYTE[EDI]) RETURN 1;
  33.         IF (DSBYTE[ESI]=='\0') RETURN 0;
  34.         ESI++;
  35.         EDI++;
  36.     }
  37. }
  38. */
  39.  
  40.  
  41. inline fastcall signed int strncmp( ESI, EDI, ECX)
  42. {
  43.   asm {
  44.     MOV EBX, EDI
  45.     XOR EAX, EAX
  46.     MOV EDX, ECX
  47.     OR ECX, ECX
  48.     JE L1
  49.     REPNE SCASB
  50.     SUB EDX, ECX
  51.     MOV ECX, EDX
  52.     MOV EDI, EBX
  53.     XOR EBX, EBX
  54.     REPE CMPSB
  55.     MOV AL, DSBYTE[ ESI-1]
  56.     MOV BL, DSBYTE[ EDI-1]
  57.     SUB EAX, EBX
  58. L1:
  59.   }
  60. }
  61.  
  62.  
  63. inline fastcall unsigned int strlen( EDI)
  64. {
  65.     $xor eax, eax
  66.     $mov ecx, -1
  67.     $REPNE $SCASB
  68.     EAX-=2+ECX;
  69. }
  70.  
  71.  
  72. signed int strcmp(dword text1, text2)
  73. {
  74.         char s1,s2;
  75.         dword p1,p2;
  76.         p1 = text1;
  77.         p2 = text2;
  78.         loop()
  79.         {
  80.                 s1 = DSBYTE[text1];
  81.                 s2 = DSBYTE[text2];
  82.                 if(s1==s2)
  83.                 {
  84.                         if(s1==0) return 0;
  85.                 }
  86.                 else {
  87.                        
  88.                         return -1;
  89.                 }
  90.                 $inc text1
  91.                 $inc text2
  92.         }
  93.         return 0;
  94. }
  95.  
  96.  
  97. inline fastcall void strcpy( EDI, ESI)
  98. {
  99.     $cld
  100. L2:
  101.     $lodsb
  102.     $stosb
  103.     $test al,al
  104.     $jnz L2
  105. }
  106.  
  107. void strncpy(dword text1, text2, signed len)
  108.         signed o1,o2;
  109. {
  110.         o1 = len/4;
  111.         o2 = len-4*o1;
  112.         while(o1){
  113.                 ESDWORD[text1] = ESDWORD[text2];
  114.                 text1 += 4;
  115.                 text2 += 4;
  116.                 $dec o1
  117.         }
  118.         while(o2){
  119.                 ESBYTE[text1] = ESBYTE[text2];
  120.                 $inc text1
  121.                 $inc text2
  122.                 $dec o2
  123.         }
  124. }
  125.  
  126. inline fastcall int strlcpy(dword ESI, EDI, EBX)
  127. {
  128.     if (EBX<0) return -1;
  129.     EDX=0;
  130.     do {
  131.         DSBYTE[ESI]=DSBYTE[EDI];
  132.         ESI++;
  133.         EDI++;
  134.         EDX++;
  135.         if (EDX==EBX) { DSBYTE[ESI]='\0'; return -1;}
  136.     } while(DSBYTE[EDI-1]!='\0');
  137.     return 0;
  138. }
  139.  
  140. /*
  141. inline fastcall void strtrim( ESI)
  142. {
  143.     EDI = ESI;
  144.     do{
  145.         AL=DSBYTE[EDI];
  146.         if (AL != '\32') && (AL != '\13') && (AL != '\10')
  147.         {
  148.             DSBYTE[ESI]=AL;
  149.             $inc ESI
  150.         }
  151.          $inc EDI
  152.     }while(AL!=0);
  153.     DSBYTE[ESI] = '\0';
  154. }
  155. */
  156.  
  157. byte __isWhite(int s){ if (s==13)||(s==32)||(s==10)||(s==9) return true; return false; }
  158. void strltrim(dword text){
  159.         int s;
  160.         dword back_text;
  161.         back_text = text;
  162.         s = ESBYTE[text];
  163.         while(__isWhite(s))
  164.         {
  165.                 $inc text
  166.                 s = ESBYTE[text];
  167.         }
  168.         loop()
  169.         {
  170.                 ESBYTE[back_text] = s;
  171.                 $inc back_text
  172.                 if(!s) break;
  173.                 $inc text
  174.                 s = ESBYTE[text];
  175.         };
  176. }
  177.  
  178. void strrtrim(dword text)
  179. {
  180.         int s;
  181.         dword p;
  182.         do {
  183.                 s = ESBYTE[text];
  184.                 if(__isWhite(s))
  185.                 {
  186.                         p = text;
  187.                         while(__isWhite(s))
  188.                         {
  189.                                 $inc text;
  190.                                 s = ESBYTE[text];
  191.                         }
  192.                 }
  193.                 else $inc text
  194.         } while(s);
  195.         $dec text
  196.         s = ESBYTE[text];
  197.         if(__isWhite(s)) ESBYTE[p] = 0;
  198. }
  199.  
  200. void strtrim(dword text){
  201.         int s;
  202.         dword p,back_text;
  203.         back_text = text;
  204.         s = ESBYTE[text];
  205.         while(__isWhite(s))
  206.         {
  207.                 $inc text
  208.                 s = ESBYTE[text];
  209.         }
  210.         do {
  211.                 s = ESBYTE[text];
  212.                 if(__isWhite(s))
  213.                 {
  214.                         p = back_text;
  215.                         while(__isWhite(s))
  216.                         {
  217.                                 ESBYTE[back_text] = s;
  218.                                 $inc back_text
  219.                                 $inc text;
  220.                                 s = ESBYTE[text];
  221.                         }
  222.                 }
  223.                 else {
  224.                         ESBYTE[back_text] = s;
  225.                         $inc back_text
  226.                         $inc text
  227.                 }
  228.         } while(s);
  229.         $dec text
  230.         s = ESBYTE[text];
  231.         if(__isWhite(s)) ESBYTE[p] = 0;
  232. }
  233.  
  234. inline fastcall void strcat( EDI, ESI)
  235. {
  236.   asm {
  237.     mov ebx, edi
  238.     xor ecx, ecx
  239.     xor eax, eax
  240.     dec ecx
  241.     repne scasb
  242.     dec edi
  243.     mov edx, edi
  244.     mov edi, esi
  245.     xor ecx, ecx
  246.     xor eax, eax
  247.     dec ecx
  248.     repne scasb
  249.     xor ecx, 0ffffffffh
  250.     mov edi, edx
  251.     mov edx, ecx
  252.     mov eax, edi
  253.     shr ecx, 2
  254.     rep movsd
  255.     mov ecx, edx
  256.     and ecx, 3
  257.     rep movsb
  258.     mov eax, ebx
  259.     }
  260. }
  261.  
  262. void strncat(dword text1, text2, signed len)
  263.         signed o1,o2;
  264.         char s;
  265. {
  266.         s = ESBYTE[text1];
  267.         while(s){
  268.                 $inc text1
  269.                 s = ESBYTE[text1];
  270.         }
  271.         o1 = len/4;
  272.         o2 = len-4*o1;
  273.         while(o1){
  274.                 ESDWORD[text1] = ESDWORD[text2];
  275.                 text1 += 4;
  276.                 text2 += 4;
  277.                 $dec o1
  278.         }
  279.         while(o2){
  280.                 ESBYTE[text1] = ESBYTE[text2];
  281.                 $inc text1
  282.                 $inc text2
  283.                 $dec o2
  284.         }
  285. }
  286.  
  287. inline fastcall void chrcat(ESI, BL)
  288. {
  289.     EDI = strlen(ESI);
  290.     ESBYTE[ESI+EDI] = BL;
  291.     ESBYTE[ESI+EDI+1] = 0;
  292. }
  293.  
  294.  
  295. inline fastcall signed int strchr( ESI,BL)
  296. {
  297.     int jj=0;
  298.     do{
  299.         jj++;
  300.         $lodsb
  301.         IF(AL==BL) return jj;
  302.     } while(AL!=0);
  303.     return 0;
  304. }
  305.  
  306.  
  307. inline fastcall signed int strrchr( ESI,BL)
  308. {
  309.     int jj=0, last=0;
  310.     do{
  311.         jj++;
  312.         $lodsb
  313.         IF(AL==BL) last=jj;
  314.     } while(AL!=0);
  315.     return last;
  316. }
  317.  
  318.  
  319. int chrnum(dword searchin, char symbol)
  320. {
  321.     int num = 0;
  322.     while(DSBYTE[searchin])
  323.     {
  324.         if (DSBYTE[searchin] == symbol)    num++;
  325.         searchin++;
  326.     }
  327.     return num;
  328. }
  329.  
  330.  
  331. inline fastcall signed int strstr( EBX, EDX)
  332. {
  333.   asm {
  334.     MOV EDI, EDX
  335.     XOR ECX, ECX
  336.     XOR EAX, EAX
  337.     DEC ECX
  338.     REPNE SCASB
  339.     NOT ECX
  340.     DEC ECX
  341.     JE LS2
  342.     MOV ESI, ECX
  343.     XOR ECX, ECX
  344.     MOV EDI, EBX
  345.     DEC ECX
  346.     REPNE SCASB
  347.     NOT ECX
  348.     SUB ECX, ESI
  349.     JBE LS2
  350.     MOV EDI, EBX
  351.     LEA EBX, DSDWORD[ ESI-1]
  352. LS1: MOV ESI, EDX
  353.     LODSB
  354.     REPNE SCASB
  355.     JNE LS2
  356.     MOV EAX, ECX
  357.     PUSH EDI
  358.     MOV ECX, EBX
  359.     REPE CMPSB
  360.     POP EDI
  361.     MOV ECX, EAX
  362.     JNE LS1
  363.     LEA EAX, DSDWORD[ EDI-1]
  364.     JMP SHORT LS3
  365. LS2: XOR EAX, EAX
  366. LS3:
  367.   }
  368. }
  369.  
  370. dword strcmpi(dword cmp1, cmp2)
  371. {
  372.     char si, ue;
  373.  
  374.     loop()
  375.     {
  376.         si = DSBYTE[cmp1];
  377.         ue = DSBYTE[cmp2];
  378.         if (si>='A') && (si<='Z') si +=32;
  379.         if (ue>='A') && (ue<='Z') ue +=32;
  380.         if (si != ue) return -1;
  381.         cmp1++;
  382.         cmp2++;
  383.         if ((DSBYTE[cmp1]=='\0') && (DSBYTE[cmp2]=='\0')) return 0;
  384.         if (DSBYTE[cmp1]=='\0') return -1;
  385.         if (DSBYTE[cmp2]=='\0') return 1;
  386.     }
  387. }
  388.  
  389. dword strstri(dword searchin, usestr_s)
  390. {
  391.     dword usestr_e = usestr_s;
  392.     char si, ue;
  393.  
  394.     while(DSBYTE[searchin])
  395.     {
  396.         si = DSBYTE[searchin];
  397.         ue = DSBYTE[usestr_e];
  398.         if (si>='A') && (si<='Z') si +=32;
  399.         if (ue>='A') && (ue<='Z') ue +=32;
  400.         if (si == ue) usestr_e++; else usestr_e = usestr_s;
  401.         searchin++;
  402.         if (DSBYTE[usestr_e]=='\0') return searchin;
  403.     }
  404.     return 0;
  405. }
  406.  
  407.  
  408. unsigned int strcpyb(dword search_in, copyin, startstr, endstr)
  409. {
  410.     dword startp, endp;
  411.     dword copyin_start_off = copyin;
  412.     if (startstr==0) startp = search_in; else startp = strstr(search_in, startstr) + strlen(startstr);
  413.     endp = strstri(startp, endstr);
  414.     if (endp==0) endp = startp+strlen(search_in);
  415.     //if (startp==endp) return 0;
  416.     do
  417.     {
  418.         DSBYTE[copyin] = DSBYTE[startp];
  419.         copyin++;
  420.         startp++;
  421.     }
  422.     while (startp<endp);
  423.     DSBYTE[copyin] = '\0';
  424.     return copyin_start_off;
  425. }
  426.  
  427.  
  428. /*void strcat(char *to, char *from)
  429. {
  430.     while(*to) to++;
  431.     while(*from)
  432.     {
  433.         *to = *from;
  434.         to++;
  435.         from++;
  436.     }
  437.     *to = '\0';
  438. }*/
  439.  
  440.  
  441. inline fastcall dword atoi( EDI)
  442. {
  443.     $push ebx
  444.     $push esi
  445.     ESI=EDI;
  446.     while (DSBYTE[ESI]==' ') ESI++;
  447.     if (DSBYTE[ESI]=='-') ESI++;
  448.     EAX=0;
  449.     while (DSBYTE[ESI]>='0') && (DSBYTE[ESI]<='9')
  450.     {
  451.         $xor ebx, ebx
  452.         EBX = DSBYTE[ESI]-'0';
  453.         EAX *= 10;
  454.         EAX += EBX;
  455.         ESI++;
  456.     }
  457.     IF (DSBYTE[EDI]=='-') -EAX;
  458.     $pop esi
  459.     $pop ebx
  460. }
  461.  
  462.  
  463.  
  464. inline fastcall strupr( ESI)
  465. {
  466.     do{
  467.         AL=DSBYTE[ESI];
  468.         IF(AL>='a')IF(AL<='z')DSBYTE[ESI]=AL&0x5f;
  469.         IF (AL>=160) && (AL<=175) DSBYTE[ESI] = AL - 32;    //à-ï
  470.         IF (AL>=224) && (AL<=239) DSBYTE[ESI] = AL - 80;    //à-ï
  471.          ESI++;
  472.     }while(AL!=0);
  473. }
  474.  
  475. inline fastcall strlwr( ESI)
  476. {
  477.     do{
  478.         $LODSB
  479.         IF(AL>='A')&&(AL<='Z'){
  480.             AL+=0x20;
  481.             DSBYTE[ESI-1]=AL;
  482.             CONTINUE;
  483.         }
  484.     }while(AL!=0);
  485. }
  486.  
  487. inline fastcall strttl( EDX)
  488. {
  489.     AL=DSBYTE[EDX];
  490.     IF(AL>='a')&&(AL<='z')DSBYTE[EDX]=AL&0x5f;
  491.     IF (AL>=160) && (AL<=175) DSBYTE[EDX] = AL - 32;    //à-ï
  492.     IF (AL>=224) && (AL<=239) DSBYTE[EDX] = AL - 80;    //à-ï
  493.     do{
  494.         EDX++;
  495.         AL=DSBYTE[EDX];
  496.         IF(AL>='A')&&(AL<='Z'){DSBYTE[EDX]=AL|0x20; CONTINUE;}
  497.         IF(AL>='€')&&(AL<='')DSBYTE[EDX]=AL|0x20; // -¯
  498.         IF (AL>=144) && (AL<=159) DSBYTE[EDX] = AL + 80;    //à-ï
  499.     }while(AL!=0);
  500. }
  501.  
  502. /*
  503. dword itoa( ESI)
  504. {
  505.     unsigned char buffer[11];
  506.     $pusha
  507.     EDI = #buffer;
  508.     ECX = 10;
  509.     if (ESI < 0)
  510.     {
  511.          $mov     al, '-'
  512.          $stosb
  513.          $neg     esi
  514.     }
  515.  
  516.     $mov     eax, esi
  517.     $push    -'0'
  518. F2:
  519.     $xor     edx, edx
  520.     $div     ecx
  521.     $push    edx
  522.     $test    eax, eax
  523.     $jnz     F2
  524. F3:
  525.     $pop     eax
  526.     $add     al, '0'
  527.     $stosb
  528.     $jnz     F3
  529.    
  530.     $mov     al, '\0'
  531.     $stosb
  532.  
  533.     $popa
  534.     return #buffer;
  535. }
  536. */
  537.        
  538. dword itoa(signed long number)
  539. {
  540.         unsigned char buf[11];
  541.         dword ret;
  542.         byte cmd;
  543.         long mask,tmp;
  544.         mask = 1000000000;
  545.         cmd = true;
  546.         if(!number){
  547.                 ESBYTE[buf] = '0';
  548.                 ESBYTE[buf+1] = 0;
  549.                 return buf;
  550.         }
  551.         ret = buf;
  552.         if(number<0)
  553.         {
  554.                 $neg number
  555.                 ESBYTE[buf] = '-';
  556.                 $inc buf
  557.         }
  558.         while(mask)
  559.         {
  560.                 tmp = number / mask;
  561.                 tmp = tmp%10;
  562.                
  563.                 if(cmd){
  564.                         if(tmp){
  565.                                 ESBYTE[buf] = tmp + '0';
  566.                                 $inc buf
  567.                                 cmd = false;
  568.                         }
  569.                 }
  570.                 else {
  571.                         ESBYTE[buf] = tmp + '0';
  572.                         $inc buf
  573.                 }
  574.                 mask /= 10;
  575.         }
  576.         ESBYTE[buf] = 0;
  577.         return ret;
  578. }
  579.        
  580. inline fastcall itoa_(signed int EDI, ESI)
  581. {
  582.     $pusha
  583.     EBX = EDI;
  584.     ECX = 10;
  585.     if (ESI > 90073741824)
  586.     {
  587.          $mov     al, '-'
  588.          $stosb
  589.          $neg     esi
  590.     }
  591.  
  592.     $mov     eax, esi
  593.     $push    -'0'
  594. F2:
  595.     $xor     edx, edx
  596.     $div     ecx
  597.     $push    edx
  598.     $test    eax, eax
  599.     $jnz     F2
  600. F3:
  601.     $pop     eax
  602.     $add     al, '0'
  603.     $stosb
  604.     $jnz     F3
  605.    
  606.     $mov     al, '\0'
  607.     $stosb
  608.  
  609.     $popa
  610.     return EBX;
  611. }
  612.  
  613. dword strdup(dword text)
  614. {
  615.     dword l = strlen(text);
  616.     dword ret = malloc(l+1);
  617.     strncpy(ret,text,l);
  618.     return ret;
  619. }
  620.  
  621. void debugi(dword d_int)
  622. {
  623.     char tmpch[12];
  624.     itoa_(#tmpch, d_int);
  625.     debugln(#tmpch);
  626. }
  627.  
  628.  
  629. //#define strncpy strcpyn
  630. #define strnmov strmovn
  631. #define stricmp strcmpi
  632. #define strcmpn strncmp
  633.  
  634.