ctype-sjis.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:12k
源码类别:

MySQL数据库

开发平台:

Visual C++

  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. /* This file is for Shift JIS charset, and created by tommy@valley.ne.jp.
  18.  */
  19. #include <global.h>
  20. #include "m_string.h"
  21. #include "m_ctype.h"
  22. /*
  23.  * This comment is parsed by configure to create ctype.c,
  24.  * so don't change it unless you know what you are doing.
  25.  *
  26.  * .configure. strxfrm_multiply_sjis=1
  27.  * .configure. mbmaxlen_sjis=2
  28.  */
  29. uchar NEAR ctype_sjis[257] =
  30. {
  31.     0, /* For standard library */
  32.     0040, 0040, 0040, 0040, 0040, 0040, 0040, 0040, /* NUL ^A - ^G */
  33.     0040, 0050, 0050, 0050, 0050, 0050, 0040, 0040, /* ^H - ^O */
  34.     0040, 0040, 0040, 0040, 0040, 0040, 0040, 0040, /* ^P - ^W */
  35.     0040, 0040, 0040, 0040, 0040, 0040, 0040, 0040, /* ^X - ^Z ^[ ^ ^] ^^ ^_ */
  36.     0110, 0020, 0020, 0020, 0020, 0020, 0020, 0020, /* SPC ! " # $ % ^ ' */
  37.     0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020, /* ( ) * + , - . / */
  38.     0204, 0204, 0204, 0204, 0204, 0204, 0204, 0204, /* 0 1 2 3 4 5 6 7 */
  39.     0204, 0204, 0020, 0020, 0020, 0020, 0020, 0020, /* 8 9 : ; < = > ? */
  40.     0020, 0201, 0201, 0201, 0201, 0201, 0201, 0001, /* @ A B C D E F G */
  41.     0001, 0001, 0001, 0001, 0001, 0001, 0001, 0001, /* H I J K L M N O */
  42.     0001, 0001, 0001, 0001, 0001, 0001, 0001, 0001, /* P Q R S T U V W */
  43.     0001, 0001, 0001, 0020, 0020, 0020, 0020, 0020, /* X Y Z [  ] ^ _ */
  44.     0020, 0202, 0202, 0202, 0202, 0202, 0202, 0002, /* ` a b c d e f g */
  45.     0002, 0002, 0002, 0002, 0002, 0002, 0002, 0002, /* h i j k l m n o */
  46.     0002, 0002, 0002, 0002, 0002, 0002, 0002, 0002, /* p q r s t u v w */
  47.     0002, 0002, 0002, 0020, 0020, 0020, 0020, 0040, /* x y z { | } + DEL */
  48.     0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020,
  49.     0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020,
  50.     0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020,
  51.     0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020,
  52.     0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020,
  53.     0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020,
  54.     0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020,
  55.     0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020,
  56.     0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020,
  57.     0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020,
  58.     0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020,
  59.     0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020,
  60.     0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020,
  61.     0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020,
  62.     0020, 0020, 0020, 0020, 0020, 0020, 0020, 0020,
  63.     0020, 0020, 0020, 0020, 0020, 0000, 0000, 0000
  64. };
  65. uchar NEAR to_lower_sjis[]=
  66. {
  67.   '00','01','02','03','04','05','06','07',
  68.   '10','11','12','13','14','15','16','17',
  69.   '20','21','22','23','24','25','26','27',
  70.   '30','31','32','33','34','35','36','37',
  71.   ' ',  '!', '"',   '#',   '$',   '%',   '&',   ''',
  72.   '(',  ')', '*',   '+',   ',',   '-',   '.',   '/',
  73.   '0',  '1', '2',   '3',   '4',   '5',   '6',   '7',
  74.   '8',  '9', ':',   ';',   '<',   '=',   '>',   '?',
  75.   '@',  'a', 'b',   'c',   'd',   'e',   'f',   'g',
  76.   'h',  'i', 'j',   'k',   'l',   'm',   'n',   'o',
  77.   'p',  'q', 'r',   's',   't',   'u',   'v',   'w',
  78.   'x',  'y', 'z',   '[',   '\',  ']',   '^',   '_',
  79.   '`',  'a', 'b',   'c',   'd',   'e',   'f',   'g',
  80.   'h',  'i', 'j',   'k',   'l',   'm',   'n',   'o',
  81.   'p',  'q', 'r',   's',   't',   'u',   'v',   'w',
  82.   'x',  'y', 'z',   '{',   '|',   '}',   '~',   '177',
  83.   '200','201','202','203','204','205','206','207',
  84.   '210','211','212','213','214','215','216','217',
  85.   '220','221','222','223','224','225','226','227',
  86.   '230','231','232','233','234','235','236','237',
  87.   '240','241','242','243','244','245','246','247',
  88.   '250','251','252','253','254','255','256','257',
  89.   '260','261','262','263','264','265','266','267',
  90.   '270','271','272','273','274','275','276','277',
  91.   '300','301','302','303','304','305','306','307',
  92.   '310','311','312','313','314','315','316','317',
  93.   '320','321','322','323','324','325','326','327',
  94.   '330','331','332','333','334','335','336','337',
  95.   '340','341','342','343','344','345','346','347',
  96.   '350','351','352','353','354','355','356','357',
  97.   '360','361','362','363','364','365','366','367',
  98.   '370','371','372','373','374','375','376','377'
  99. };
  100. uchar NEAR to_upper_sjis[]=
  101. {
  102.   '00','01','02','03','04','05','06','07',
  103.   '10','11','12','13','14','15','16','17',
  104.   '20','21','22','23','24','25','26','27',
  105.   '30','31','32','33','34','35','36','37',
  106.   ' ',  '!', '"',   '#',   '$',   '%',   '&',   ''',
  107.   '(',  ')', '*',   '+',   ',',   '-',   '.',   '/',
  108.   '0',  '1', '2',   '3',   '4',   '5',   '6',   '7',
  109.   '8',  '9', ':',   ';',   '<',   '=',   '>',   '?',
  110.   '@',  'A', 'B',   'C',   'D',   'E',   'F',   'G',
  111.   'H',  'I', 'J',   'K',   'L',   'M',   'N',   'O',
  112.   'P',  'Q', 'R',   'S',   'T',   'U',   'V',   'W',
  113.   'X',  'Y', 'Z',   '[',   '\',  ']',   '^',   '_',
  114.   '`',  'A', 'B',   'C',   'D',   'E',   'F',   'G',
  115.   'H',  'I', 'J',   'K',   'L',   'M',   'N',   'O',
  116.   'P',  'Q', 'R',   'S',   'T',   'U',   'V',   'W',
  117.   'X',  'Y', 'Z',   '{',   '|',   '}',   '~',   '177',
  118.   '200','201','202','203','204','205','206','207',
  119.   '210','211','212','213','214','215','216','217',
  120.   '220','221','222','223','224','225','226','227',
  121.   '230','231','232','233','234','235','236','237',
  122.   '240','241','242','243','244','245','246','247',
  123.   '250','251','252','253','254','255','256','257',
  124.   '260','261','262','263','264','265','266','267',
  125.   '270','271','272','273','274','275','276','277',
  126.   '300','301','302','303','304','305','306','307',
  127.   '310','311','312','313','314','315','316','317',
  128.   '320','321','322','323','324','325','326','327',
  129.   '330','331','332','333','334','335','336','337',
  130.   '340','341','342','343','344','345','346','347',
  131.   '350','351','352','353','354','355','356','357',
  132.   '360','361','362','363','364','365','366','367',
  133.   '370','371','372','373','374','375','376','377'
  134. };
  135. uchar NEAR sort_order_sjis[]=
  136. {
  137.   '00','01','02','03','04','05','06','07',
  138.   '10','11','12','13','14','15','16','17',
  139.   '20','21','22','23','24','25','26','27',
  140.   '30','31','32','33','34','35','36','37',
  141.   ' ',  '!', '"',   '#',   '$',   '%',   '&',   ''',
  142.   '(',  ')', '*',   '+',   ',',   '-',   '.',   '/',
  143.   '0',  '1', '2',   '3',   '4',   '5',   '6',   '7',
  144.   '8',  '9', ':',   ';',   '<',   '=',   '>',   '?',
  145.   '@',  'A', 'B',   'C',   'D',   'E',   'F',   'G',
  146.   'H',  'I', 'J',   'K',   'L',   'M',   'N',   'O',
  147.   'P',  'Q', 'R',   'S',   'T',   'U',   'V',   'W',
  148.   'X',  'Y', 'Z',   '[',   '\',  ']',   '^',   '_',
  149.   '`',  'A', 'B',   'C',   'D',   'E',   'F',   'G',
  150.   'H',  'I', 'J',   'K',   'L',   'M',   'N',   'O',
  151.   'P',  'Q', 'R',   'S',   'T',   'U',   'V',   'W',
  152.   'X',  'Y', 'Z',   '{',   '|',   '}',   '~',   '177',
  153.   '200','201','202','203','204','205','206','207',
  154.   '210','211','212','213','214','215','216','217',
  155.   '220','221','222','223','224','225','226','227',
  156.   '230','231','232','233','234','235','236','237',
  157.   '240','241','242','243','244','245','246','247',
  158.   '250','251','252','253','254','255','256','257',
  159.   '260','261','262','263','264','265','266','267',
  160.   '270','271','272','273','274','275','276','277',
  161.   '300','301','302','303','304','305','306','307',
  162.   '310','311','312','313','314','315','316','317',
  163.   '320','321','322','323','324','325','326','327',
  164.   '330','331','332','333','334','335','336','337',
  165.   '340','341','342','343','344','345','346','347',
  166.   '350','351','352','353','354','355','356','357',
  167.   '360','361','362','363','364','365','366','367',
  168.   '370','371','372','373','374','375','376','377'
  169. };
  170. #define issjishead(c) ((0x81<=(c) && (c)<=0x9f) || 
  171.                        ((0xe0<=(c)) && (c)<=0xfc))
  172. #define issjistail(c) ((0x40<=(c) && (c)<=0x7e) || 
  173.                        (0x80<=(c) && (c)<=0xfc))
  174. int ismbchar_sjis(const char* p, const char *e)
  175. {
  176.   return (issjishead((uchar) *p) && (e-p)>1 && issjistail((uchar)p[1]) ? 2: 0);
  177. }
  178. my_bool ismbhead_sjis(uint c)
  179. {
  180.   return issjishead((uchar) c);
  181. }
  182. int mbcharlen_sjis(uint c)
  183. {
  184.   return (issjishead((uchar) c) ? 2: 0);
  185. }
  186. #define sjiscode(c,d) ((((uint) (uchar)(c)) << 8) | (uint) (uchar) (d))
  187. int my_strnncoll_sjis(const uchar *s1, int len1, const uchar *s2, int len2)
  188. {
  189.   const uchar *e1 = s1 + len1;
  190.   const uchar *e2 = s2 + len2;
  191.   while (s1 < e1 && s2 < e2) {
  192.     if (ismbchar_sjis((char*) s1, (char*) e1) &&
  193. ismbchar_sjis((char*) s2, (char*) e2)) {
  194.       uint c1 = sjiscode(*s1, *(s1+1));
  195.       uint c2 = sjiscode(*s2, *(s2+1));
  196.       if (c1 != c2)
  197. return c1 - c2;
  198.       s1 += 2;
  199.       s2 += 2;
  200.     } else {
  201.       if (sort_order_sjis[(uchar)*s1] != sort_order_sjis[(uchar)*s2])
  202. return sort_order_sjis[(uchar)*s1] - sort_order_sjis[(uchar)*s2];
  203.       s1++;
  204.       s2++;
  205.     }
  206.   }
  207.   return len1 - len2;
  208. }
  209. int my_strcoll_sjis(const uchar *s1, const uchar *s2)
  210. {
  211.   return (uint) my_strnncoll_sjis(s1,(uint) strlen((char*) s1),
  212.   s2,(uint) strlen((char*) s2));
  213. }
  214. int my_strnxfrm_sjis(uchar *dest, uchar *src, int len, int srclen)
  215. {
  216.   uchar *d_end = dest + len;
  217.   uchar *s_end = src + srclen;
  218.   while (dest < d_end && src < s_end) {
  219.     if (ismbchar_sjis((char*) src, (char*) s_end)) {
  220.       *dest++ = *src++;
  221.       if (dest < d_end && src < s_end)
  222. *dest++ = *src++;
  223.     } else {
  224.       *dest++ = sort_order_sjis[(uchar)*src++];
  225.     }
  226.   }
  227.   return srclen;
  228. }
  229. int my_strxfrm_sjis(uchar *dest, uchar *src, int len)
  230. {
  231.   return my_strnxfrm_sjis(dest, src, len, (uint) strlen((char*) src));
  232. }
  233. /*
  234. ** Calculate min_str and max_str that ranges a LIKE string.
  235. ** Arguments:
  236. ** ptr Pointer to LIKE string.
  237. ** ptr_length Length of LIKE string.
  238. ** escape Escape character in LIKE.  (Normally '').
  239. ** All escape characters should be removed from min_str and max_str
  240. ** res_length Length of min_str and max_str.
  241. ** min_str Smallest case sensitive string that ranges LIKE.
  242. ** Should be space padded to res_length.
  243. ** max_str Largest case sensitive string that ranges LIKE.
  244. ** Normally padded with the biggest character sort value.
  245. **
  246. ** The function should return 0 if ok and 1 if the LIKE string can't be
  247. ** optimized !
  248. */
  249. #define max_sort_char ((char) 255)
  250. #define wild_one '_'
  251. #define wild_many '%'
  252. my_bool my_like_range_sjis(const char *ptr,uint ptr_length,pchar escape,
  253.                       uint res_length, char *min_str,char *max_str,
  254.                       uint *min_length,uint *max_length)
  255. {
  256.   const char *end=ptr+ptr_length;
  257.   char *min_org=min_str;
  258.   char *min_end=min_str+res_length;
  259.   while (ptr < end && min_str < min_end) {
  260.     if (ismbchar_sjis(ptr, end)) {
  261.       *min_str++ = *max_str++ = *ptr++;
  262.       if (min_str < min_end)
  263. *min_str++ = *max_str++ = *ptr++;
  264.       continue;
  265.     }
  266.     if (*ptr == escape && ptr+1 < end) {
  267.       ptr++; /* Skip escape */
  268.       if (ismbchar_sjis(ptr, end))
  269. *min_str++ = *max_str++ = *ptr++;
  270.       if (min_str < min_end)
  271. *min_str++ = *max_str++ = *ptr++;
  272.       continue;
  273.     }
  274.     if (*ptr == wild_one) { /* '_' in SQL */
  275.       *min_str++ = ''; /* This should be min char */
  276.       *max_str++ = max_sort_char;
  277.       ptr++;
  278.       continue;
  279.     }
  280.     if (*ptr == wild_many) { /* '%' in SQL */
  281.       *min_length = (uint)(min_str - min_org);
  282.       *max_length = res_length;
  283.       do {
  284. *min_str++ = ' '; /* Because if key compression */
  285. *max_str++ = max_sort_char;
  286.       } while (min_str < min_end);
  287.       return 0;
  288.     }
  289.     *min_str++ = *max_str++ = *ptr++;
  290.   }
  291.   *min_length = *max_length = (uint)(min_str - min_org);
  292.   while (min_str < min_end)
  293.     *min_str++ = *max_str++ = ' '; /* Because if key compression */
  294.   return 0;
  295. }