47
47
*err_pos= 0; // No error yet
50
const char *start= str;
50
const char *start= str;
53
53
const char *pos= start;
57
if (cs && cs->mbminlen > 1)
59
for ( ; pos < end; pos+= mblen)
62
if ((mblen= cs->cset->mb_wc(cs, &wc, (const unsigned char *) pos,
63
(const unsigned char *) end)) < 1)
64
mblen= 1; // Not to hang on a wrong multibyte sequence
65
if (wc == (my_wc_t) field_separator)
70
for (; pos != end && *pos != field_separator; pos++) ;
71
var_len= (uint) (pos - start);
57
for (; pos != end && *pos != field_separator; pos++)
59
var_len= (uint32_t) (pos - start);
72
60
uint32_t find= cs ? find_type2(lib, start, var_len, cs) :
73
61
find_type(lib, start, var_len, (bool) 0);
114
102
for (uint32_t pos=0 ; (j=lib->type_names[pos++]) ; )
116
for (i=find ; i != end &&
117
my_toupper(system_charset_info,*i) ==
104
for (i=find ; i != end &&
105
my_toupper(system_charset_info,*i) ==
118
106
my_toupper(system_charset_info,*j) ; i++, j++) ;
228
216
/* Fiend end of word */
229
217
for (ptr= val ; ptr < end && my_isalpha(&my_charset_utf8_general_ci, *ptr) ; ptr++)
231
if ((res=find_type(lib, val, (uint) (ptr - val), 1)) > 0)
219
if ((res=find_type(lib, val, (uint32_t) (ptr - val), 1)) > 0)
232
220
*end_of_word= ptr;
238
Converts a string between character sets
242
from_cs source character set
243
from source, a null terminated string
244
to destination buffer
245
to_length destination buffer length
248
'to' is always terminated with a '\0' character.
249
If there is no enough space to convert whole string,
250
only prefix is converted, and terminated with '\0'.
257
uint32_t strconvert(const CHARSET_INFO * const from_cs, const char *from,
258
const CHARSET_INFO * const to_cs, char *to, uint32_t to_length, uint32_t *errors)
263
unsigned char *to_end= (unsigned char*) to + to_length - 1;
264
my_charset_conv_mb_wc mb_wc= from_cs->cset->mb_wc;
265
my_charset_conv_wc_mb wc_mb= to_cs->cset->wc_mb;
266
uint32_t error_count= 0;
271
Using 'from + 10' is safe:
272
- it is enough to scan a single character in any character set.
273
- if remaining string is shorter than 10, then mb_wc will return
274
with error because of unexpected '\0' character.
276
if ((cnvres= (*mb_wc)(from_cs, &wc,
277
(unsigned char*) from, (unsigned char*) from + 10)) > 0)
283
else if (cnvres == MY_CS_ILSEQ)
290
break; // Impossible char.
294
if ((cnvres= (*wc_mb)(to_cs, wc, (unsigned char*) to, to_end)) > 0)
296
else if (cnvres == MY_CS_ILUNI && wc != '?')
306
*errors= error_count;
307
return (uint32_t) (to - to_start);
313
226
Searches for a LEX_STRING in an LEX_STRING array.