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

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. /*
  18.  * This file is basicly usa7 character sets with some extra functions
  19.  * for big5 handling
  20. */
  21. /*
  22.  * This comment is parsed by configure to create ctype.c,
  23.  * so don't change it unless you know what you are doing.
  24.  *
  25.  * .configure. strxfrm_multiply_big5=1
  26.  * .configure. mbmaxlen_big5=2
  27.  */
  28. #include <global.h>
  29. #include "m_string.h"
  30. #include "m_ctype.h"
  31. /* Support for Chinese(BIG5) characters, by jou@nematic.ieo.nctu.edu.tw
  32.    modified by Wei He (hewei@mail.ied.ac.cn) */
  33. #define isbig5head(c) (0xa1<=(uchar)(c) && (uchar)(c)<=0xf9)
  34. #define isbig5tail(c) ((0x40<=(uchar)(c) && (uchar)(c)<=0x7e) || 
  35.                       (0xa1<=(uchar)(c) && (uchar)(c)<=0xfe))
  36. #define isbig5code(c,d) (isbig5head(c) && isbig5tail(d))
  37. #define big5code(c,d)   (((uchar)(c) <<8) | (uchar)(d))
  38. #define big5head(e) ((uchar)(e>>8))
  39. #define big5tail(e) ((uchar)(e&0xff))
  40. uchar NEAR ctype_big5[257] =
  41. {
  42.   0, /* For standard library */
  43.   32,32,32,32,32,32,32,32,32,40,40,40,40,40,32,32,
  44.   32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
  45.   72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
  46.   132,132,132,132,132,132,132,132,132,132,16,16,16,16,16,16,
  47.   16,129,129,129,129,129,129,1,1,1,1,1,1,1,1,1,
  48.   1,1,1,1,1,1,1,1,1,1,1,16,16,16,16,16,
  49.   16,130,130,130,130,130,130,2,2,2,2,2,2,2,2,2,
  50.   2,2,2,2,2,2,2,2,2,2,2,16,16,16,16,32,
  51.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  52.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  53.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  54.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  55.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  56.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  57.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  58.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  59. };
  60. uchar NEAR to_lower_big5[]=
  61. {
  62.   '00','01','02','03','04','05','06','07',
  63.   '10','11','12','13','14','15','16','17',
  64.   '20','21','22','23','24','25','26','27',
  65.   '30','31','32','33','34','35','36','37',
  66.   ' ',  '!', '"',   '#',   '$',   '%',   '&',   ''',
  67.   '(',  ')', '*',   '+',   ',',   '-',   '.',   '/',
  68.   '0',  '1', '2',   '3',   '4',   '5',   '6',   '7',
  69.   '8',  '9', ':',   ';',   '<',   '=',   '>',   '?',
  70.   '@',  'a', 'b',   'c',   'd',   'e',   'f',   'g',
  71.   'h',  'i', 'j',   'k',   'l',   'm',   'n',   'o',
  72.   'p',  'q', 'r',   's',   't',   'u',   'v',   'w',
  73.   'x',  'y', 'z',   '[',   '\',  ']',   '^',   '_',
  74.   '`',  'a', 'b',   'c',   'd',   'e',   'f',   'g',
  75.   'h',  'i', 'j',   'k',   'l',   'm',   'n',   'o',
  76.   'p',  'q', 'r',   's',   't',   'u',   'v',   'w',
  77.   'x',  'y', 'z',   '{',   '|',   '}',   '~',   '177',
  78.   (uchar) '200',(uchar) '201',(uchar) '202',(uchar) '203',(uchar) '204',(uchar) '205',(uchar) '206',(uchar) '207',
  79.   (uchar) '210',(uchar) '211',(uchar) '212',(uchar) '213',(uchar) '214',(uchar) '215',(uchar) '216',(uchar) '217',
  80.   (uchar) '220',(uchar) '221',(uchar) '222',(uchar) '223',(uchar) '224',(uchar) '225',(uchar) '226',(uchar) '227',
  81.   (uchar) '230',(uchar) '231',(uchar) '232',(uchar) '233',(uchar) '234',(uchar) '235',(uchar) '236',(uchar) '237',
  82.   (uchar) '240',(uchar) '241',(uchar) '242',(uchar) '243',(uchar) '244',(uchar) '245',(uchar) '246',(uchar) '247',
  83.   (uchar) '250',(uchar) '251',(uchar) '252',(uchar) '253',(uchar) '254',(uchar) '255',(uchar) '256',(uchar) '257',
  84.   (uchar) '260',(uchar) '261',(uchar) '262',(uchar) '263',(uchar) '264',(uchar) '265',(uchar) '266',(uchar) '267',
  85.   (uchar) '270',(uchar) '271',(uchar) '272',(uchar) '273',(uchar) '274',(uchar) '275',(uchar) '276',(uchar) '277',
  86.   (uchar) '300',(uchar) '301',(uchar) '302',(uchar) '303',(uchar) '304',(uchar) '305',(uchar) '306',(uchar) '307',
  87.   (uchar) '310',(uchar) '311',(uchar) '312',(uchar) '313',(uchar) '314',(uchar) '315',(uchar) '316',(uchar) '317',
  88.   (uchar) '320',(uchar) '321',(uchar) '322',(uchar) '323',(uchar) '324',(uchar) '325',(uchar) '326',(uchar) '327',
  89.   (uchar) '330',(uchar) '331',(uchar) '332',(uchar) '333',(uchar) '334',(uchar) '335',(uchar) '336',(uchar) '337',
  90.   (uchar) '340',(uchar) '341',(uchar) '342',(uchar) '343',(uchar) '344',(uchar) '345',(uchar) '346',(uchar) '347',
  91.   (uchar) '350',(uchar) '351',(uchar) '352',(uchar) '353',(uchar) '354',(uchar) '355',(uchar) '356',(uchar) '357',
  92.   (uchar) '360',(uchar) '361',(uchar) '362',(uchar) '363',(uchar) '364',(uchar) '365',(uchar) '366',(uchar) '367',
  93.   (uchar) '370',(uchar) '371',(uchar) '372',(uchar) '373',(uchar) '374',(uchar) '375',(uchar) '376',(uchar) '377',
  94. };
  95. uchar NEAR to_upper_big5[]=
  96. {
  97.   '00','01','02','03','04','05','06','07',
  98.   '10','11','12','13','14','15','16','17',
  99.   '20','21','22','23','24','25','26','27',
  100.   '30','31','32','33','34','35','36','37',
  101.   ' ',  '!', '"',   '#',   '$',   '%',   '&',   ''',
  102.   '(',  ')', '*',   '+',   ',',   '-',   '.',   '/',
  103.   '0',  '1', '2',   '3',   '4',   '5',   '6',   '7',
  104.   '8',  '9', ':',   ';',   '<',   '=',   '>',   '?',
  105.   '@',  'A', 'B',   'C',   'D',   'E',   'F',   'G',
  106.   'H',  'I', 'J',   'K',   'L',   'M',   'N',   'O',
  107.   'P',  'Q', 'R',   'S',   'T',   'U',   'V',   'W',
  108.   'X',  'Y', 'Z',   '[',   '\',  ']',   '^',   '_',
  109.   '`',  'A', 'B',   'C',   'D',   'E',   'F',   'G',
  110.   'H',  'I', 'J',   'K',   'L',   'M',   'N',   'O',
  111.   'P',  'Q', 'R',   'S',   'T',   'U',   'V',   'W',
  112.   'X',  'Y', 'Z',   '{',   '|',   '}',   '~',   '177',
  113.   (uchar) '200',(uchar) '201',(uchar) '202',(uchar) '203',(uchar) '204',(uchar) '205',(uchar) '206',(uchar) '207',
  114.   (uchar) '210',(uchar) '211',(uchar) '212',(uchar) '213',(uchar) '214',(uchar) '215',(uchar) '216',(uchar) '217',
  115.   (uchar) '220',(uchar) '221',(uchar) '222',(uchar) '223',(uchar) '224',(uchar) '225',(uchar) '226',(uchar) '227',
  116.   (uchar) '230',(uchar) '231',(uchar) '232',(uchar) '233',(uchar) '234',(uchar) '235',(uchar) '236',(uchar) '237',
  117.   (uchar) '240',(uchar) '241',(uchar) '242',(uchar) '243',(uchar) '244',(uchar) '245',(uchar) '246',(uchar) '247',
  118.   (uchar) '250',(uchar) '251',(uchar) '252',(uchar) '253',(uchar) '254',(uchar) '255',(uchar) '256',(uchar) '257',
  119.   (uchar) '260',(uchar) '261',(uchar) '262',(uchar) '263',(uchar) '264',(uchar) '265',(uchar) '266',(uchar) '267',
  120.   (uchar) '270',(uchar) '271',(uchar) '272',(uchar) '273',(uchar) '274',(uchar) '275',(uchar) '276',(uchar) '277',
  121.   (uchar) '300',(uchar) '301',(uchar) '302',(uchar) '303',(uchar) '304',(uchar) '305',(uchar) '306',(uchar) '307',
  122.   (uchar) '310',(uchar) '311',(uchar) '312',(uchar) '313',(uchar) '314',(uchar) '315',(uchar) '316',(uchar) '317',
  123.   (uchar) '320',(uchar) '321',(uchar) '322',(uchar) '323',(uchar) '324',(uchar) '325',(uchar) '326',(uchar) '327',
  124.   (uchar) '330',(uchar) '331',(uchar) '332',(uchar) '333',(uchar) '334',(uchar) '335',(uchar) '336',(uchar) '337',
  125.   (uchar) '340',(uchar) '341',(uchar) '342',(uchar) '343',(uchar) '344',(uchar) '345',(uchar) '346',(uchar) '347',
  126.   (uchar) '350',(uchar) '351',(uchar) '352',(uchar) '353',(uchar) '354',(uchar) '355',(uchar) '356',(uchar) '357',
  127.   (uchar) '360',(uchar) '361',(uchar) '362',(uchar) '363',(uchar) '364',(uchar) '365',(uchar) '366',(uchar) '367',
  128.   (uchar) '370',(uchar) '371',(uchar) '372',(uchar) '373',(uchar) '374',(uchar) '375',(uchar) '376',(uchar) '377',
  129. };
  130. uchar NEAR sort_order_big5[]=
  131. {
  132.   '00','01','02','03','04','05','06','07',
  133.   '10','11','12','13','14','15','16','17',
  134.   '20','21','22','23','24','25','26','27',
  135.   '30','31','32','33','34','35','36','37',
  136.   ' ',  '!', '"',   '#',   '$',   '%',   '&',   ''',
  137.   '(',  ')', '*',   '+',   ',',   '-',   '.',   '/',
  138.   '0',  '1', '2',   '3',   '4',   '5',   '6',   '7',
  139.   '8',  '9', ':',   ';',   '<',   '=',   '>',   '?',
  140.   '@',  'A', 'B',   'C',   'D',   'E',   'F',   'G',
  141.   'H',  'I', 'J',   'K',   'L',   'M',   'N',   'O',
  142.   'P',  'Q', 'R',   'S',   'T',   'U',   'V',   'W',
  143.   'X',  'Y', 'Z',   '\',  ']',   '[',   '^',   '_',
  144.   'E',  'A', 'B',   'C',   'D',   'E',   'F',   'G',
  145.   'H',  'I', 'J',   'K',   'L',   'M',   'N',   'O',
  146.   'P',  'Q', 'R',   'S',   'T',   'U',   'V',   'W',
  147.   'X',  'Y', 'Z',   '{',   '|',   '}',   'Y',   '177',
  148.   (uchar) '200',(uchar) '201',(uchar) '202',(uchar) '203',(uchar) '204',(uchar) '205',(uchar) '206',(uchar) '207',
  149.   (uchar) '210',(uchar) '211',(uchar) '212',(uchar) '213',(uchar) '214',(uchar) '215',(uchar) '216',(uchar) '217',
  150.   (uchar) '220',(uchar) '221',(uchar) '222',(uchar) '223',(uchar) '224',(uchar) '225',(uchar) '226',(uchar) '227',
  151.   (uchar) '230',(uchar) '231',(uchar) '232',(uchar) '233',(uchar) '234',(uchar) '235',(uchar) '236',(uchar) '237',
  152.   (uchar) '240',(uchar) '241',(uchar) '242',(uchar) '243',(uchar) '244',(uchar) '245',(uchar) '246',(uchar) '247',
  153.   (uchar) '250',(uchar) '251',(uchar) '252',(uchar) '253',(uchar) '254',(uchar) '255',(uchar) '256',(uchar) '257',
  154.   (uchar) '260',(uchar) '261',(uchar) '262',(uchar) '263',(uchar) '264',(uchar) '265',(uchar) '266',(uchar) '267',
  155.   (uchar) '270',(uchar) '271',(uchar) '272',(uchar) '273',(uchar) '274',(uchar) '275',(uchar) '276',(uchar) '277',
  156.   (uchar) '300',(uchar) '301',(uchar) '302',(uchar) '303',(uchar) '304',(uchar) '305',(uchar) '306',(uchar) '307',
  157.   (uchar) '310',(uchar) '311',(uchar) '312',(uchar) '313',(uchar) '314',(uchar) '315',(uchar) '316',(uchar) '317',
  158.   (uchar) '320',(uchar) '321',(uchar) '322',(uchar) '323',(uchar) '324',(uchar) '325',(uchar) '326',(uchar) '327',
  159.   (uchar) '330',(uchar) '331',(uchar) '332',(uchar) '333',(uchar) '334',(uchar) '335',(uchar) '336',(uchar) '337',
  160.   (uchar) '340',(uchar) '341',(uchar) '342',(uchar) '343',(uchar) '344',(uchar) '345',(uchar) '346',(uchar) '347',
  161.   (uchar) '350',(uchar) '351',(uchar) '352',(uchar) '353',(uchar) '354',(uchar) '355',(uchar) '356',(uchar) '357',
  162.   (uchar) '360',(uchar) '361',(uchar) '362',(uchar) '363',(uchar) '364',(uchar) '365',(uchar) '366',(uchar) '367',
  163.   (uchar) '370',(uchar) '371',(uchar) '372',(uchar) '373',(uchar) '374',(uchar) '375',(uchar) '376',(uchar) '377',
  164. };
  165. static uint16 big5strokexfrm(uint16 i)
  166. {
  167.   if ((i == 0xA440) || (i == 0xA441))  return 0xA440;
  168.   else if (((i >= 0xA442) && (i <= 0xA453)) || ((i >= 0xC940) && (i <= 0xC944)))  return 0xA442;
  169.   else if (((i >= 0xA454) && (i <= 0xA47E)) || ((i >= 0xC945) && (i <= 0xC94C)))  return 0xA454;
  170.   else if (((i >= 0xA4A1) && (i <= 0xA4FD)) || ((i >= 0xC94D) && (i <= 0xC962)))  return 0xA4A1;
  171.   else if (((i >= 0xA4FE) && (i <= 0xA5DF)) || ((i >= 0xC963) && (i <= 0xC9AA)))  return 0xA4FE;
  172.   else if (((i >= 0xA5E0) && (i <= 0xA6E9)) || ((i >= 0xC9AB) && (i <= 0xCA59)))  return 0xA5E0;
  173.   else if (((i >= 0xA6EA) && (i <= 0xA8C2)) || ((i >= 0xCA5A) && (i <= 0xCBB0)))  return 0xA6EA;
  174.   else if ((i == 0xA260) || ((i >= 0xA8C3) && (i <= 0xAB44)) || ((i >= 0xCBB1) && (i <= 0xCDDC)))  return 0xA8C3;
  175.   else if ((i == 0xA259) || (i == 0xF9DA) || ((i >= 0xAB45) && (i <= 0xADBB)) || ((i >= 0xCDDD) && (i <= 0xD0C7)))  return 0xAB45;
  176.   else if ((i == 0xA25A) || ((i >= 0xADBC) && (i <= 0xB0AD)) || ((i >= 0xD0C8) && (i <= 0xD44A)))  return 0xADBC;
  177.   else if ((i == 0xA25B) || (i == 0xA25C) || ((i >= 0xB0AE) && (i <= 0xB3C2)) || ((i >= 0xD44B) && (i <= 0xD850)))  return 0xB0AE;
  178.   else if ((i == 0xF9DB) || ((i >= 0xB3C3) && (i <= 0xB6C2)) || ((i >= 0xD851) && (i <= 0xDCB0)))  return 0xB3C3;
  179.   else if ((i == 0xA25D) || (i == 0xA25F) || (i == 0xC6A1) || (i == 0xF9D6) || (i == 0xF9D8) || ((i >= 0xB6C3) && (i <= 0xB9AB)) || ((i >= 0xDCB1) && (i <= 0xE0EF)))  return 0xB6C3;
  180.   else if ((i == 0xF9DC) || ((i >= 0xB9AC) && (i <= 0xBBF4)) || ((i >= 0xE0F0) && (i <= 0xE4E5)))  return 0xB9AC;
  181.   else if ((i == 0xA261) || ((i >= 0xBBF5) && (i <= 0xBEA6)) || ((i >= 0xE4E6) && (i <= 0xE8F3)))  return 0xBBF5;
  182.   else if ((i == 0xA25E) || (i == 0xF9D7) || (i == 0xF9D9) || ((i >= 0xBEA7) && (i <= 0xC074)) || ((i >= 0xE8F4) && (i <= 0xECB8)))  return 0xBEA7;
  183.   else if (((i >= 0xC075) && (i <= 0xC24E)) || ((i >= 0xECB9) && (i <= 0xEFB6)))  return 0xC075;
  184.   else if (((i >= 0xC24F) && (i <= 0xC35E)) || ((i >= 0xEFB7) && (i <= 0xF1EA)))  return 0xC24F;
  185.   else if (((i >= 0xC35F) && (i <= 0xC454)) || ((i >= 0xF1EB) && (i <= 0xF3FC)))  return 0xC35F;
  186.   else if (((i >= 0xC455) && (i <= 0xC4D6)) || ((i >= 0xF3FD) && (i <= 0xF5BF)))  return 0xC455;
  187.   else if (((i >= 0xC4D7) && (i <= 0xC56A)) || ((i >= 0xF5C0) && (i <= 0xF6D5)))  return 0xC4D7;
  188.   else if (((i >= 0xC56B) && (i <= 0xC5C7)) || ((i >= 0xF6D6) && (i <= 0xF7CF)))  return 0xC56B;
  189.   else if (((i >= 0xC5C8) && (i <= 0xC5F0)) || ((i >= 0xF7D0) && (i <= 0xF8A4)))  return 0xC5C8;
  190.   else if (((i >= 0xC5F1) && (i <= 0xC654)) || ((i >= 0xF8A5) && (i <= 0xF8ED)))  return 0xC5F1;
  191.   else if (((i >= 0xC655) && (i <= 0xC664)) || ((i >= 0xF8EE) && (i <= 0xF96A)))  return 0xC655;
  192.   else if (((i >= 0xC665) && (i <= 0xC66B)) || ((i >= 0xF96B) && (i <= 0xF9A1)))  return 0xC665;
  193.   else if (((i >= 0xC66C) && (i <= 0xC675)) || ((i >= 0xF9A2) && (i <= 0xF9B9)))  return 0xC66C;
  194.   else if (((i >= 0xC676) && (i <= 0xC678)) || ((i >= 0xF9BA) && (i <= 0xF9C5)))  return 0xC676;
  195.   else if (((i >= 0xC679) && (i <= 0xC67C)) || ((i >= 0xF9C7) && (i <= 0xF9CB)))  return 0xC679;
  196.   else if ((i == 0xC67D) || ((i >= 0xF9CC) && (i <= 0xF9CF)))  return 0xC67D;
  197.   else if (i == 0xF9D0)  return 0xF9D0;
  198.   else if ((i == 0xC67E) || (i == 0xF9D1))  return 0xC67E;
  199.   else if ((i == 0xF9C6) || (i == 0xF9D2))  return 0xF9C6;
  200.   else if (i == 0xF9D3)  return 0xF9D3;
  201.   else if (i == 0xF9D4)  return 0xF9D4;
  202.   else if (i == 0xF9D5)  return 0xF9D5;
  203.   return 0xA140;
  204. }
  205. int my_strnncoll_big5(const uchar * s1, int len1, const uchar * s2, int len2)
  206. {
  207.   uint len;
  208.   len = min(len1,len2);
  209.   while (len--)
  210.   {
  211.     if ((len > 0) && isbig5code(*s1,*(s1+1)) && isbig5code(*s2, *(s2+1)))
  212.     {
  213.       if (*s1 != *s2 || *(s1+1) != *(s2+1))
  214. return ((int) big5code(*s1,*(s1+1)) -
  215. (int) big5code(*s2,*(s2+1)));
  216.       s1 +=2;
  217.       s2 +=2;
  218.       len--;
  219.     } else if (sort_order_big5[(uchar) *s1++] != sort_order_big5[(uchar) *s2++])
  220.       return ((int) sort_order_big5[(uchar) s1[-1]] -
  221.       (int) sort_order_big5[(uchar) s2[-1]]);
  222.   }
  223.   return (int) (len1-len2);
  224. }
  225. int my_strnxfrm_big5(uchar * dest, uchar * src, int len, int srclen)
  226. {
  227.   uint16 e;
  228.   /*uchar *d = dest; XXX: unused*/
  229.   len = srclen;
  230.   while (len--)
  231.   {
  232.     if ((len > 0) && isbig5code(*src, *(src+1)))
  233.     {
  234.       e = big5strokexfrm((uint16) big5code(*src, *(src+1)));
  235.       *dest++ = big5head(e);
  236.       *dest++ = big5tail(e);
  237.       src +=2;
  238.       len--;
  239.     } else
  240.       *dest++ = sort_order_big5[(uchar) *src++];
  241.   }
  242.   return srclen;
  243. }
  244. int my_strcoll_big5(const uchar * s1, const uchar * s2)
  245. {
  246.   while (*s1 && *s2)
  247.   {
  248.     if (*(s1+1) && *(s2+1) && isbig5code(*s1,*(s1+1)) && isbig5code(*s2, *(s2+1)))
  249.     {
  250.       if (*s1 != *s2 || *(s1+1) != *(s2+1))
  251. return ((int) big5code(*s1,*(s1+1)) -
  252. (int) big5code(*s2,*(s2+1)));
  253.       s1 +=2;
  254.       s2 +=2;
  255.     } else if (sort_order_big5[(uchar) *s1++] != sort_order_big5[(uchar) *s2++])
  256.       return ((int) sort_order_big5[(uchar) s1[-1]] -
  257.       (int) sort_order_big5[(uchar) s2[-1]]);
  258.   }
  259.   return 0;
  260. }
  261. int my_strxfrm_big5(uchar * dest, uchar * src, int len)
  262. {
  263.   uint16 e;
  264.   uchar *d = dest;
  265.   if (len < 1) return 0;
  266.   if (!*src)
  267.   {
  268.     *d = '';
  269.     return 0;
  270.   }
  271.   while (*src && (len > 1))
  272.   {
  273.     if (*(src+1) && isbig5code(*src, *(src+1)))
  274.     {
  275.       e = big5strokexfrm((uint16) big5code(*src, *(src+1)));
  276.       *d++ = big5head(e);
  277.       *d++ = big5tail(e);
  278.       src +=2;
  279.       len--;
  280.     } else
  281.       *d++ = sort_order_big5[(uchar) *src++];
  282.   }
  283.   *d = '';
  284.   return (int) (d-dest);
  285. }
  286. /*
  287. ** Calculate min_str and max_str that ranges a LIKE string.
  288. ** Arguments:
  289. ** ptr Pointer to LIKE string.
  290. ** ptr_length Length of LIKE string.
  291. ** escape Escape character in LIKE.  (Normally '').
  292. ** All escape characters should be removed from min_str and max_str
  293. ** res_length   Length of min_str and max_str.
  294. ** min_str      Smallest case sensitive string that ranges LIKE.
  295. ** Should be space padded to res_length.
  296. ** max_str Largest case sensitive string that ranges LIKE.
  297. ** Normally padded with the biggest character sort value.
  298. **
  299. ** The function should return 0 if ok and 1 if the LIKE string can't be
  300. ** optimized !
  301. */
  302. #define max_sort_char ((char) 255)
  303. #define wild_one '_'
  304. #define wild_many '%'
  305. my_bool my_like_range_big5(const char *ptr,uint ptr_length,pchar escape,
  306.            uint res_length, char *min_str,char *max_str,
  307.            uint *min_length,uint *max_length)
  308. {
  309.   const char *end=ptr+ptr_length;
  310.   char *min_org=min_str;
  311.   char *min_end=min_str+res_length;
  312.   for (; ptr != end && min_str != min_end ; ptr++)
  313.   {
  314.     if (ptr+1 != end && isbig5code(ptr[0],ptr[1]))
  315.     {
  316.       *min_str++= *max_str++ = *ptr++;
  317.       *min_str++= *max_str++ = *ptr;
  318.       continue;
  319.     }
  320.     if (*ptr == escape && ptr+1 != end)
  321.     {
  322.       ptr++; /* Skipp escape */
  323.       *min_str++= *max_str++ = *ptr;
  324.       continue;
  325.     }
  326.     if (*ptr == wild_one) /* '_' in SQL */
  327.     {
  328.       *min_str++=''; /* This should be min char */
  329.       *max_str++=max_sort_char;
  330.       continue;
  331.     }
  332.     if (*ptr == wild_many) /* '%' in SQL */
  333.     {
  334.       *min_length= (uint) (min_str-min_org);
  335.       *max_length= res_length;
  336.       do {
  337. *min_str++ = ''; /* Because if key compression */
  338. *max_str++ = max_sort_char;
  339.       } while (min_str != min_end);
  340.       return 0;
  341.     }
  342.     *min_str++= *max_str++ = *ptr;
  343.   }
  344.   *min_length= *max_length= (uint) (min_str-min_org);
  345.   while (min_str != min_end)
  346.   {
  347.     *min_str++ = ' '; /* Because if key compression */
  348.     *max_str++ = ' ';
  349.   }
  350.   return 0;
  351. }
  352. int ismbchar_big5(const char* p, const char *e)
  353. {
  354.   return (isbig5head(*(p)) && (e)-(p)>1 && isbig5tail(*((p)+1))? 2: 0);
  355. }
  356. my_bool ismbhead_big5(uint c)
  357. {
  358.   return isbig5head(c);
  359. }
  360. int mbcharlen_big5(uint c)
  361. {
  362.   return (isbig5head(c)? 2: 0);
  363. }