23 #include <my_attribute.h>
24 #include "my_global.h"
30 #define MY_CS_NAME_SIZE 32
31 #define MY_CS_CTYPE_TABLE_SIZE 257
32 #define MY_CS_TO_LOWER_TABLE_SIZE 256
33 #define MY_CS_TO_UPPER_TABLE_SIZE 256
34 #define MY_CS_SORT_ORDER_TABLE_SIZE 256
35 #define MY_CS_TO_UNI_TABLE_SIZE 256
37 #define CHARSET_DIR "charsets/"
41 #define MY_CS_REPLACEMENT_CHARACTER 0xFFFD
50 #define MB2(x) (((x) >> 8) + (((x) & 0xFF) << 8))
51 #define MY_PUT_MB2(s, code) { *((uint16*)(s))= (code); }
54 #define MY_PUT_MB2(s, code) { (s)[0]= code >> 8; (s)[1]= code & 0xFF; }
79 #define MY_UCA_MAX_CONTRACTION 6
80 #define MY_UCA_MAX_WEIGHT_SIZE 8
81 #define MY_UCA_WEIGHT_LEVELS 1
85 my_wc_t ch[MY_UCA_MAX_CONTRACTION];
86 uint16 weight[MY_UCA_MAX_WEIGHT_SIZE];
100 my_bool my_uca_can_be_contraction_head(
const MY_CONTRACTIONS *c, my_wc_t wc);
101 my_bool my_uca_can_be_contraction_tail(
const MY_CONTRACTIONS *c, my_wc_t wc);
103 my_wc_t wc1, my_wc_t wc2);
121 my_wc_t first_non_ignorable;
122 my_wc_t last_non_ignorable;
123 my_wc_t first_primary_ignorable;
124 my_wc_t last_primary_ignorable;
125 my_wc_t first_secondary_ignorable;
126 my_wc_t last_secondary_ignorable;
127 my_wc_t first_tertiary_ignorable;
128 my_wc_t last_tertiary_ignorable;
129 my_wc_t first_trailing;
130 my_wc_t last_trailing;
131 my_wc_t first_variable;
132 my_wc_t last_variable;
150 #define MY_CS_ILSEQ 0
151 #define MY_CS_ILUNI 0
152 #define MY_CS_TOOSMALL -101
153 #define MY_CS_TOOSMALL2 -102
154 #define MY_CS_TOOSMALL3 -103
156 #define MY_CS_TOOSMALL4 -104
157 #define MY_CS_TOOSMALL5 -105
158 #define MY_CS_TOOSMALL6 -106
160 #define MY_CS_TOOSMALLN(n) (-100-(n))
162 #define MY_SEQ_INTTAIL 1
163 #define MY_SEQ_SPACES 2
166 #define MY_CS_COMPILED 1
167 #define MY_CS_CONFIG 2
168 #define MY_CS_INDEX 4
169 #define MY_CS_LOADED 8
170 #define MY_CS_BINSORT 16
171 #define MY_CS_PRIMARY 32
172 #define MY_CS_STRNXFRM 64
173 #define MY_CS_UNICODE 128
174 #define MY_CS_READY 256
175 #define MY_CS_AVAILABLE 512
176 #define MY_CS_CSSORT 1024
177 #define MY_CS_HIDDEN 2048
178 #define MY_CS_PUREASCII 4096
179 #define MY_CS_NONASCII 8192
180 #define MY_CS_UNICODE_SUPPLEMENT 16384
181 #define MY_CS_LOWER_SORT 32768
182 #define MY_CHARSET_UNDEFINED 0
185 #define MY_REPERTOIRE_ASCII 1
186 #define MY_REPERTOIRE_EXTENDED 2
187 #define MY_REPERTOIRE_UNICODE30 3
190 #define MY_STRXFRM_LEVEL1 0x00000001
191 #define MY_STRXFRM_LEVEL2 0x00000002
192 #define MY_STRXFRM_LEVEL3 0x00000004
193 #define MY_STRXFRM_LEVEL4 0x00000008
194 #define MY_STRXFRM_LEVEL5 0x00000010
195 #define MY_STRXFRM_LEVEL6 0x00000020
196 #define MY_STRXFRM_LEVEL_ALL 0x0000003F
197 #define MY_STRXFRM_NLEVELS 6
199 #define MY_STRXFRM_PAD_WITH_SPACE 0x00000040
200 #define MY_STRXFRM_PAD_TO_MAXLEN 0x00000080
202 #define MY_STRXFRM_DESC_LEVEL1 0x00000100
203 #define MY_STRXFRM_DESC_LEVEL2 0x00000200
204 #define MY_STRXFRM_DESC_LEVEL3 0x00000300
205 #define MY_STRXFRM_DESC_LEVEL4 0x00000800
206 #define MY_STRXFRM_DESC_LEVEL5 0x00001000
207 #define MY_STRXFRM_DESC_LEVEL6 0x00002000
208 #define MY_STRXFRM_DESC_SHIFT 8
210 #define MY_STRXFRM_UNUSED_00004000 0x00004000
211 #define MY_STRXFRM_UNUSED_00008000 0x00008000
213 #define MY_STRXFRM_REVERSE_LEVEL1 0x00010000
214 #define MY_STRXFRM_REVERSE_LEVEL2 0x00020000
215 #define MY_STRXFRM_REVERSE_LEVEL3 0x00040000
216 #define MY_STRXFRM_REVERSE_LEVEL4 0x00080000
217 #define MY_STRXFRM_REVERSE_LEVEL5 0x00100000
218 #define MY_STRXFRM_REVERSE_LEVEL6 0x00200000
219 #define MY_STRXFRM_REVERSE_SHIFT 16
238 MY_LEX_START, MY_LEX_CHAR, MY_LEX_IDENT,
239 MY_LEX_IDENT_SEP, MY_LEX_IDENT_START,
240 MY_LEX_REAL, MY_LEX_HEX_NUMBER, MY_LEX_BIN_NUMBER,
241 MY_LEX_CMP_OP, MY_LEX_LONG_CMP_OP, MY_LEX_STRING, MY_LEX_COMMENT, MY_LEX_END,
242 MY_LEX_OPERATOR_OR_IDENT, MY_LEX_NUMBER_IDENT, MY_LEX_INT_OR_REAL,
243 MY_LEX_REAL_OR_POINT, MY_LEX_BOOL, MY_LEX_EOL, MY_LEX_ESCAPE,
244 MY_LEX_LONG_COMMENT, MY_LEX_END_LONG_COMMENT, MY_LEX_SEMICOLON,
245 MY_LEX_SET_VAR, MY_LEX_USER_END, MY_LEX_HOSTNAME, MY_LEX_SKIP,
246 MY_LEX_USER_VARIABLE_DELIMITER, MY_LEX_SYSTEM_VAR,
247 MY_LEX_IDENT_OR_KEYWORD,
248 MY_LEX_IDENT_OR_HEX, MY_LEX_IDENT_OR_BIN, MY_LEX_IDENT_OR_NCHAR,
249 MY_LEX_STRING_OR_DELIMITER
257 void *(*once_alloc)(size_t);
258 void *(*malloc)(size_t);
259 void *(*realloc)(
void *, size_t);
260 void (*free)(
void *);
261 void (*reporter)(
enum loglevel,
const char *format, ...);
266 extern int (*my_string_stack_guard)(int);
274 const uchar *, size_t,
const uchar *, size_t, my_bool);
276 const uchar *, size_t,
const uchar *, size_t,
277 my_bool diff_if_only_endspace_difference);
279 uchar *dst,
size_t dstlen, uint nweights,
280 const uchar *src,
size_t srclen, uint
flags);
283 const char *s,
size_t s_length,
284 pchar w_prefix, pchar w_one, pchar w_many,
286 char *min_str,
char *max_str,
287 size_t *min_len,
size_t *max_len);
289 const char *str,
const char *str_end,
290 const char *wildstr,
const char *wildend,
291 int escape,
int w_one,
int w_many);
297 const char *b,
size_t b_length,
298 const char *s,
size_t s_length,
303 size_t len, ulong *nr1, ulong *nr2);
304 my_bool (*propagate)(
const struct charset_info_st *cs,
const uchar *str,
315 my_wc_t *,
const uchar *,
const uchar *);
316 typedef int (*my_charset_conv_wc_mb)(
const struct charset_info_st *, my_wc_t,
319 char *, size_t,
char *, size_t);
333 const char *e,
size_t pos);
335 const char *b,
const char *e,
336 size_t nchars,
int *error);
343 my_charset_conv_mb_wc mb_wc;
344 my_charset_conv_wc_mb wc_mb;
348 const uchar *s,
const uchar *e);
354 my_charset_conv_case caseup;
355 my_charset_conv_case casedn;
360 ...) ATTRIBUTE_FORMAT_FPTR(printf, 4, 5);
362 int radix,
long int val);
364 size_t n,
int radix, longlong val);
371 size_t l,
int base,
char **e,
int *err);
373 size_t l,
int base,
char **e,
int *err);
375 size_t l,
int base,
char **e,
int *err);
377 size_t l,
int base,
char **e,
int *err);
379 size_t l,
char **e,
int *err);
381 const char *nptr,
char **endptr,
int *error);
383 const char *str,
size_t length,
385 char **endptr,
int *error);
387 const char *e,
int sq);
398 #define CHARSET_INFO_DEFINED
410 const char *tailoring;
421 uint strxfrm_multiply;
422 uchar caseup_multiply;
423 uchar casedn_multiply;
426 my_wc_t min_sort_char;
427 my_wc_t max_sort_char;
429 my_bool escape_with_backslash_is_dangerous;
430 uchar levels_for_compare;
431 uchar levels_for_order;
437 #define ILLEGAL_CHARSET_INFO_NUMBER (~0U)
441 extern MYSQL_PLUGIN_IMPORT
CHARSET_INFO my_charset_latin1;
442 extern MYSQL_PLUGIN_IMPORT
CHARSET_INFO my_charset_filename;
467 extern CHARSET_INFO my_charset_ucs2_general_mysql500_ci;
479 extern MYSQL_PLUGIN_IMPORT
CHARSET_INFO my_charset_utf8_general_ci;
483 extern CHARSET_INFO my_charset_utf8_general_mysql500_ci;
487 #define MY_UTF8MB3 "utf8"
488 #define MY_UTF8MB4 "utf8mb4"
493 uchar *dst,
size_t dstlen, uint nweights,
494 const uchar *src,
size_t srclen, uint
flags);
495 size_t my_strnxfrmlen_simple(
const CHARSET_INFO *,
size_t);
496 extern int my_strnncoll_simple(
const CHARSET_INFO *,
const uchar *,
size_t,
497 const uchar *,
size_t, my_bool);
499 extern int my_strnncollsp_simple(
const CHARSET_INFO *,
const uchar *,
size_t,
500 const uchar *,
size_t,
501 my_bool diff_if_only_endspace_difference);
504 const uchar *key,
size_t len,
505 ulong *nr1, ulong *nr2);
507 extern size_t my_lengthsp_8bit(
const CHARSET_INFO *cs,
const char *ptr,
511 const char *b,
size_t b_length,
512 const char *s,
size_t s_length,
517 extern size_t my_caseup_str_8bit(
const CHARSET_INFO *,
char *);
518 extern size_t my_casedn_str_8bit(
const CHARSET_INFO *,
char *);
519 extern size_t my_caseup_8bit(
const CHARSET_INFO *,
char *src,
size_t srclen,
520 char *dst,
size_t dstlen);
521 extern size_t my_casedn_8bit(
const CHARSET_INFO *,
char *src,
size_t srclen,
522 char *dst,
size_t dstlen);
524 extern int my_strcasecmp_8bit(
const CHARSET_INFO * cs,
const char *,
527 int my_mb_wc_8bit(
const CHARSET_INFO *cs,my_wc_t *wc,
const uchar *s,
529 int my_wc_mb_8bit(
const CHARSET_INFO *cs,my_wc_t wc, uchar *s, uchar *e);
531 int my_mb_ctype_8bit(
const CHARSET_INFO *,
int *,
const uchar *,
const uchar *);
532 int my_mb_ctype_mb(
const CHARSET_INFO *,
int *,
const uchar *,
const uchar *);
534 size_t my_scan_8bit(
const CHARSET_INFO *cs,
const char *b,
const char *e,
538 const char *
fmt, ...)
539 ATTRIBUTE_FORMAT(printf, 4, 5);
541 long my_strntol_8bit(const
CHARSET_INFO *, const
char *s,
size_t l,
542 int base,
char **e,
int *err);
543 ulong my_strntoul_8bit(const CHARSET_INFO *, const
char *s,
size_t l,
544 int base,
char **e,
int *err);
545 longlong my_strntoll_8bit(const CHARSET_INFO *, const
char *s,
size_t l,
546 int base,
char **e,
int *err);
547 ulonglong my_strntoull_8bit(const CHARSET_INFO *, const
char *s,
size_t l,
548 int base,
char **e,
int *err);
549 double my_strntod_8bit(const CHARSET_INFO *,
char *s,
size_t l,
char **e,
551 size_t my_long10_to_str_8bit(const CHARSET_INFO *,
char *to,
size_t l,
552 int radix,
long int val);
553 size_t my_longlong10_to_str_8bit(const CHARSET_INFO *,
char *to,
size_t l,
554 int radix, longlong val);
556 longlong my_strtoll10_8bit(const CHARSET_INFO *cs,
557 const
char *nptr,
char **endptr,
int *error);
558 longlong my_strtoll10_ucs2(const CHARSET_INFO *cs,
559 const
char *nptr,
char **endptr,
int *error);
561 ulonglong my_strntoull10rnd_8bit(const CHARSET_INFO *cs,
562 const
char *str,
size_t length,
int
563 unsigned_fl,
char **endptr,
int *error);
564 ulonglong my_strntoull10rnd_ucs2(const CHARSET_INFO *cs,
565 const
char *str,
size_t length,
566 int unsigned_fl,
char **endptr,
int *error);
568 void my_fill_8bit(const CHARSET_INFO *cs,
char* to,
size_t l,
int fill);
571 my_bool my_like_range_simple(const CHARSET_INFO *cs,
572 const
char *ptr,
size_t ptr_length,
573 pbool escape, pbool w_one, pbool w_many,
575 char *min_str,
char *max_str,
576 size_t *min_length,
size_t *max_length);
579 my_bool my_like_range_mb(const CHARSET_INFO *cs,
580 const
char *ptr,
size_t ptr_length,
581 pbool escape, pbool w_one, pbool w_many,
583 char *min_str,
char *max_str,
584 size_t *min_length,
size_t *max_length);
587 my_bool my_like_range_generic(const CHARSET_INFO *cs,
588 const
char *ptr,
size_t ptr_length,
589 pbool escape, pbool w_one, pbool w_many,
591 char *min_str,
char *max_str,
592 size_t *min_length,
size_t *max_length);
594 int my_wildcmp_8bit(const CHARSET_INFO *,
595 const
char *str,const
char *str_end,
596 const
char *wildstr,const
char *wildend,
597 int escape,
int w_one,
int w_many);
599 int my_wildcmp_bin(const CHARSET_INFO *,
600 const
char *str,const
char *str_end,
601 const
char *wildstr,const
char *wildend,
602 int escape,
int w_one,
int w_many);
604 size_t my_numchars_8bit(const CHARSET_INFO *, const
char *b, const
char *e);
605 size_t my_numcells_8bit(const CHARSET_INFO *, const
char *b, const
char *e);
606 size_t my_charpos_8bit(const CHARSET_INFO *, const
char *b, const
char *e,
608 size_t my_well_formed_len_8bit(const CHARSET_INFO *, const
char *b,
609 const
char *e,
size_t pos,
int *error);
610 uint my_mbcharlen_8bit(const CHARSET_INFO *, uint c);
614 extern
size_t my_caseup_str_mb(const CHARSET_INFO *,
char *);
615 extern
size_t my_casedn_str_mb(const CHARSET_INFO *,
char *);
616 extern
size_t my_caseup_mb(const CHARSET_INFO *,
char *src,
size_t srclen,
617 char *dst,
size_t dstlen);
618 extern
size_t my_casedn_mb(const CHARSET_INFO *,
char *src,
size_t srclen,
619 char *dst,
size_t dstlen);
620 extern
size_t my_caseup_mb_varlen(const CHARSET_INFO *,
char *src,
621 size_t srclen,
char *dst,
size_t dstlen);
622 extern
size_t my_casedn_mb_varlen(const CHARSET_INFO *,
char *src,
623 size_t srclen,
char *dst,
size_t dstlen);
624 extern
size_t my_caseup_ujis(const CHARSET_INFO *,
char *src,
size_t srclen,
625 char *dst,
size_t dstlen);
626 extern
size_t my_casedn_ujis(const CHARSET_INFO *,
char *src,
size_t srclen,
627 char *dst,
size_t dstlen);
628 extern
int my_strcasecmp_mb(const CHARSET_INFO * cs,const
char *,
631 int my_wildcmp_mb(const CHARSET_INFO *,
632 const
char *str,const
char *str_end,
633 const
char *wildstr,const
char *wildend,
634 int escape,
int w_one,
int w_many);
635 size_t my_numchars_mb(const CHARSET_INFO *, const
char *b, const
char *e);
636 size_t my_numcells_mb(const CHARSET_INFO *, const
char *b, const
char *e);
637 size_t my_charpos_mb(const CHARSET_INFO *, const
char *b, const
char *e,
639 size_t my_well_formed_len_mb(const CHARSET_INFO *, const
char *b,
640 const
char *e,
size_t pos,
int *error);
642 const
char *b,
size_t b_length,
643 const
char *s,
size_t s_length,
646 int my_strnncoll_mb_bin(const CHARSET_INFO * cs,
647 const uchar *s,
size_t slen,
648 const uchar *t,
size_t tlen,
649 my_bool t_is_prefix);
651 int my_strnncollsp_mb_bin(const CHARSET_INFO *cs,
652 const uchar *a,
size_t a_length,
653 const uchar *b,
size_t b_length,
654 my_bool diff_if_only_endspace_difference);
656 int my_wildcmp_mb_bin(const CHARSET_INFO *cs,
657 const
char *str,const
char *str_end,
658 const
char *wildstr,const
char *wildend,
659 int escape,
int w_one,
int w_many);
661 int my_strcasecmp_mb_bin(const CHARSET_INFO * cs __attribute__((unused)),
662 const
char *s, const
char *t);
664 void my_hash_sort_mb_bin(const CHARSET_INFO *cs __attribute__((unused)),
665 const uchar *key,
size_t len,ulong *nr1, ulong *nr2);
667 size_t my_strnxfrm_mb(const CHARSET_INFO *,
668 uchar *dst,
size_t dstlen, uint nweights,
669 const uchar *src,
size_t srclen, uint
flags);
671 size_t my_strnxfrm_unicode(const CHARSET_INFO *,
672 uchar *dst,
size_t dstlen, uint nweights,
673 const uchar *src,
size_t srclen, uint flags);
675 size_t my_strnxfrm_unicode_full_bin(const CHARSET_INFO *,
676 uchar *dst,
size_t dstlen, uint nweights,
677 const uchar *src,
size_t srclen, uint flags);
678 size_t my_strnxfrmlen_unicode_full_bin(const CHARSET_INFO *,
size_t);
680 int my_wildcmp_unicode(const CHARSET_INFO *cs,
681 const
char *str, const
char *str_end,
682 const
char *wildstr, const
char *wildend,
683 int escape,
int w_one,
int w_many,
687 const
char *
buf,
size_t buflen);
688 extern
char *my_strchr(const CHARSET_INFO *cs, const
char *str,
689 const
char *end, pchar c);
690 extern
size_t my_strcspn(const CHARSET_INFO *cs, const
char *str,
691 const
char *end, const
char *accept);
693 my_bool my_propagate_simple(const CHARSET_INFO *cs, const uchar *str,
695 my_bool my_propagate_complex(const CHARSET_INFO *cs, const uchar *str,
699 uint my_string_repertoire(const CHARSET_INFO *cs, const
char *str, ulong len);
700 my_bool my_charset_is_ascii_based(const CHARSET_INFO *cs);
701 my_bool my_charset_is_8bit_pure_ascii(const CHARSET_INFO *cs);
702 uint my_charset_repertoire(const CHARSET_INFO *cs);
705 uint my_strxfrm_flag_normalize(uint flags, uint nlevels);
706 void my_strxfrm_desc_and_reverse(uchar *str, uchar *strend,
707 uint flags, uint
level);
708 size_t my_strxfrm_pad_desc_and_reverse(const CHARSET_INFO *cs,
709 uchar *str, uchar *frmend, uchar *strend,
710 uint nweights, uint flags, uint level);
712 my_bool my_charset_is_ascii_compatible(const CHARSET_INFO *cs);
714 const
MY_CONTRACTIONS *my_charset_get_contractions(const CHARSET_INFO *cs,
717 extern
size_t my_vsnprintf_ex(const CHARSET_INFO *cs,
char *to,
size_t n,
718 const
char* fmt, va_list ap);
720 uint32 my_convert(
char *to, uint32 to_length, const CHARSET_INFO *to_cs,
721 const
char *from, uint32 from_length,
722 const CHARSET_INFO *from_cs, uint *
errors);
734 #define my_isascii(c) (!((c) & ~0177))
735 #define my_toascii(c) ((c) & 0177)
736 #define my_tocntrl(c) ((c) & 31)
737 #define my_toprint(c) ((c) | 64)
738 #define my_toupper(s,c) (char) ((s)->to_upper[(uchar) (c)])
739 #define my_tolower(s,c) (char) ((s)->to_lower[(uchar) (c)])
740 #define my_isalpha(s, c) (((s)->ctype+1)[(uchar) (c)] & (_MY_U | _MY_L))
741 #define my_isupper(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_U)
742 #define my_islower(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_L)
743 #define my_isdigit(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_NMR)
744 #define my_isxdigit(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_X)
745 #define my_isalnum(s, c) (((s)->ctype+1)[(uchar) (c)] & (_MY_U | _MY_L | _MY_NMR))
746 #define my_isspace(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_SPC)
747 #define my_ispunct(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_PNT)
748 #define my_isprint(s, c) (((s)->ctype+1)[(uchar) (c)] & (_MY_PNT | _MY_U | _MY_L | _MY_NMR | _MY_B))
749 #define my_isgraph(s, c) (((s)->ctype+1)[(uchar) (c)] & (_MY_PNT | _MY_U | _MY_L | _MY_NMR))
750 #define my_iscntrl(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_CTR)
753 #define my_isvar(s,c) (my_isalnum(s,c) || (c) == '_')
754 #define my_isvar_start(s,c) (my_isalpha(s,c) || (c) == '_')
756 #define my_binary_compare(s) ((s)->state & MY_CS_BINSORT)
757 #define use_strnxfrm(s) ((s)->state & MY_CS_STRNXFRM)
758 #define my_strnxfrm(cs, d, dl, s, sl) \
759 ((cs)->coll->strnxfrm((cs), (d), (dl), (dl), (s), (sl), MY_STRXFRM_PAD_WITH_SPACE))
760 #define my_strnncoll(s, a, b, c, d) ((s)->coll->strnncoll((s), (a), (b), (c), (d), 0))
761 #define my_like_range(s, a, b, c, d, e, f, g, h, i, j) \
762 ((s)->coll->like_range((s), (a), (b), (c), (d), (e), (f), (g), (h), (i), (j)))
763 #define my_wildcmp(cs,s,se,w,we,e,o,m) ((cs)->coll->wildcmp((cs),(s),(se),(w),(we),(e),(o),(m)))
764 #define my_strcasecmp(s, a, b) ((s)->coll->strcasecmp((s), (a), (b)))
765 #define my_charpos(cs, b, e, num) (cs)->cset->charpos((cs), (const char*) (b), (const char *)(e), (num))
768 #define use_mb(s) ((s)->cset->ismbchar != NULL)
769 #define my_ismbchar(s, a, b) ((s)->cset->ismbchar((s), (a), (b)))
771 #define my_mbcharlen(s, a) ((s)->cset->mbcharlen((s),(a)))
773 #define my_mbcharlen(s, a) 1
776 #define my_caseup_str(s, a) ((s)->cset->caseup_str((s), (a)))
777 #define my_casedn_str(s, a) ((s)->cset->casedn_str((s), (a)))
778 #define my_strntol(s, a, b, c, d, e) ((s)->cset->strntol((s),(a),(b),(c),(d),(e)))
779 #define my_strntoul(s, a, b, c, d, e) ((s)->cset->strntoul((s),(a),(b),(c),(d),(e)))
780 #define my_strntoll(s, a, b, c, d, e) ((s)->cset->strntoll((s),(a),(b),(c),(d),(e)))
781 #define my_strntoull(s, a, b, c,d, e) ((s)->cset->strntoull((s),(a),(b),(c),(d),(e)))
782 #define my_strntod(s, a, b, c, d) ((s)->cset->strntod((s),(a),(b),(c),(d)))
786 #ifdef MY_CHARSET_TIS620
787 #error The TIS620 charset is broken at the moment. Tell tim to fix it.