MySQL 5.6.14 Source Code Document
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
ctype-tis620.c
1 /* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
2 
3  This program is free software; you can redistribute it and/or modify
4  it under the terms of the GNU General Public License as published by
5  the Free Software Foundation; version 2 of the License.
6 
7  This program is distributed in the hope that it will be useful,
8  but WITHOUT ANY WARRANTY; without even the implied warranty of
9  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  GNU General Public License for more details.
11 
12  You should have received a copy of the GNU General Public License
13  along with this program; if not, write to the Free Software
14  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
15 
16 /*
17  Copyright (C) 2003 by Sathit Jittanupat
18  <jsat66@hotmail.com,jsat66@yahoo.com>
19  * solving bug crash with long text field string
20  * sorting with different number of space or sign char. within string
21 
22  Copyright (C) 2001 by Korakot Chaovavanich <korakot@iname.com> and
23  Apisilp Trunganont <apisilp@pantip.inet.co.th>
24  Copyright (C) 1998, 1999 by Pruet Boonma <pruet@eng.cmu.ac.th>
25  Copyright (C) 1998 by Theppitak Karoonboonyanan <thep@links.nectec.or.th>
26  Copyright (C) 1989, 1991 by Samphan Raruenrom <samphan@thai.com>
27 
28  Permission to use, copy, modify, distribute and sell this software
29  and its documentation for any purpose is hereby granted without fee,
30  provided that the above copyright notice appear in all copies.
31  Samphan Raruenrom , Theppitak Karoonboonyanan , Pruet Boonma ,
32  Korakot Chaovavanich and Apisilp Trunganont makes no representations
33  about the suitability of this software for any purpose. It is provided
34  "as is" without express or implied warranty.
35 */
36 
37 
38 /*
39  This file is basicly tis620 character sets with some extra functions
40  for tis-620 handling
41 */
42 
43 /*
44  * This comment is parsed by configure to create ctype.c,
45  * so don't change it unless you know what you are doing.
46  *
47  * .configure. strxfrm_multiply_tis620=4
48  */
49 
50 #include <my_global.h>
51 #include <my_sys.h>
52 #include "m_string.h"
53 #include "m_ctype.h"
54 #include "t_ctype.h"
55 
56 #ifdef HAVE_CHARSET_tis620
57 
58 #define BUFFER_MULTIPLY 4
59 #define M L_MIDDLE
60 #define U L_UPPER
61 #define L L_LOWER
62 #define UU L_UPRUPR
63 #define X L_MIDDLE
64 
65 
66 static int t_ctype[][TOT_LEVELS] = {
67  /*0x00*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
68  /*0x01*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
69  /*0x02*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
70  /*0x03*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
71  /*0x04*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
72  /*0x05*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
73  /*0x06*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
74  /*0x07*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
75  /*0x08*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
76  /*0x09*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
77  /*0x0A*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
78  /*0x0B*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
79  /*0x0C*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
80  /*0x0D*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
81  /*0x0E*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
82  /*0x0F*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
83  /*0x10*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
84  /*0x11*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
85  /*0x12*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
86  /*0x13*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
87  /*0x14*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
88  /*0x15*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
89  /*0x16*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
90  /*0x17*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
91  /*0x18*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
92  /*0x19*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
93  /*0x1A*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
94  /*0x1B*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
95  /*0x1C*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
96  /*0x1D*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
97  /*0x1E*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
98  /*0x1F*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
99  /*0x20*/ { IGNORE, IGNORE, L3_SPACE, IGNORE, M},
100  /*0x21*/ { IGNORE, IGNORE, L3_EXCLAMATION, IGNORE, M },
101  /*0x22*/ { IGNORE, IGNORE, L3_QUOTATION, IGNORE, M },
102  /*0x23*/ { IGNORE, IGNORE, L3_NUMBER, IGNORE, M },
103  /*0x24*/ { IGNORE, IGNORE, L3_DOLLAR, IGNORE, M },
104  /*0x25*/ { IGNORE, IGNORE, L3_PERCENT, IGNORE, M },
105  /*0x26*/ { IGNORE, IGNORE, L3_AMPERSAND, IGNORE, M },
106  /*0x27*/ { IGNORE, IGNORE, L3_APOSTROPHE, IGNORE, M },
107  /*0x28*/ { IGNORE, IGNORE, L3_L_PARANTHESIS, IGNORE, M },
108  /*0x29*/ { IGNORE, IGNORE, L3_R_PARENTHESIS, IGNORE, M },
109  /*0x2A*/ { IGNORE, IGNORE, L3_ASTERISK, IGNORE, M },
110  /*0x2B*/ { IGNORE, IGNORE, L3_PLUS, IGNORE, M },
111  /*0x2C*/ { IGNORE, IGNORE, L3_COMMA, IGNORE, M },
112  /*0x2D*/ { IGNORE, IGNORE, L3_HYPHEN, IGNORE, M },
113  /*0x2E*/ { IGNORE, IGNORE, L3_FULL_STOP, IGNORE, M },
114  /*0x2F*/ { IGNORE, IGNORE, L3_SOLIDUS, IGNORE, M },
115  /*0x30*/ { L1_08, L2_BLANK, L3_BLANK, L4_BLANK, M },
116  /*0x31*/ { L1_18, L2_BLANK, L3_BLANK, L4_BLANK, M },
117  /*0x32*/ { L1_28, L2_BLANK, L3_BLANK, L4_BLANK, M },
118  /*0x33*/ { L1_38, L2_BLANK, L3_BLANK, L4_BLANK, M },
119  /*0x34*/ { L1_48, L2_BLANK, L3_BLANK, L4_BLANK, M },
120  /*0x35*/ { L1_58, L2_BLANK, L3_BLANK, L4_BLANK, M },
121  /*0x36*/ { L1_68, L2_BLANK, L3_BLANK, L4_BLANK, M },
122  /*0x37*/ { L1_78, L2_BLANK, L3_BLANK, L4_BLANK, M },
123  /*0x38*/ { L1_88, L2_BLANK, L3_BLANK, L4_BLANK, M },
124  /*0x39*/ { L1_98, L2_BLANK, L3_BLANK, L4_BLANK, M },
125  /*0x3A*/ { IGNORE, IGNORE, L3_COLON, IGNORE, M },
126  /*0x3B*/ { IGNORE, IGNORE, L3_SEMICOLON, IGNORE, M },
127  /*0x3C*/ { IGNORE, IGNORE, L3_LESS_THAN, IGNORE, M },
128  /*0x3D*/ { IGNORE, IGNORE, L3_EQUAL, IGNORE, M },
129  /*0x3E*/ { IGNORE, IGNORE, L3_GREATER_THAN, IGNORE, M },
130  /*0x3F*/ { IGNORE, IGNORE, L3_QUESTION, IGNORE, M },
131  /*0x40*/ { IGNORE, IGNORE, L3_AT, IGNORE, M },
132  /*0x41*/ { L1_A8, L2_BLANK, L3_BLANK, L4_CAP, M },
133  /*0x42*/ { L1_B8, L2_BLANK, L3_BLANK, L4_CAP, M },
134  /*0x43*/ { L1_C8, L2_BLANK, L3_BLANK, L4_CAP, M },
135  /*0x44*/ { L1_D8, L2_BLANK, L3_BLANK, L4_CAP, M },
136  /*0x45*/ { L1_E8, L2_BLANK, L3_BLANK, L4_CAP, M },
137  /*0x46*/ { L1_F8, L2_BLANK, L3_BLANK, L4_CAP, M },
138  /*0x47*/ { L1_G8, L2_BLANK, L3_BLANK, L4_CAP, M },
139  /*0x48*/ { L1_H8, L2_BLANK, L3_BLANK, L4_CAP, M },
140  /*0x49*/ { L1_I8, L2_BLANK, L3_BLANK, L4_CAP, M },
141  /*0x4A*/ { L1_J8, L2_BLANK, L3_BLANK, L4_CAP, M },
142  /*0x4B*/ { L1_K8, L2_BLANK, L3_BLANK, L4_CAP, M },
143  /*0x4C*/ { L1_L8, L2_BLANK, L3_BLANK, L4_CAP, M },
144  /*0x4D*/ { L1_M8, L2_BLANK, L3_BLANK, L4_CAP, M },
145  /*0x4E*/ { L1_N8, L2_BLANK, L3_BLANK, L4_CAP, M },
146  /*0x4F*/ { L1_O8, L2_BLANK, L3_BLANK, L4_CAP, M },
147  /*0x50*/ { L1_P8, L2_BLANK, L3_BLANK, L4_CAP, M },
148  /*0x51*/ { L1_Q8, L2_BLANK, L3_BLANK, L4_CAP, M },
149  /*0x52*/ { L1_R8, L2_BLANK, L3_BLANK, L4_CAP, M },
150  /*0x53*/ { L1_S8, L2_BLANK, L3_BLANK, L4_CAP, M },
151  /*0x54*/ { L1_T8, L2_BLANK, L3_BLANK, L4_CAP, M },
152  /*0x55*/ { L1_U8, L2_BLANK, L3_BLANK, L4_CAP, M },
153  /*0x56*/ { L1_V8, L2_BLANK, L3_BLANK, L4_CAP, M },
154  /*0x57*/ { L1_W8, L2_BLANK, L3_BLANK, L4_CAP, M },
155  /*0x58*/ { L1_X8, L2_BLANK, L3_BLANK, L4_CAP, M },
156  /*0x59*/ { L1_Y8, L2_BLANK, L3_BLANK, L4_CAP, M },
157  /*0x5A*/ { L1_Z8, L2_BLANK, L3_BLANK, L4_CAP, M },
158  /*0x5B*/ { IGNORE, IGNORE, L3_L_BRACKET, IGNORE, M },
159  /*0x5C*/ { IGNORE, IGNORE, L3_BK_SOLIDUS, IGNORE, M },
160  /*0x5D*/ { IGNORE, IGNORE, L3_R_BRACKET, IGNORE, M },
161  /*0x5E*/ { IGNORE, IGNORE, L3_CIRCUMFLEX, IGNORE, M },
162  /*0x5F*/ { IGNORE, IGNORE, L3_LOW_LINE, IGNORE, M },
163  /*0x60*/ { IGNORE, IGNORE, L3_GRAVE, IGNORE, M },
164  /*0x61*/ { L1_A8, L2_BLANK, L3_BLANK, L4_MIN, M },
165  /*0x62*/ { L1_B8, L2_BLANK, L3_BLANK, L4_MIN, M },
166  /*0x63*/ { L1_C8, L2_BLANK, L3_BLANK, L4_MIN, M },
167  /*0x64*/ { L1_D8, L2_BLANK, L3_BLANK, L4_MIN, M },
168  /*0x65*/ { L1_E8, L2_BLANK, L3_BLANK, L4_MIN, M },
169  /*0x66*/ { L1_F8, L2_BLANK, L3_BLANK, L4_MIN, M },
170  /*0x67*/ { L1_G8, L2_BLANK, L3_BLANK, L4_MIN, M },
171  /*0x68*/ { L1_H8, L2_BLANK, L3_BLANK, L4_MIN, M },
172  /*0x69*/ { L1_I8, L2_BLANK, L3_BLANK, L4_MIN, M },
173  /*0x6A*/ { L1_J8, L2_BLANK, L3_BLANK, L4_MIN, M },
174  /*0x6B*/ { L1_K8, L2_BLANK, L3_BLANK, L4_MIN, M },
175  /*0x6C*/ { L1_L8, L2_BLANK, L3_BLANK, L4_MIN, M },
176  /*0x6D*/ { L1_M8, L2_BLANK, L3_BLANK, L4_MIN, M },
177  /*0x6E*/ { L1_N8, L2_BLANK, L3_BLANK, L4_MIN, M },
178  /*0x6F*/ { L1_O8, L2_BLANK, L3_BLANK, L4_MIN, M },
179  /*0x70*/ { L1_P8, L2_BLANK, L3_BLANK, L4_MIN, M },
180  /*0x71*/ { L1_Q8, L2_BLANK, L3_BLANK, L4_MIN, M },
181  /*0x72*/ { L1_R8, L2_BLANK, L3_BLANK, L4_MIN, M },
182  /*0x73*/ { L1_S8, L2_BLANK, L3_BLANK, L4_MIN, M },
183  /*0x74*/ { L1_T8, L2_BLANK, L3_BLANK, L4_MIN, M },
184  /*0x75*/ { L1_U8, L2_BLANK, L3_BLANK, L4_MIN, M },
185  /*0x76*/ { L1_V8, L2_BLANK, L3_BLANK, L4_MIN, M },
186  /*0x77*/ { L1_W8, L2_BLANK, L3_BLANK, L4_MIN, M },
187  /*0x78*/ { L1_X8, L2_BLANK, L3_BLANK, L4_MIN, M },
188  /*0x79*/ { L1_Y8, L2_BLANK, L3_BLANK, L4_MIN, M },
189  /*0x7A*/ { L1_Z8, L2_BLANK, L3_BLANK, L4_MIN, M },
190  /*0x7B*/ { IGNORE, IGNORE, L3_L_BRACE, IGNORE, M },
191  /*0x7C*/ { IGNORE, IGNORE, L3_V_LINE, IGNORE, M },
192  /*0x7D*/ { IGNORE, IGNORE, L3_R_BRACE, IGNORE, M },
193  /*0x7E*/ { IGNORE, IGNORE, L3_TILDE, IGNORE, M },
194  /*0x7F*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
195  /*0x80*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
196  /*0x81*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
197  /*0x82*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
198  /*0x83*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
199  /*0x84*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
200  /*0x85*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
201  /*0x86*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
202  /*0x87*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
203  /*0x88*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
204  /*0x89*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
205  /*0x8A*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
206  /*0x8B*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
207  /*0x8C*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
208  /*0x8D*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
209  /*0x8E*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
210  /*0x8F*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
211  /*0x90*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
212  /*0x91*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
213  /*0x92*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
214  /*0x93*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
215  /*0x94*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
216  /*0x95*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
217  /*0x96*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
218  /*0x97*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
219  /*0x98*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
220  /*0x99*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
221  /*0x9A*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
222  /*0x9B*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
223  /*0x9C*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
224  /*0x9D*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
225  /*0x9E*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
226  /*0x9F*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
227  /*0xA0*/ { IGNORE, IGNORE, L3_NB_SACE, IGNORE, X },
228  /*0xA1*/ { L1_KO_KAI, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
229  /*0xA2*/ { L1_KHO_KHAI, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
230  /*0xA3*/ { L1_KHO_KHUAT, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
231  /*0xA4*/ { L1_KHO_KHWAI, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
232  /*0xA5*/ { L1_KHO_KHON, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
233  /*0xA6*/ { L1_KHO_RAKHANG, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
234  /*0xA7*/ { L1_NGO_NGU, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
235  /*0xA8*/ { L1_CHO_CHAN, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
236  /*0xA9*/ { L1_CHO_CHING, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
237  /*0xAA*/ { L1_CHO_CHANG, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
238  /*0xAB*/ { L1_SO_SO, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
239  /*0xAC*/ { L1_CHO_CHOE, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
240  /*0xAD*/ { L1_YO_YING, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
241  /*0xAE*/ { L1_DO_CHADA, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
242  /*0xAF*/ { L1_TO_PATAK, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
243  /*0xB0*/ { L1_THO_THAN, L2_BLANK,L3_BLANK, L4_BLANK, M | _consnt},
244  /*0xB1*/ { L1_THO_NANGMONTHO, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
245  /*0xB2*/ { L1_THO_PHUTHAO, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
246  /*0xB3*/ { L1_NO_NEN, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
247  /*0xB4*/ { L1_DO_DEK, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
248  /*0xB5*/ { L1_TO_TAO, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
249  /*0xB6*/ { L1_THO_THUNG, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
250  /*0xB7*/ { L1_THO_THAHAN, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
251  /*0xB8*/ { L1_THO_THONG, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
252  /*0xB9*/ { L1_NO_NU, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
253  /*0xBA*/ { L1_BO_BAIMAI, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
254  /*0xBB*/ { L1_PO_PLA, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
255  /*0xBC*/ { L1_PHO_PHUNG, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
256  /*0xBD*/ { L1_FO_FA, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
257  /*0xBE*/ { L1_PHO_PHAN, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
258  /*0xBF*/ { L1_FO_FAN, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
259  /*0xC0*/ { L1_PHO_SAMPHAO, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
260  /*0xC1*/ { L1_MO_MA, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
261  /*0xC2*/ { L1_YO_YAK, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
262  /*0xC3*/ { L1_RO_RUA, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
263  /*0xC4*/ { L1_RU, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
264  /*0xC5*/ { L1_LO_LING, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
265  /*0xC6*/ { L1_LU, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
266  /*0xC7*/ { L1_WO_WAEN, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
267  /*0xC8*/ { L1_SO_SALA, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
268  /*0xC9*/ { L1_SO_RUSI, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
269  /*0xCA*/ { L1_SO_SUA, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
270  /*0xCB*/ { L1_HO_HIP, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
271  /*0xCC*/ { L1_LO_CHULA, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
272  /*0xCD*/ { L1_O_ANG, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
273  /*0xCE*/ { L1_HO_NOKHUK, L2_BLANK, L3_BLANK, L4_BLANK, M | _consnt},
274  /*0xCF*/ { IGNORE, IGNORE, L3_PAIYAN_NOI, IGNORE, M},
275  /*0xD0*/ { L1_SARA_A, L2_BLANK, L3_BLANK, L4_BLANK, M | _fllwvowel},
276  /*0xD1*/ { L1_MAI_HAN_AKAT, L2_BLANK, L3_BLANK, L4_BLANK, U | _uprvowel},
277  /*0xD2*/ { L1_SARA_AA, L2_BLANK, L3_BLANK, L4_BLANK, M | _fllwvowel},
278  /*0xD3*/ { L1_SARA_AM, L2_BLANK, L3_BLANK, L4_BLANK, M | _fllwvowel},
279  /*0xD4*/ { L1_SARA_I, L2_BLANK, L3_BLANK, L4_BLANK, U | _uprvowel},
280  /*0xD5*/ { L1_SARA_II, L2_BLANK, L3_BLANK, L4_BLANK, U | _uprvowel},
281  /*0xD6*/ { L1_SARA_UE, L2_BLANK, L3_BLANK, L4_BLANK, U | _uprvowel},
282  /*0xD7*/ { L1_SARA_UEE, L2_BLANK, L3_BLANK, L4_BLANK, U | _uprvowel},
283  /*0xD8*/ { L1_SARA_U, L2_BLANK, L3_BLANK, L4_BLANK, L | _lwrvowel},
284  /*0xD9*/ { L1_SARA_UU, L2_BLANK, L3_BLANK, L4_BLANK, L | _lwrvowel},
285  /*0xDA*/ { IGNORE, L2_PINTHU, L3_BLANK, L4_BLANK, L },
286  /*0xDB*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
287  /*0xDC*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
288  /*0xDD*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
289  /*0xDE*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
290  /*0xDF*/ { IGNORE, IGNORE, L3_BAHT, IGNORE, M},
291  /*0xE0*/ { L1_SARA_E, L2_BLANK, L3_BLANK, L4_BLANK, M | _ldvowel },
292  /*0xE1*/ { L1_SARA_AE, L2_BLANK, L3_BLANK, L4_BLANK, M | _ldvowel },
293  /*0xE2*/ { L1_SARA_O, L2_BLANK, L3_BLANK, L4_BLANK, M | _ldvowel },
294  /*0xE3*/ { L1_SARA_AI_MAIMUAN, L2_BLANK, L3_BLANK, L4_BLANK, M | _ldvowel },
295  /*0xE4*/ { L1_SARA_AI_MAIMALAI, L2_BLANK, L3_BLANK, L4_BLANK, M | _ldvowel },
296  /*0xE5*/ { L1_SARA_AA, L2_BLANK, L3_BLANK, L4_EXT, M | _fllwvowel },
297  /*0xE6*/ { IGNORE, IGNORE, L3_MAI_YAMOK, IGNORE, M | _stone },
298  /*0xE7*/ { IGNORE, L2_TYKHU, L3_BLANK, L4_BLANK, U | _diacrt1 | _stone },
299  /*0xE8*/ { IGNORE, L2_TONE1, L3_BLANK, L4_BLANK, UU | _tone | _combine | _stone },
300  /*0xE9*/ { IGNORE, L2_TONE2, L3_BLANK, L4_BLANK, UU | _tone | _combine | _stone },
301  /*0xEA*/ { IGNORE, L2_TONE3, L3_BLANK, L4_BLANK, UU | _tone | _combine | _stone },
302  /*0xEB*/ { IGNORE, L2_TONE4, L3_BLANK, L4_BLANK, UU | _tone | _combine | _stone },
303  /*0xEC*/ { IGNORE, L2_GARAN, L3_BLANK, L4_BLANK, UU | _diacrt2 | _combine | _stone },
304  /*0xED*/ { L1_NKHIT, L2_BLANK, L3_BLANK, L4_BLANK, U | _diacrt1 },
305  /*0xEE*/ { IGNORE, L2_YAMAK, L3_BLANK, L4_BLANK, U | _diacrt1 },
306  /*0xEF*/ { IGNORE, IGNORE, L3_FONGMAN, IGNORE, M },
307  /*0xF0*/ { L1_08, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig },
308  /*0xF1*/ { L1_18, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig },
309  /*0xF2*/ { L1_28, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig },
310  /*0xF3*/ { L1_38, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig },
311  /*0xF4*/ { L1_48, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig },
312  /*0xF5*/ { L1_58, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig },
313  /*0xF6*/ { L1_68, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig },
314  /*0xF7*/ { L1_78, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig },
315  /*0xF8*/ { L1_88, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig },
316  /*0xF9*/ { L1_98, L2_THAII, L3_BLANK, L4_BLANK, M | _tdig },
317  /*0xFA*/ { IGNORE, IGNORE, L3_ANGKHANKHU, IGNORE, X },
318  /*0xFB*/ { IGNORE, IGNORE, L3_KHOMUT, IGNORE, X },
319  /*0xFC*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
320  /*0xFD*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
321  /*0xFE*/ { IGNORE, IGNORE, IGNORE, IGNORE, X },
322  /* Utilize 0xFF for max_sort_chr in my_like_range_tis620 */
323  /*0xFF*/ { 255 /*IGNORE*/, IGNORE, IGNORE, IGNORE, X },
324 };
325 
326 static uchar ctype_tis620[257] =
327 {
328  0, /* For standard library */
329  32,32,32,32,32,32,32,32,32,40,40,40,40,40,32,32,
330  32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
331  72,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
332  132,132,132,132,132,132,132,132,132,132,16,16,16,16,16,16,
333  16,129,129,129,129,129,129,1,1,1,1,1,1,1,1,1,
334  1,1,1,1,1,1,1,1,1,1,1,16,16,16,16,16,
335  16,130,130,130,130,130,130,2,2,2,2,2,2,2,2,2,
336  2,2,2,2,2,2,2,2,2,2,2,16,16,16,16,32,
337  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
338  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
339  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
340  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
341  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
342  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
343  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
344  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
345 };
346 
347 static uchar to_lower_tis620[]=
348 {
349  '\000','\001','\002','\003','\004','\005','\006','\007',
350  '\010','\011','\012','\013','\014','\015','\016','\017',
351  '\020','\021','\022','\023','\024','\025','\026','\027',
352  '\030','\031','\032','\033','\034','\035','\036','\037',
353  ' ', '!', '"', '#', '$', '%', '&', '\'',
354  '(', ')', '*', '+', ',', '-', '.', '/',
355  '0', '1', '2', '3', '4', '5', '6', '7',
356  '8', '9', ':', ';', '<', '=', '>', '?',
357  '@', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
358  'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
359  'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
360  'x', 'y', 'z', '[', '\\', ']', '^', '_',
361  '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
362  'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
363  'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
364  'x', 'y', 'z', '{', '|', '}', '~', '\177',
365  (uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207',
366  (uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217',
367  (uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227',
368  (uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237',
369  (uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247',
370  (uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257',
371  (uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267',
372  (uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277',
373  (uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307',
374  (uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317',
375  (uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327',
376  (uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337',
377  (uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347',
378  (uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357',
379  (uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367',
380  (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377',
381 };
382 
383 static uchar to_upper_tis620[]=
384 {
385  '\000','\001','\002','\003','\004','\005','\006','\007',
386  '\010','\011','\012','\013','\014','\015','\016','\017',
387  '\020','\021','\022','\023','\024','\025','\026','\027',
388  '\030','\031','\032','\033','\034','\035','\036','\037',
389  ' ', '!', '"', '#', '$', '%', '&', '\'',
390  '(', ')', '*', '+', ',', '-', '.', '/',
391  '0', '1', '2', '3', '4', '5', '6', '7',
392  '8', '9', ':', ';', '<', '=', '>', '?',
393  '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
394  'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
395  'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
396  'X', 'Y', 'Z', '[', '\\', ']', '^', '_',
397  '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
398  'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
399  'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
400  'X', 'Y', 'Z', '{', '|', '}', '~', '\177',
401  (uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207',
402  (uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217',
403  (uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227',
404  (uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237',
405  (uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247',
406  (uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257',
407  (uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267',
408  (uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277',
409  (uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307',
410  (uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317',
411  (uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327',
412  (uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337',
413  (uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347',
414  (uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357',
415  (uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367',
416  (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377',
417 };
418 
419 static uchar sort_order_tis620[]=
420 {
421  '\000','\001','\002','\003','\004','\005','\006','\007',
422  '\010','\011','\012','\013','\014','\015','\016','\017',
423  '\020','\021','\022','\023','\024','\025','\026','\027',
424  '\030','\031','\032','\033','\034','\035','\036','\037',
425  ' ', '!', '"', '#', '$', '%', '&', '\'',
426  '(', ')', '*', '+', ',', '-', '.', '/',
427  '0', '1', '2', '3', '4', '5', '6', '7',
428  '8', '9', ':', ';', '<', '=', '>', '?',
429  '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
430  'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
431  'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
432  'X', 'Y', 'Z', '\\', ']', '[', '^', '_',
433  'E', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
434  'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
435  'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
436  'X', 'Y', 'Z', '{', '|', '}', 'Y', '\177',
437  (uchar) '\200',(uchar) '\201',(uchar) '\202',(uchar) '\203',(uchar) '\204',(uchar) '\205',(uchar) '\206',(uchar) '\207',
438  (uchar) '\210',(uchar) '\211',(uchar) '\212',(uchar) '\213',(uchar) '\214',(uchar) '\215',(uchar) '\216',(uchar) '\217',
439  (uchar) '\220',(uchar) '\221',(uchar) '\222',(uchar) '\223',(uchar) '\224',(uchar) '\225',(uchar) '\226',(uchar) '\227',
440  (uchar) '\230',(uchar) '\231',(uchar) '\232',(uchar) '\233',(uchar) '\234',(uchar) '\235',(uchar) '\236',(uchar) '\237',
441  (uchar) '\240',(uchar) '\241',(uchar) '\242',(uchar) '\243',(uchar) '\244',(uchar) '\245',(uchar) '\246',(uchar) '\247',
442  (uchar) '\250',(uchar) '\251',(uchar) '\252',(uchar) '\253',(uchar) '\254',(uchar) '\255',(uchar) '\256',(uchar) '\257',
443  (uchar) '\260',(uchar) '\261',(uchar) '\262',(uchar) '\263',(uchar) '\264',(uchar) '\265',(uchar) '\266',(uchar) '\267',
444  (uchar) '\270',(uchar) '\271',(uchar) '\272',(uchar) '\273',(uchar) '\274',(uchar) '\275',(uchar) '\276',(uchar) '\277',
445  (uchar) '\300',(uchar) '\301',(uchar) '\302',(uchar) '\303',(uchar) '\304',(uchar) '\305',(uchar) '\306',(uchar) '\307',
446  (uchar) '\310',(uchar) '\311',(uchar) '\312',(uchar) '\313',(uchar) '\314',(uchar) '\315',(uchar) '\316',(uchar) '\317',
447  (uchar) '\320',(uchar) '\321',(uchar) '\322',(uchar) '\323',(uchar) '\324',(uchar) '\325',(uchar) '\326',(uchar) '\327',
448  (uchar) '\330',(uchar) '\331',(uchar) '\332',(uchar) '\333',(uchar) '\334',(uchar) '\335',(uchar) '\336',(uchar) '\337',
449  (uchar) '\340',(uchar) '\341',(uchar) '\342',(uchar) '\343',(uchar) '\344',(uchar) '\345',(uchar) '\346',(uchar) '\347',
450  (uchar) '\350',(uchar) '\351',(uchar) '\352',(uchar) '\353',(uchar) '\354',(uchar) '\355',(uchar) '\356',(uchar) '\357',
451  (uchar) '\360',(uchar) '\361',(uchar) '\362',(uchar) '\363',(uchar) '\364',(uchar) '\365',(uchar) '\366',(uchar) '\367',
452  (uchar) '\370',(uchar) '\371',(uchar) '\372',(uchar) '\373',(uchar) '\374',(uchar) '\375',(uchar) '\376',(uchar) '\377',
453 };
454 
455 
456 /*
457  Convert thai string to "Standard C String Function" sortable string
458 
459  SYNOPSIS
460  thai2sortable()
461  tstr String to convert. Does not have to end with \0
462  len Length of tstr
463 */
464 
465 static size_t thai2sortable(uchar *tstr, size_t len)
466 {
467  uchar *p;
468  int tlen;
469  uchar l2bias;
470 
471  tlen= len;
472  l2bias= 256 - 8;
473  for (p= tstr; tlen > 0; p++, tlen--)
474  {
475  uchar c= *p;
476 
477  if (isthai(c))
478  {
479  int *t_ctype0= t_ctype[c];
480 
481  if (isconsnt(c))
482  l2bias -= 8;
483  if (isldvowel(c) && tlen != 1 && isconsnt(p[1]))
484  {
485  /* simply swap between leading-vowel and consonant */
486  *p= p[1];
487  p[1]= c;
488  tlen--;
489  p++;
490  continue;
491  }
492 
493  /* if found level 2 char (L2_GARAN,L2_TONE*,L2_TYKHU) move to last */
494  if (t_ctype0[1] >= L2_GARAN)
495  {
496  /*
497  l2bias use to control position weight of l2char
498  example (*=l2char) XX*X must come before X*XX
499  */
500  memmove((char*) p, (char*) (p+1), tlen-1);
501  tstr[len-1]= l2bias + t_ctype0[1]- L2_GARAN +1;
502  p--;
503  continue;
504  }
505  }
506  else
507  {
508  l2bias-= 8;
509  *p= to_lower_tis620[c];
510  }
511  }
512  return len;
513 }
514 
515 
516 /*
517  strncoll() replacement, compare 2 string, both are converted to sortable
518  string
519 
520  NOTE:
521  We can't cut strings at end \0 as this would break comparision with
522  LIKE characters, where the min range is stored as end \0
523 
524  Arg: 2 Strings and it compare length
525  Ret: strcmp result
526 */
527 
528 static
529 int my_strnncoll_tis620(const CHARSET_INFO *cs __attribute__((unused)),
530  const uchar *s1, size_t len1,
531  const uchar *s2, size_t len2,
532  my_bool s2_is_prefix)
533 {
534  uchar buf[80] ;
535  uchar *tc1, *tc2;
536  int i;
537 
538  if (s2_is_prefix && len1 > len2)
539  len1= len2;
540 
541  tc1= buf;
542  if ((len1 + len2 +2) > (int) sizeof(buf))
543  tc1= (uchar*) my_str_malloc(len1+len2+2);
544  tc2= tc1 + len1+1;
545  memcpy((char*) tc1, (char*) s1, len1);
546  tc1[len1]= 0; /* if length(s1)> len1, need to put 'end of string' */
547  memcpy((char *)tc2, (char *)s2, len2);
548  tc2[len2]= 0; /* put end of string */
549  thai2sortable(tc1, len1);
550  thai2sortable(tc2, len2);
551  i= strcmp((char*)tc1, (char*)tc2);
552  if (tc1 != buf)
553  my_str_free(tc1);
554  return i;
555 }
556 
557 
558 static
559 int my_strnncollsp_tis620(const CHARSET_INFO * cs __attribute__((unused)),
560  const uchar *a0, size_t a_length,
561  const uchar *b0, size_t b_length,
562  my_bool diff_if_only_endspace_difference)
563 {
564  uchar buf[80], *end, *a, *b, *alloced= NULL;
565  size_t length;
566  int res= 0;
567 
568 #ifndef VARCHAR_WITH_DIFF_ENDSPACE_ARE_DIFFERENT_FOR_UNIQUE
569  diff_if_only_endspace_difference= 0;
570 #endif
571 
572  a= buf;
573  if ((a_length + b_length +2) > (int) sizeof(buf))
574  alloced= a= (uchar*) my_str_malloc(a_length+b_length+2);
575 
576  b= a + a_length+1;
577  memcpy((char*) a, (char*) a0, a_length);
578  a[a_length]= 0; /* if length(a0)> len1, need to put 'end of string' */
579  memcpy((char *)b, (char *)b0, b_length);
580  b[b_length]= 0; /* put end of string */
581  a_length= thai2sortable(a, a_length);
582  b_length= thai2sortable(b, b_length);
583 
584  end= a + (length= MY_MIN(a_length, b_length));
585  while (a < end)
586  {
587  if (*a++ != *b++)
588  {
589  res= ((int) a[-1] - (int) b[-1]);
590  goto ret;
591  }
592  }
593  if (a_length != b_length)
594  {
595  int swap= 1;
596  if (diff_if_only_endspace_difference)
597  res= 1; /* Assume 'a' is bigger */
598  /*
599  Check the next not space character of the longer key. If it's < ' ',
600  then it's smaller than the other key.
601  */
602  if (a_length < b_length)
603  {
604  /* put shorter key in s */
605  a_length= b_length;
606  a= b;
607  swap= -1; /* swap sign of result */
608  res= -res;
609  }
610  for (end= a + a_length-length; a < end ; a++)
611  {
612  if (*a != ' ')
613  {
614  res= (*a < ' ') ? -swap : swap;
615  goto ret;
616  }
617  }
618  }
619 
620 ret:
621 
622  if (alloced)
623  my_str_free(alloced);
624  return res;
625 }
626 
627 
628 /*
629  strnxfrm replacment, convert Thai string to sortable string
630 
631  Arg: Destination buffer, source string, dest length and source length
632  Ret: Conveted string size
633 */
634 
635 static size_t
636 my_strnxfrm_tis620(const CHARSET_INFO *cs,
637  uchar *dst, size_t dstlen, uint nweights,
638  const uchar *src, size_t srclen, uint flags)
639 {
640  size_t len, dstlen0= dstlen;
641  len= (uint) (strmake((char*) dst, (char*) src, MY_MIN(dstlen, srclen)) -
642  (char*) dst);
643  len= thai2sortable(dst, len);
644  set_if_smaller(dstlen, nweights);
645  set_if_smaller(len, dstlen);
646  len= my_strxfrm_pad_desc_and_reverse(cs, dst, dst + len, dst + dstlen,
647  dstlen - len, flags, 0);
648  if ((flags & MY_STRXFRM_PAD_TO_MAXLEN) && len < dstlen0)
649  {
650  uint fill_length= dstlen0 - len;
651  cs->cset->fill(cs, (char*) dst + len, fill_length, cs->pad_char);
652  len= dstlen0;
653  }
654  return len;
655 }
656 
657 
658 static unsigned short cs_to_uni[256]={
659 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
660 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
661 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,
662 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F,
663 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
664 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
665 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
666 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
667 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
668 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
669 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
670 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
671 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
672 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
673 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
674 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,
675 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,
676 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,
677 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,
678 0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F,
679 0xFFFD,0x0E01,0x0E02,0x0E03,0x0E04,0x0E05,0x0E06,0x0E07,
680 0x0E08,0x0E09,0x0E0A,0x0E0B,0x0E0C,0x0E0D,0x0E0E,0x0E0F,
681 0x0E10,0x0E11,0x0E12,0x0E13,0x0E14,0x0E15,0x0E16,0x0E17,
682 0x0E18,0x0E19,0x0E1A,0x0E1B,0x0E1C,0x0E1D,0x0E1E,0x0E1F,
683 0x0E20,0x0E21,0x0E22,0x0E23,0x0E24,0x0E25,0x0E26,0x0E27,
684 0x0E28,0x0E29,0x0E2A,0x0E2B,0x0E2C,0x0E2D,0x0E2E,0x0E2F,
685 0x0E30,0x0E31,0x0E32,0x0E33,0x0E34,0x0E35,0x0E36,0x0E37,
686 0x0E38,0x0E39,0x0E3A,0xFFFD,0xFFFD,0xFFFD,0xFFFD,0x0E3F,
687 0x0E40,0x0E41,0x0E42,0x0E43,0x0E44,0x0E45,0x0E46,0x0E47,
688 0x0E48,0x0E49,0x0E4A,0x0E4B,0x0E4C,0x0E4D,0x0E4E,0x0E4F,
689 0x0E50,0x0E51,0x0E52,0x0E53,0x0E54,0x0E55,0x0E56,0x0E57,
690 0x0E58,0x0E59,0x0E5A,0x0E5B,0xFFFD,0xFFFD,0xFFFD,0xFFFD
691 };
692 static uchar pl00[256]={
693 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007,
694 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F,
695 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017,
696 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F,
697 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027,
698 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F,
699 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,
700 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F,
701 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047,
702 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F,
703 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057,
704 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F,
705 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067,
706 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F,
707 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077,
708 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F,
709 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,
710 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,
711 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,
712 0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F,
713 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
714 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
715 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
716 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
717 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
718 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
719 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
720 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
721 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
722 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
723 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
724 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
725 };
726 static uchar pl0E[256]={
727 0x0000,0x00A1,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7,
728 0x00A8,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF,
729 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7,
730 0x00B8,0x00B9,0x00BA,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF,
731 0x00C0,0x00C1,0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x00C7,
732 0x00C8,0x00C9,0x00CA,0x00CB,0x00CC,0x00CD,0x00CE,0x00CF,
733 0x00D0,0x00D1,0x00D2,0x00D3,0x00D4,0x00D5,0x00D6,0x00D7,
734 0x00D8,0x00D9,0x00DA,0x0000,0x0000,0x0000,0x0000,0x00DF,
735 0x00E0,0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x00E6,0x00E7,
736 0x00E8,0x00E9,0x00EA,0x00EB,0x00EC,0x00ED,0x00EE,0x00EF,
737 0x00F0,0x00F1,0x00F2,0x00F3,0x00F4,0x00F5,0x00F6,0x00F7,
738 0x00F8,0x00F9,0x00FA,0x00FB,0x0000,0x0000,0x0000,0x0000,
739 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
740 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
741 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
742 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
743 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
744 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
745 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
746 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
747 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
748 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
749 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
750 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
751 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
752 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
753 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
754 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
755 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
756 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
757 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
758 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
759 };
760 static uchar plFF[256]={
761 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
762 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
763 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
764 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
765 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
766 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
767 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
768 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
769 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
770 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
771 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
772 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
773 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
774 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
775 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
776 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
777 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
778 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
779 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
780 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
781 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
782 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
783 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
784 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
785 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
786 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
787 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
788 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
789 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
790 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
791 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
792 0x0000,0x0000,0x0000,0x0000,0x0000,0x00FF,0x0000,0x0000
793 };
794 static uchar *uni_to_cs[256]={
795 pl00,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
796 NULL,NULL,NULL,NULL,NULL,NULL,pl0E,NULL,
797 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
798 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
799 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
800 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
801 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
802 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
803 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
804 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
805 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
806 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
807 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
808 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
809 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
810 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
811 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
812 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
813 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
814 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
815 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
816 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
817 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
818 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
819 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
820 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
821 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
822 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
823 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
824 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
825 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
826 NULL,NULL,NULL,NULL,NULL,NULL,NULL,plFF
827 };
828 
829 
830 static
831 int my_mb_wc_tis620(const CHARSET_INFO *cs __attribute__((unused)),
832  my_wc_t *wc,
833  const uchar *str,
834  const uchar *end __attribute__((unused)))
835 {
836  if (str >= end)
837  return MY_CS_TOOSMALL;
838 
839  *wc=cs_to_uni[*str];
840  return (!wc[0] && str[0]) ? -1 : 1;
841 }
842 
843 static
844 int my_wc_mb_tis620(const CHARSET_INFO *cs __attribute__((unused)),
845  my_wc_t wc,
846  uchar *str,
847  uchar *end __attribute__((unused)))
848 {
849  uchar *pl;
850 
851  if (str >= end)
852  return MY_CS_TOOSMALL;
853 
854  pl= uni_to_cs[(wc>>8) & 0xFF];
855  str[0]= pl ? pl[wc & 0xFF] : '\0';
856  return (!str[0] && wc) ? MY_CS_ILUNI : 1;
857 }
858 
859 
860 static MY_COLLATION_HANDLER my_collation_ci_handler =
861 {
862  NULL, /* init */
863  my_strnncoll_tis620,
864  my_strnncollsp_tis620,
865  my_strnxfrm_tis620,
866  my_strnxfrmlen_simple,
867  my_like_range_simple,
868  my_wildcmp_8bit, /* wildcmp */
869  my_strcasecmp_8bit,
870  my_instr_simple, /* QQ: To be fixed */
871  my_hash_sort_simple,
872  my_propagate_simple
873 };
874 
875 static MY_CHARSET_HANDLER my_charset_handler=
876 {
877  NULL, /* init */
878  NULL, /* ismbchar */
879  my_mbcharlen_8bit, /* mbcharlen */
880  my_numchars_8bit,
881  my_charpos_8bit,
882  my_well_formed_len_8bit,
883  my_lengthsp_8bit,
884  my_numcells_8bit,
885  my_mb_wc_tis620, /* mb_wc */
886  my_wc_mb_tis620, /* wc_mb */
887  my_mb_ctype_8bit,
888  my_caseup_str_8bit,
889  my_casedn_str_8bit,
890  my_caseup_8bit,
891  my_casedn_8bit,
892  my_snprintf_8bit,
893  my_long10_to_str_8bit,
894  my_longlong10_to_str_8bit,
895  my_fill_8bit,
896  my_strntol_8bit,
897  my_strntoul_8bit,
898  my_strntoll_8bit,
899  my_strntoull_8bit,
900  my_strntod_8bit,
901  my_strtoll10_8bit,
902  my_strntoull10rnd_8bit,
903  my_scan_8bit
904 };
905 
906 
907 
908 CHARSET_INFO my_charset_tis620_thai_ci=
909 {
910  18,0,0, /* number */
911  MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM, /* state */
912  "tis620", /* cs name */
913  "tis620_thai_ci", /* name */
914  "", /* comment */
915  NULL, /* tailoring */
916  ctype_tis620,
917  to_lower_tis620,
918  to_upper_tis620,
919  sort_order_tis620,
920  NULL, /* uca */
921  NULL, /* tab_to_uni */
922  NULL, /* tab_from_uni */
923  &my_unicase_default,/* caseinfo */
924  NULL, /* state_map */
925  NULL, /* ident_map */
926  4, /* strxfrm_multiply */
927  1, /* caseup_multiply */
928  1, /* casedn_multiply */
929  1, /* mbminlen */
930  1, /* mbmaxlen */
931  0, /* min_sort_char */
932  255, /* max_sort_char */
933  ' ', /* pad char */
934  0, /* escape_with_backslash_is_dangerous */
935  1, /* levels_for_compare */
936  1, /* levels_for_order */
937  &my_charset_handler,
938  &my_collation_ci_handler
939 };
940 
941 CHARSET_INFO my_charset_tis620_bin=
942 {
943  89,0,0, /* number */
944  MY_CS_COMPILED|MY_CS_BINSORT, /* state */
945  "tis620", /* cs name */
946  "tis620_bin", /* name */
947  "", /* comment */
948  NULL, /* tailoring */
949  ctype_tis620,
950  to_lower_tis620,
951  to_upper_tis620,
952  NULL, /* sort_order */
953  NULL, /* uca */
954  NULL, /* tab_to_uni */
955  NULL, /* tab_from_uni */
956  &my_unicase_default,/* caseinfo */
957  NULL, /* state_map */
958  NULL, /* ident_map */
959  1, /* strxfrm_multiply */
960  1, /* caseup_multiply */
961  1, /* casedn_multiply */
962  1, /* mbminlen */
963  1, /* mbmaxlen */
964  0, /* min_sort_char */
965  255, /* max_sort_char */
966  ' ', /* pad char */
967  0, /* escape_with_backslash_is_dangerous */
968  1, /* levels_for_compare */
969  1, /* levels_for_order */
970  &my_charset_handler,
971  &my_collation_8bit_bin_handler
972 };
973 
974 
975 #endif