m_ctype.h
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:17k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. /*
  14.   A better inplementation of the UNIX ctype(3) library.
  15.   Notes:   my_global.h should be included before ctype.h
  16. */
  17. #ifndef _m_ctype_h
  18. #define _m_ctype_h
  19. #ifdef __cplusplus
  20. extern "C" {
  21. #endif
  22. #define MY_CS_NAME_SIZE 32
  23. #define MY_CS_CTYPE_TABLE_SIZE 257
  24. #define MY_CS_TO_LOWER_TABLE_SIZE 256
  25. #define MY_CS_TO_UPPER_TABLE_SIZE 256
  26. #define MY_CS_SORT_ORDER_TABLE_SIZE 256
  27. #define MY_CS_TO_UNI_TABLE_SIZE 256
  28. #define CHARSET_DIR "charsets/"
  29. #define my_wc_t ulong
  30. typedef struct unicase_info_st
  31. {
  32.   uint16 toupper;
  33.   uint16 tolower;
  34.   uint16 sort;
  35. } MY_UNICASE_INFO;
  36. #define MY_CS_ILSEQ 0
  37. #define MY_CS_ILUNI 0
  38. #define MY_CS_TOOSMALL -1
  39. #define MY_CS_TOOFEW(n) (-1-(n))
  40. #define MY_SEQ_INTTAIL 1
  41. #define MY_SEQ_SPACES 2
  42.         /* My charsets_list flags */
  43. #define MY_CS_COMPILED  1      /* compiled-in sets               */
  44. #define MY_CS_CONFIG    2      /* sets that have a *.conf file   */
  45. #define MY_CS_INDEX     4      /* sets listed in the Index file  */
  46. #define MY_CS_LOADED    8      /* sets that are currently loaded */
  47. #define MY_CS_BINSORT 16     /* if binary sort order           */
  48. #define MY_CS_PRIMARY 32     /* if primary collation           */
  49. #define MY_CS_STRNXFRM 64     /* if strnxfrm is used for sort   */
  50. #define MY_CS_UNICODE 128    /* is a charset is full unicode   */
  51. #define MY_CS_READY 256    /* if a charset is initialized    */
  52. #define MY_CS_AVAILABLE 512    /* If either compiled-in or loaded*/
  53. #define MY_CS_CSSORT 1024   /* if case sensitive sort order   */
  54. #define MY_CHARSET_UNDEFINED 0
  55. typedef struct my_uni_idx_st
  56. {
  57.   uint16 from;
  58.   uint16 to;
  59.   uchar  *tab;
  60. } MY_UNI_IDX;
  61. typedef struct
  62. {
  63.   uint beg;
  64.   uint end;
  65.   uint mblen;
  66. } my_match_t;
  67. enum my_lex_states
  68. {
  69.   MY_LEX_START, MY_LEX_CHAR, MY_LEX_IDENT, 
  70.   MY_LEX_IDENT_SEP, MY_LEX_IDENT_START,
  71.   MY_LEX_REAL, MY_LEX_HEX_NUMBER,
  72.   MY_LEX_CMP_OP, MY_LEX_LONG_CMP_OP, MY_LEX_STRING, MY_LEX_COMMENT, MY_LEX_END,
  73.   MY_LEX_OPERATOR_OR_IDENT, MY_LEX_NUMBER_IDENT, MY_LEX_INT_OR_REAL,
  74.   MY_LEX_REAL_OR_POINT, MY_LEX_BOOL, MY_LEX_EOL, MY_LEX_ESCAPE, 
  75.   MY_LEX_LONG_COMMENT, MY_LEX_END_LONG_COMMENT, MY_LEX_SEMICOLON, 
  76.   MY_LEX_SET_VAR, MY_LEX_USER_END, MY_LEX_HOSTNAME, MY_LEX_SKIP, 
  77.   MY_LEX_USER_VARIABLE_DELIMITER, MY_LEX_SYSTEM_VAR,
  78.   MY_LEX_IDENT_OR_KEYWORD,
  79.   MY_LEX_IDENT_OR_HEX, MY_LEX_IDENT_OR_BIN, MY_LEX_IDENT_OR_NCHAR,
  80.   MY_LEX_STRING_OR_DELIMITER
  81. };
  82. struct charset_info_st;
  83. typedef struct my_collation_handler_st
  84. {
  85.   my_bool (*init)(struct charset_info_st *, void *(*alloc)(uint));
  86.   /* Collation routines */
  87.   int     (*strnncoll)(struct charset_info_st *,
  88.        const uchar *, uint, const uchar *, uint, my_bool);
  89.   int     (*strnncollsp)(struct charset_info_st *,
  90.        const uchar *, uint, const uchar *, uint);
  91.   int     (*strnxfrm)(struct charset_info_st *,
  92.       uchar *, uint, const uchar *, uint);
  93.   my_bool (*like_range)(struct charset_info_st *,
  94. const char *s, uint s_length,
  95. pchar w_prefix, pchar w_one, pchar w_many, 
  96. uint res_length,
  97. char *min_str, char *max_str,
  98. uint *min_len, uint *max_len);
  99.   int     (*wildcmp)(struct charset_info_st *,
  100.         const char *str,const char *str_end,
  101.                      const char *wildstr,const char *wildend,
  102.                      int escape,int w_one, int w_many);
  103.   int  (*strcasecmp)(struct charset_info_st *, const char *, const char *);
  104.   
  105.   uint (*instr)(struct charset_info_st *,
  106.                 const char *b, uint b_length,
  107.                 const char *s, uint s_length,
  108.                 my_match_t *match, uint nmatch);
  109.   
  110.   /* Hash calculation */
  111.   void (*hash_sort)(struct charset_info_st *cs, const uchar *key, uint len,
  112.     ulong *nr1, ulong *nr2); 
  113. } MY_COLLATION_HANDLER;
  114. extern MY_COLLATION_HANDLER my_collation_mb_bin_handler;
  115. extern MY_COLLATION_HANDLER my_collation_8bit_bin_handler;
  116. extern MY_COLLATION_HANDLER my_collation_8bit_simple_ci_handler;
  117. extern MY_COLLATION_HANDLER my_collation_ucs2_uca_handler;
  118. typedef struct my_charset_handler_st
  119. {
  120.   my_bool (*init)(struct charset_info_st *, void *(*alloc)(uint));
  121.   /* Multibyte routines */
  122.   int     (*ismbchar)(struct charset_info_st *, const char *, const char *);
  123.   int     (*mbcharlen)(struct charset_info_st *, uint);
  124.   uint    (*numchars)(struct charset_info_st *, const char *b, const char *e);
  125.   uint    (*charpos)(struct charset_info_st *, const char *b, const char *e, uint pos);
  126.   uint    (*well_formed_len)(struct charset_info_st *,
  127.                              const char *b,const char *e,
  128.                              uint nchars, int *error);
  129.   uint    (*lengthsp)(struct charset_info_st *, const char *ptr, uint length);
  130.   uint    (*numcells)(struct charset_info_st *, const char *b, const char *e);
  131.   
  132.   /* Unicode convertion */
  133.   int (*mb_wc)(struct charset_info_st *cs,my_wc_t *wc,
  134.        const unsigned char *s,const unsigned char *e);
  135.   int (*wc_mb)(struct charset_info_st *cs,my_wc_t wc,
  136.        unsigned char *s,unsigned char *e);
  137.   
  138.   /* Functions for case and sort convertion */
  139.   void    (*caseup_str)(struct charset_info_st *, char *);
  140.   void    (*casedn_str)(struct charset_info_st *, char *);
  141.   void    (*caseup)(struct charset_info_st *, char *, uint);
  142.   void    (*casedn)(struct charset_info_st *, char *, uint);
  143.   
  144.   /* Charset dependant snprintf() */
  145.   int  (*snprintf)(struct charset_info_st *, char *to, uint n, const char *fmt,
  146.    ...);
  147.   int  (*long10_to_str)(struct charset_info_st *, char *to, uint n, int radix,
  148. long int val);
  149.   int (*longlong10_to_str)(struct charset_info_st *, char *to, uint n,
  150.    int radix, longlong val);
  151.   
  152.   void (*fill)(struct charset_info_st *, char *to, uint len, int fill);
  153.   
  154.   /* String-to-number convertion routines */
  155.   long        (*strntol)(struct charset_info_st *, const char *s, uint l,
  156.  int base, char **e, int *err);
  157.   ulong      (*strntoul)(struct charset_info_st *, const char *s, uint l,
  158.  int base, char **e, int *err);
  159.   longlong   (*strntoll)(struct charset_info_st *, const char *s, uint l,
  160.  int base, char **e, int *err);
  161.   ulonglong (*strntoull)(struct charset_info_st *, const char *s, uint l,
  162.  int base, char **e, int *err);
  163.   double      (*strntod)(struct charset_info_st *, char *s, uint l, char **e,
  164.  int *err);
  165.   longlong (*my_strtoll10)(struct charset_info_st *cs,
  166.                            const char *nptr, char **endptr, int *error);
  167.   ulong        (*scan)(struct charset_info_st *, const char *b, const char *e,
  168.        int sq);
  169. } MY_CHARSET_HANDLER;
  170. extern MY_CHARSET_HANDLER my_charset_8bit_handler;
  171. extern MY_CHARSET_HANDLER my_charset_ucs2_handler;
  172. typedef struct charset_info_st
  173. {
  174.   uint      number;
  175.   uint      primary_number;
  176.   uint      binary_number;
  177.   uint      state;
  178.   const char *csname;
  179.   const char *name;
  180.   const char *comment;
  181.   const char *tailoring;
  182.   uchar    *ctype;
  183.   uchar    *to_lower;
  184.   uchar    *to_upper;
  185.   uchar    *sort_order;
  186.   uint16   *contractions;
  187.   uint16   **sort_order_big;
  188.   uint16      *tab_to_uni;
  189.   MY_UNI_IDX  *tab_from_uni;
  190.   uchar     *state_map;
  191.   uchar     *ident_map;
  192.   uint      strxfrm_multiply;
  193.   uint      mbminlen;
  194.   uint      mbmaxlen;
  195.   uint16    min_sort_char;
  196.   uint16    max_sort_char; /* For LIKE optimization */
  197.   my_bool   escape_with_backslash_is_dangerous;
  198.   
  199.   MY_CHARSET_HANDLER *cset;
  200.   MY_COLLATION_HANDLER *coll;
  201.   
  202. } CHARSET_INFO;
  203. extern CHARSET_INFO my_charset_bin;
  204. extern CHARSET_INFO my_charset_big5_chinese_ci;
  205. extern CHARSET_INFO my_charset_big5_bin;
  206. extern CHARSET_INFO my_charset_cp932_japanese_ci;
  207. extern CHARSET_INFO my_charset_cp932_bin;
  208. extern CHARSET_INFO my_charset_euckr_korean_ci;
  209. extern CHARSET_INFO my_charset_euckr_bin;
  210. extern CHARSET_INFO my_charset_gb2312_chinese_ci;
  211. extern CHARSET_INFO my_charset_gb2312_bin;
  212. extern CHARSET_INFO my_charset_gbk_chinese_ci;
  213. extern CHARSET_INFO my_charset_gbk_bin;
  214. extern CHARSET_INFO my_charset_latin1;
  215. extern CHARSET_INFO my_charset_latin1_german2_ci;
  216. extern CHARSET_INFO my_charset_latin1_bin;
  217. extern CHARSET_INFO my_charset_latin2_czech_ci;
  218. extern CHARSET_INFO my_charset_sjis_japanese_ci;
  219. extern CHARSET_INFO my_charset_sjis_bin;
  220. extern CHARSET_INFO my_charset_tis620_thai_ci;
  221. extern CHARSET_INFO my_charset_tis620_bin;
  222. extern CHARSET_INFO my_charset_ucs2_general_ci;
  223. extern CHARSET_INFO my_charset_ucs2_bin;
  224. extern CHARSET_INFO my_charset_ucs2_general_uca;
  225. extern CHARSET_INFO my_charset_ujis_japanese_ci;
  226. extern CHARSET_INFO my_charset_ujis_bin;
  227. extern CHARSET_INFO my_charset_utf8_general_ci;
  228. extern CHARSET_INFO my_charset_utf8_bin;
  229. extern CHARSET_INFO my_charset_cp1250_czech_ci;
  230. /* declarations for simple charsets */
  231. extern int  my_strnxfrm_simple(CHARSET_INFO *, uchar *, uint, const uchar *,
  232.        uint); 
  233. extern int  my_strnncoll_simple(CHARSET_INFO *, const uchar *, uint,
  234. const uchar *, uint, my_bool);
  235. extern int  my_strnncollsp_simple(CHARSET_INFO *, const uchar *, uint,
  236. const uchar *, uint);
  237. extern void my_hash_sort_simple(CHARSET_INFO *cs,
  238. const uchar *key, uint len,
  239. ulong *nr1, ulong *nr2); 
  240. extern uint my_lengthsp_8bit(CHARSET_INFO *cs, const char *ptr, uint length);
  241. extern uint my_instr_simple(struct charset_info_st *,
  242.                             const char *b, uint b_length,
  243.                             const char *s, uint s_length,
  244.                             my_match_t *match, uint nmatch);
  245. /* Functions for 8bit */
  246. extern void my_caseup_str_8bit(CHARSET_INFO *, char *);
  247. extern void my_casedn_str_8bit(CHARSET_INFO *, char *);
  248. extern void my_caseup_8bit(CHARSET_INFO *, char *, uint);
  249. extern void my_casedn_8bit(CHARSET_INFO *, char *, uint);
  250. extern int my_strcasecmp_8bit(CHARSET_INFO * cs, const char *, const char *);
  251. int my_mb_wc_8bit(CHARSET_INFO *cs,my_wc_t *wc, const uchar *s,const uchar *e);
  252. int my_wc_mb_8bit(CHARSET_INFO *cs,my_wc_t wc, uchar *s, uchar *e);
  253. ulong my_scan_8bit(CHARSET_INFO *cs, const char *b, const char *e, int sq);
  254. int my_snprintf_8bit(struct charset_info_st *, char *to, uint n,
  255.      const char *fmt, ...);
  256. long        my_strntol_8bit(CHARSET_INFO *, const char *s, uint l, int base,
  257.     char **e, int *err);
  258. ulong      my_strntoul_8bit(CHARSET_INFO *, const char *s, uint l, int base,
  259.     char **e, int *err);
  260. longlong   my_strntoll_8bit(CHARSET_INFO *, const char *s, uint l, int base,
  261.     char **e, int *err);
  262. ulonglong my_strntoull_8bit(CHARSET_INFO *, const char *s, uint l, int base,
  263.     char **e, int *err);
  264. double      my_strntod_8bit(CHARSET_INFO *, char *s, uint l,char **e,
  265.     int *err);
  266. int  my_long10_to_str_8bit(CHARSET_INFO *, char *to, uint l, int radix,
  267.    long int val);
  268. int my_longlong10_to_str_8bit(CHARSET_INFO *, char *to, uint l, int radix,
  269.       longlong val);
  270. longlong my_strtoll10_8bit(CHARSET_INFO *cs,
  271.                            const char *nptr, char **endptr, int *error);
  272. longlong my_strtoll10_ucs2(CHARSET_INFO *cs, 
  273.                            const char *nptr, char **endptr, int *error);
  274. void my_fill_8bit(CHARSET_INFO *cs, char* to, uint l, int fill);
  275. my_bool  my_like_range_simple(CHARSET_INFO *cs,
  276.       const char *ptr, uint ptr_length,
  277.       pbool escape, pbool w_one, pbool w_many,
  278.       uint res_length,
  279.       char *min_str, char *max_str,
  280.       uint *min_length, uint *max_length);
  281. my_bool  my_like_range_mb(CHARSET_INFO *cs,
  282.   const char *ptr, uint ptr_length,
  283.   pbool escape, pbool w_one, pbool w_many,
  284.   uint res_length,
  285.   char *min_str, char *max_str,
  286.   uint *min_length, uint *max_length);
  287. my_bool  my_like_range_ucs2(CHARSET_INFO *cs,
  288.     const char *ptr, uint ptr_length,
  289.     pbool escape, pbool w_one, pbool w_many,
  290.     uint res_length,
  291.     char *min_str, char *max_str,
  292.     uint *min_length, uint *max_length);
  293. int my_wildcmp_8bit(CHARSET_INFO *,
  294.     const char *str,const char *str_end,
  295.     const char *wildstr,const char *wildend,
  296.     int escape, int w_one, int w_many);
  297. uint my_numchars_8bit(CHARSET_INFO *, const char *b, const char *e);
  298. uint my_numcells_8bit(CHARSET_INFO *, const char *b, const char *e);
  299. uint my_charpos_8bit(CHARSET_INFO *, const char *b, const char *e, uint pos);
  300. uint my_well_formed_len_8bit(CHARSET_INFO *, const char *b, const char *e,
  301.                              uint pos, int *error);
  302. int my_mbcharlen_8bit(CHARSET_INFO *, uint c);
  303. /* Functions for multibyte charsets */
  304. extern void my_caseup_str_mb(CHARSET_INFO *, char *);
  305. extern void my_casedn_str_mb(CHARSET_INFO *, char *);
  306. extern void my_caseup_mb(CHARSET_INFO *, char *, uint);
  307. extern void my_casedn_mb(CHARSET_INFO *, char *, uint);
  308. extern int my_strcasecmp_mb(CHARSET_INFO * cs,const char *, const char *);
  309. int my_wildcmp_mb(CHARSET_INFO *,
  310.   const char *str,const char *str_end,
  311.   const char *wildstr,const char *wildend,
  312.   int escape, int w_one, int w_many);
  313. uint my_numchars_mb(CHARSET_INFO *, const char *b, const char *e);
  314. uint my_numcells_mb(CHARSET_INFO *, const char *b, const char *e);
  315. uint my_charpos_mb(CHARSET_INFO *, const char *b, const char *e, uint pos);
  316. uint my_well_formed_len_mb(CHARSET_INFO *, const char *b, const char *e,
  317.                            uint pos, int *error);
  318. uint my_instr_mb(struct charset_info_st *,
  319.                  const char *b, uint b_length,
  320.                  const char *s, uint s_length,
  321.                  my_match_t *match, uint nmatch);
  322. int my_wildcmp_unicode(CHARSET_INFO *cs,
  323.                        const char *str, const char *str_end,
  324.                        const char *wildstr, const char *wildend,
  325.                        int escape, int w_one, int w_many,
  326.                        MY_UNICASE_INFO **weights);
  327. extern my_bool my_parse_charset_xml(const char *bug, uint len,
  328.     int (*add)(CHARSET_INFO *cs));
  329. #define _MY_U 01 /* Upper case */
  330. #define _MY_L 02 /* Lower case */
  331. #define _MY_NMR 04 /* Numeral (digit) */
  332. #define _MY_SPC 010 /* Spacing character */
  333. #define _MY_PNT 020 /* Punctuation */
  334. #define _MY_CTR 040 /* Control character */
  335. #define _MY_B 0100 /* Blank */
  336. #define _MY_X 0200 /* heXadecimal digit */
  337. #define my_isascii(c) (!((c) & ~0177))
  338. #define my_toascii(c) ((c) & 0177)
  339. #define my_tocntrl(c) ((c) & 31)
  340. #define my_toprint(c) ((c) | 64)
  341. #define my_toupper(s,c) (char) ((s)->to_upper[(uchar) (c)])
  342. #define my_tolower(s,c) (char) ((s)->to_lower[(uchar) (c)])
  343. #define my_isalpha(s, c)  (((s)->ctype+1)[(uchar) (c)] & (_MY_U | _MY_L))
  344. #define my_isupper(s, c)  (((s)->ctype+1)[(uchar) (c)] & _MY_U)
  345. #define my_islower(s, c)  (((s)->ctype+1)[(uchar) (c)] & _MY_L)
  346. #define my_isdigit(s, c)  (((s)->ctype+1)[(uchar) (c)] & _MY_NMR)
  347. #define my_isxdigit(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_X)
  348. #define my_isalnum(s, c)  (((s)->ctype+1)[(uchar) (c)] & (_MY_U | _MY_L | _MY_NMR))
  349. #define my_isspace(s, c)  (((s)->ctype+1)[(uchar) (c)] & _MY_SPC)
  350. #define my_ispunct(s, c)  (((s)->ctype+1)[(uchar) (c)] & _MY_PNT)
  351. #define my_isprint(s, c)  (((s)->ctype+1)[(uchar) (c)] & (_MY_PNT | _MY_U | _MY_L | _MY_NMR | _MY_B))
  352. #define my_isgraph(s, c)  (((s)->ctype+1)[(uchar) (c)] & (_MY_PNT | _MY_U | _MY_L | _MY_NMR))
  353. #define my_iscntrl(s, c)  (((s)->ctype+1)[(uchar) (c)] & _MY_CTR)
  354. /* Some macros that should be cleaned up a little */
  355. #define my_isvar(s,c)                 (my_isalnum(s,c) || (c) == '_')
  356. #define my_isvar_start(s,c)           (my_isalpha(s,c) || (c) == '_')
  357. #define my_binary_compare(s)       ((s)->state  & MY_CS_BINSORT)
  358. #define use_strnxfrm(s)               ((s)->state  & MY_CS_STRNXFRM)
  359. #define my_strnxfrm(s, a, b, c, d)    ((s)->coll->strnxfrm((s), (a), (b), (c), (d)))
  360. #define my_strnncoll(s, a, b, c, d) ((s)->coll->strnncoll((s), (a), (b), (c), (d), 0))
  361. #define my_like_range(s, a, b, c, d, e, f, g, h, i, j) 
  362.    ((s)->coll->like_range((s), (a), (b), (c), (d), (e), (f), (g), (h), (i), (j)))
  363. #define my_wildcmp(cs,s,se,w,we,e,o,m) ((cs)->coll->wildcmp((cs),(s),(se),(w),(we),(e),(o),(m)))
  364. #define my_strcasecmp(s, a, b)        ((s)->coll->strcasecmp((s), (a), (b)))
  365. #define my_charpos(cs, b, e, num)     (cs)->cset->charpos((cs), (const char*) (b), (const char *)(e), (num))
  366. #define use_mb(s)                     ((s)->cset->ismbchar != NULL)
  367. #define my_ismbchar(s, a, b)          ((s)->cset->ismbchar((s), (a), (b)))
  368. #ifdef USE_MB
  369. #define my_mbcharlen(s, a)            ((s)->cset->mbcharlen((s),(a)))
  370. #else
  371. #define my_mbcharlen(s, a)            1
  372. #endif
  373. #define my_caseup(s, a, l)            ((s)->cset->caseup((s), (a), (l)))
  374. #define my_casedn(s, a, l)            ((s)->cset->casedn((s), (a), (l)))
  375. #define my_caseup_str(s, a)           ((s)->cset->caseup_str((s), (a)))
  376. #define my_casedn_str(s, a)           ((s)->cset->casedn_str((s), (a)))
  377. #define my_strntol(s, a, b, c, d, e)  ((s)->cset->strntol((s),(a),(b),(c),(d),(e)))
  378. #define my_strntoul(s, a, b, c, d, e) ((s)->cset->strntoul((s),(a),(b),(c),(d),(e)))
  379. #define my_strntoll(s, a, b, c, d, e) ((s)->cset->strntoll((s),(a),(b),(c),(d),(e)))
  380. #define my_strntoull(s, a, b, c,d, e) ((s)->cset->strntoull((s),(a),(b),(c),(d),(e)))
  381. #define my_strntod(s, a, b, c, d)     ((s)->cset->strntod((s),(a),(b),(c),(d)))
  382. /* XXX: still need to take care of this one */
  383. #ifdef MY_CHARSET_TIS620
  384. #error The TIS620 charset is broken at the moment.  Tell tim to fix it.
  385. #define USE_TIS620
  386. #include "t_ctype.h"
  387. #endif
  388. #ifdef __cplusplus
  389. }
  390. #endif
  391. #endif /* _m_ctype_h */