home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win-source.exe / mysys / mf_casecnv.c < prev    next >
C/C++ Source or Header  |  2000-08-31  |  6KB  |  253 lines

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This library is free software; you can redistribute it and/or
  4.    modify it under the terms of the GNU Library General Public
  5.    License as published by the Free Software Foundation; either
  6.    version 2 of the License, or (at your option) any later version.
  7.    
  8.    This library is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.    Library General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU Library General Public
  14.    License along with this library; if not, write to the Free
  15.    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  16.    MA 02111-1307, USA */
  17.  
  18. /*
  19.   Functions to convert to lover_case and to upper_case in scandinavia.
  20.  
  21.   case_sort converts a character string to a representaion that can
  22.   be compared by strcmp to find with is alfabetical bigger.
  23.   (lower- and uppercase letters is compared as the same)
  24. */
  25.  
  26. #include "mysys_priv.h"
  27. #include <m_ctype.h>
  28.  
  29.     /* string to uppercase */
  30.  
  31. void caseup_str(my_string str)
  32. {
  33. #ifdef USE_MB
  34.   register uint32 l;
  35.   register char *end=str+(uint) strlen(str);
  36.   if (use_mb(default_charset_info))
  37.     while (*str)
  38.     {
  39.       if ((l=my_ismbchar(default_charset_info, str,end))) str+=l;
  40.       else *str=toupper(*str),++str;
  41.     }
  42.   else
  43. #endif
  44.     while ((*str = toupper(*str)) != 0)
  45.       str++;
  46. } /* caseup_str */
  47.  
  48.     /* string to lowercase */
  49.  
  50. void casedn_str(my_string str)
  51. {
  52. #ifdef USE_MB
  53.   register uint32 l;
  54.   register char *end=str+(uint) strlen(str);
  55.   if (use_mb(default_charset_info))
  56.     while (*str)
  57.     {
  58.       if ((l=my_ismbchar(default_charset_info, str,end))) str+=l;
  59.       else *str=tolower(*str),++str;
  60.     }
  61.   else
  62. #endif
  63.     while ((*str= tolower(*str)) != 0)
  64.       str++;
  65. } /* casedn_str */
  66.  
  67.  
  68.     /* to uppercase */
  69.  
  70. void caseup(my_string str, uint length)
  71. {
  72. #ifdef USE_MB
  73.   register uint32 l;
  74.   register char *end=str+length;
  75.   if (use_mb(default_charset_info))
  76.     while (str<end)
  77.     {
  78.       if ((l=my_ismbchar(default_charset_info, str,end))) str+=l;
  79.       else *str=toupper(*str),++str;
  80.     }
  81.   else
  82. #endif
  83.     for ( ; length>0 ; length--, str++)
  84.       *str= toupper(*str);
  85. } /* caseup */
  86.  
  87.     /* to lowercase */
  88.  
  89. void casedn(my_string str, uint length)
  90. {
  91. #ifdef USE_MB
  92.   register uint32 l;
  93.   register char *end=str+length;
  94.   if (use_mb(default_charset_info))
  95.     while (str<end)
  96.     {
  97.       if ((l=my_ismbchar(default_charset_info, str,end))) str+=l;
  98.       else *str=tolower(*str),++str;
  99.     }
  100.   else
  101. #endif
  102.     for ( ; length>0 ; length--, str++)
  103.       *str= tolower(*str);
  104. } /* casedn */
  105.  
  106.     /* to sort-string that can be compared to get text in order */
  107.  
  108. void case_sort(my_string str, uint length)
  109. {
  110.   for ( ; length>0 ; length--, str++)
  111.     *str= (char) my_sort_order[(uchar) *str];
  112. } /* case_sort */
  113.  
  114.     /* find string in another with no case_sensivity */
  115.  
  116. /* ToDo: This function should be modified to support multibyte charset.
  117.          However it is not used untill 3.23.5.
  118.      Wei He (hewei@mail.ied.ac.cn)
  119. */
  120.  
  121. my_string my_strcasestr(const char *str, const char *search)
  122. {
  123.  uchar *i,*j,*pos;
  124.  
  125.  pos=(uchar*) str;
  126. skipp:
  127.  while (*pos != '\0')
  128.  {
  129.    if (toupper((uchar) *pos++) == toupper((uchar) *search))
  130.    {
  131.      i=(uchar*) pos; j=(uchar*) search+1;
  132.      while (*j)
  133.        if (toupper(*i++) != toupper(*j++)) goto skipp;
  134.      return ((char*) pos-1);
  135.    }
  136.  }
  137.  return ((my_string) 0);
  138. } /* strcstr */
  139.  
  140.  
  141.     /* compare strings without regarding to case */
  142.  
  143. int my_strcasecmp(const char *s, const char *t)
  144. {
  145. #ifdef USE_MB
  146.   register uint32 l;
  147.   register const char *end=s+(uint) strlen(s);
  148.   if (use_mb(default_charset_info))
  149.   {
  150.     while (s<end)
  151.     {
  152.       if ((l=my_ismbchar(default_charset_info, s,end)))
  153.       {
  154.         while (l--)
  155.           if (*s++ != *t++) return 1;
  156.       }
  157.       else if (my_ismbhead(default_charset_info, *t)) return 1;
  158.       else if (toupper((uchar) *s++) != toupper((uchar) *t++)) return 1;
  159.     }
  160.     return *t;
  161.   }
  162.   else
  163. #endif
  164.   {
  165.     while (toupper((uchar) *s) == toupper((uchar) *t++))
  166.       if (!*s++) return 0;
  167.     return ((int) toupper((uchar) s[0]) - (int) toupper((uchar) t[-1]));
  168.   }
  169. }
  170.  
  171.  
  172. int my_casecmp(const char *s, const char *t, uint len)
  173. {
  174. #ifdef USE_MB
  175.   register uint32 l;
  176.   register const char *end=s+len;
  177.   if (use_mb(default_charset_info))
  178.   {
  179.     while (s<end)
  180.     {
  181.       if ((l=my_ismbchar(default_charset_info, s,end)))
  182.       {
  183.         while (l--)
  184.           if (*s++ != *t++) return 1;
  185.       }
  186.       else if (my_ismbhead(default_charset_info, *t)) return 1;
  187.       else if (toupper((uchar) *s++) != toupper((uchar) *t++)) return 1;
  188.     }
  189.     return 0;
  190.   }
  191.   else
  192. #endif
  193.   {
  194.     while (len-- != 0 && toupper(*s++) == toupper(*t++)) ;
  195.     return (int) len+1;
  196.   }
  197. }
  198.  
  199.  
  200. int my_strsortcmp(const char *s, const char *t)
  201. {
  202. #ifdef USE_STRCOLL
  203.   if (use_strcoll(default_charset_info))
  204.     return my_strcoll(default_charset_info, (uchar *)s, (uchar *)t);
  205.   else
  206. #endif
  207.   {
  208.     while (my_sort_order[(uchar) *s] == my_sort_order[(uchar) *t++])
  209.       if (!*s++) return 0;
  210.     return ((int) my_sort_order[(uchar) s[0]] -
  211.             (int) my_sort_order[(uchar) t[-1]]);
  212.   }
  213. }
  214.  
  215. int my_sortcmp(const char *s, const char *t, uint len)
  216. {
  217. #ifdef USE_STRCOLL
  218.   if (use_strcoll(default_charset_info))
  219.     return my_strnncoll(default_charset_info,
  220.                         (uchar *)s, len, (uchar *)t, len);
  221.   else
  222. #endif
  223.   {
  224.     while (len--)
  225.     {
  226.       if (my_sort_order[(uchar) *s++] != my_sort_order[(uchar) *t++])
  227.         return ((int) my_sort_order[(uchar) s[-1]] -
  228.                 (int) my_sort_order[(uchar) t[-1]]);
  229.     }
  230.     return 0;
  231.   }
  232. }
  233.  
  234. int my_sortncmp(const char *s, uint s_len, const char *t, uint t_len)
  235. {
  236. #ifdef USE_STRCOLL
  237.   if (use_strcoll(default_charset_info))
  238.     return my_strnncoll(default_charset_info,
  239.                         (uchar *)s, s_len, (uchar *)t, t_len);
  240.   else
  241. #endif
  242.   {
  243.     uint len= min(s_len,t_len);
  244.     while (len--)
  245.     {
  246.       if (my_sort_order[(uchar) *s++] != my_sort_order[(uchar) *t++])
  247.         return ((int) my_sort_order[(uchar) s[-1]] -
  248.                 (int) my_sort_order[(uchar) t[-1]]);
  249.     }
  250.     return (int) (s_len - t_len);
  251.   }
  252. }
  253.