55
55
static bool init_state_maps(CHARSET_INFO *cs)
58
unsigned char *state_map;
59
unsigned char *ident_map;
61
if (!(cs->state_map= (unsigned char*) my_once_alloc(256, MYF(MY_WME))))
61
if (!(cs->state_map= (uchar*) my_once_alloc(256, MYF(MY_WME))))
64
if (!(cs->ident_map= (unsigned char*) my_once_alloc(256, MYF(MY_WME))))
64
if (!(cs->ident_map= (uchar*) my_once_alloc(256, MYF(MY_WME))))
67
67
state_map= cs->state_map;
71
71
for (i=0; i < 256 ; i++)
73
73
if (my_isalpha(cs,i))
74
state_map[i]=(unsigned char) MY_LEX_IDENT;
74
state_map[i]=(uchar) MY_LEX_IDENT;
75
75
else if (my_isdigit(cs,i))
76
state_map[i]=(unsigned char) MY_LEX_NUMBER_IDENT;
76
state_map[i]=(uchar) MY_LEX_NUMBER_IDENT;
77
77
#if defined(USE_MB) && defined(USE_MB_IDENT)
78
78
else if (my_mbcharlen(cs, i)>1)
79
state_map[i]=(unsigned char) MY_LEX_IDENT;
79
state_map[i]=(uchar) MY_LEX_IDENT;
81
81
else if (my_isspace(cs,i))
82
state_map[i]=(unsigned char) MY_LEX_SKIP;
82
state_map[i]=(uchar) MY_LEX_SKIP;
84
state_map[i]=(unsigned char) MY_LEX_CHAR;
84
state_map[i]=(uchar) MY_LEX_CHAR;
86
state_map[(unsigned char)'_']=state_map[(unsigned char)'$']=(unsigned char) MY_LEX_IDENT;
87
state_map[(unsigned char)'\'']=(unsigned char) MY_LEX_STRING;
88
state_map[(unsigned char)'.']=(unsigned char) MY_LEX_REAL_OR_POINT;
89
state_map[(unsigned char)'>']=state_map[(unsigned char)'=']=state_map[(unsigned char)'!']= (unsigned char) MY_LEX_CMP_OP;
90
state_map[(unsigned char)'<']= (unsigned char) MY_LEX_LONG_CMP_OP;
91
state_map[(unsigned char)'&']=state_map[(unsigned char)'|']=(unsigned char) MY_LEX_BOOL;
92
state_map[(unsigned char)'#']=(unsigned char) MY_LEX_COMMENT;
93
state_map[(unsigned char)';']=(unsigned char) MY_LEX_SEMICOLON;
94
state_map[(unsigned char)':']=(unsigned char) MY_LEX_SET_VAR;
95
state_map[0]=(unsigned char) MY_LEX_EOL;
96
state_map[(unsigned char)'\\']= (unsigned char) MY_LEX_ESCAPE;
97
state_map[(unsigned char)'/']= (unsigned char) MY_LEX_LONG_COMMENT;
98
state_map[(unsigned char)'*']= (unsigned char) MY_LEX_END_LONG_COMMENT;
99
state_map[(unsigned char)'@']= (unsigned char) MY_LEX_USER_END;
100
state_map[(unsigned char) '`']= (unsigned char) MY_LEX_USER_VARIABLE_DELIMITER;
101
state_map[(unsigned char)'"']= (unsigned char) MY_LEX_STRING_OR_DELIMITER;
86
state_map[(uchar)'_']=state_map[(uchar)'$']=(uchar) MY_LEX_IDENT;
87
state_map[(uchar)'\'']=(uchar) MY_LEX_STRING;
88
state_map[(uchar)'.']=(uchar) MY_LEX_REAL_OR_POINT;
89
state_map[(uchar)'>']=state_map[(uchar)'=']=state_map[(uchar)'!']= (uchar) MY_LEX_CMP_OP;
90
state_map[(uchar)'<']= (uchar) MY_LEX_LONG_CMP_OP;
91
state_map[(uchar)'&']=state_map[(uchar)'|']=(uchar) MY_LEX_BOOL;
92
state_map[(uchar)'#']=(uchar) MY_LEX_COMMENT;
93
state_map[(uchar)';']=(uchar) MY_LEX_SEMICOLON;
94
state_map[(uchar)':']=(uchar) MY_LEX_SET_VAR;
95
state_map[0]=(uchar) MY_LEX_EOL;
96
state_map[(uchar)'\\']= (uchar) MY_LEX_ESCAPE;
97
state_map[(uchar)'/']= (uchar) MY_LEX_LONG_COMMENT;
98
state_map[(uchar)'*']= (uchar) MY_LEX_END_LONG_COMMENT;
99
state_map[(uchar)'@']= (uchar) MY_LEX_USER_END;
100
state_map[(uchar) '`']= (uchar) MY_LEX_USER_VARIABLE_DELIMITER;
101
state_map[(uchar)'"']= (uchar) MY_LEX_STRING_OR_DELIMITER;
104
104
Create a second map to make it faster to find identifiers
106
106
for (i=0; i < 256 ; i++)
108
ident_map[i]= (unsigned char) (state_map[i] == MY_LEX_IDENT ||
108
ident_map[i]= (uchar) (state_map[i] == MY_LEX_IDENT ||
109
109
state_map[i] == MY_LEX_NUMBER_IDENT);
112
112
/* Special handling of hex and binary strings */
113
state_map[(unsigned char)'x']= state_map[(unsigned char)'X']= (unsigned char) MY_LEX_IDENT_OR_HEX;
114
state_map[(unsigned char)'b']= state_map[(unsigned char)'B']= (unsigned char) MY_LEX_IDENT_OR_BIN;
113
state_map[(uchar)'x']= state_map[(uchar)'X']= (uchar) MY_LEX_IDENT_OR_HEX;
114
state_map[(uchar)'b']= state_map[(uchar)'B']= (uchar) MY_LEX_IDENT_OR_BIN;
119
#define MY_MAX_ALLOWED_BUF 1024*1024
119
120
#define MY_CHARSET_INDEX "Index.xml"
121
122
const char *charsets_dir= NULL;
134
135
if (test_if_hard_path(sharedir) ||
135
136
is_prefix(sharedir, DEFAULT_CHARSET_HOME))
136
strxmov(buf, sharedir, "/", CHARSET_DIR, NULL);
137
strxmov(buf, sharedir, "/", CHARSET_DIR, NullS);
138
139
strxmov(buf, DEFAULT_CHARSET_HOME, "/", sharedir, "/", CHARSET_DIR,
141
res= convert_dirname(buf,buf,NULL);
142
res= convert_dirname(buf,buf,NullS);
288
289
if (!cs && (flags & MY_WME))
290
291
char index_file[FN_REFLEN + sizeof(MY_CHARSET_INDEX)], cs_string[23];
291
my_stpcpy(get_charsets_dir(index_file),MY_CHARSET_INDEX);
292
stpcpy(get_charsets_dir(index_file),MY_CHARSET_INDEX);
292
293
cs_string[0]='#';
293
294
int10_to_str(cs_number, cs_string+1, 10);
294
295
my_error(EE_UNKNOWN_CHARSET, MYF(ME_BELL), cs_string, index_file);