68
static unsigned char *cs_alloc(size_t size)
70
memory_vector.push_back(new unsigned char[size]);
71
return memory_vector.back();
70
74
static bool init_state_maps(CHARSET_INFO *cs)
73
unsigned char *state_map;
74
unsigned char *ident_map;
76
if (!(cs->state_map= (unsigned char*) cs_alloc(256)))
76
if (!(cs->state_map= cs_alloc(256)))
79
if (!(cs->ident_map= (unsigned char*) cs_alloc(256)))
79
if (!(cs->ident_map= cs_alloc(256)))
82
state_map= cs->state_map;
83
ident_map= cs->ident_map;
82
unsigned char *state_map= cs->state_map;
83
unsigned char *ident_map= cs->ident_map;
85
85
/* Fill state_map with states to get a faster parser */
86
for (i=0; i < 256 ; i++)
86
for (int i= 0; i < 256; i++)
88
88
if (my_isalpha(cs,i))
89
state_map[i]=(unsigned char) MY_LEX_IDENT;
89
state_map[i]= MY_LEX_IDENT;
90
90
else if (my_isdigit(cs,i))
91
state_map[i]=(unsigned char) MY_LEX_NUMBER_IDENT;
91
state_map[i]= MY_LEX_NUMBER_IDENT;
92
92
else if (my_mbcharlen(cs, i)>1)
93
state_map[i]=(unsigned char) MY_LEX_IDENT;
93
state_map[i]= MY_LEX_IDENT;
94
94
else if (my_isspace(cs,i))
95
state_map[i]=(unsigned char) MY_LEX_SKIP;
95
state_map[i]= MY_LEX_SKIP;
97
state_map[i]=(unsigned char) MY_LEX_CHAR;
97
state_map[i]= MY_LEX_CHAR;
99
state_map[(unsigned char)'_']=state_map[(unsigned char)'$']=(unsigned char) MY_LEX_IDENT;
100
state_map[(unsigned char)'\'']=(unsigned char) MY_LEX_STRING;
101
state_map[(unsigned char)'.']=(unsigned char) MY_LEX_REAL_OR_POINT;
102
state_map[(unsigned char)'>']=state_map[(unsigned char)'=']=state_map[(unsigned char)'!']= (unsigned char) MY_LEX_CMP_OP;
103
state_map[(unsigned char)'<']= (unsigned char) MY_LEX_LONG_CMP_OP;
104
state_map[(unsigned char)'&']=state_map[(unsigned char)'|']=(unsigned char) MY_LEX_BOOL;
105
state_map[(unsigned char)'#']=(unsigned char) MY_LEX_COMMENT;
106
state_map[(unsigned char)';']=(unsigned char) MY_LEX_SEMICOLON;
107
state_map[(unsigned char)':']=(unsigned char) MY_LEX_SET_VAR;
108
state_map[0]=(unsigned char) MY_LEX_EOL;
109
state_map[(unsigned char)'\\']= (unsigned char) MY_LEX_ESCAPE;
110
state_map[(unsigned char)'/']= (unsigned char) MY_LEX_LONG_COMMENT;
111
state_map[(unsigned char)'*']= (unsigned char) MY_LEX_END_LONG_COMMENT;
112
state_map[(unsigned char)'@']= (unsigned char) MY_LEX_USER_END;
113
state_map[(unsigned char) '`']= (unsigned char) MY_LEX_USER_VARIABLE_DELIMITER;
114
state_map[(unsigned char)'"']= (unsigned char) MY_LEX_STRING_OR_DELIMITER;
99
state_map['_']=state_map['$']= MY_LEX_IDENT;
100
state_map['\'']= MY_LEX_STRING;
101
state_map['.']= MY_LEX_REAL_OR_POINT;
102
state_map['>']=state_map['=']=state_map['!']= MY_LEX_CMP_OP;
103
state_map['<']= MY_LEX_LONG_CMP_OP;
104
state_map['&']=state_map['|']= MY_LEX_BOOL;
105
state_map['#']= MY_LEX_COMMENT;
106
state_map[';']= MY_LEX_SEMICOLON;
107
state_map[':']= MY_LEX_SET_VAR;
108
state_map[0]= MY_LEX_EOL;
109
state_map['\\']= MY_LEX_ESCAPE;
110
state_map['/']= MY_LEX_LONG_COMMENT;
111
state_map['*']= MY_LEX_END_LONG_COMMENT;
112
state_map['@']= MY_LEX_USER_END;
113
state_map['`']= MY_LEX_USER_VARIABLE_DELIMITER;
114
state_map['"']= MY_LEX_STRING_OR_DELIMITER;
117
117
Create a second map to make it faster to find identifiers
119
for (i=0; i < 256 ; i++)
119
for (int i= 0; i < 256; i++)
121
ident_map[i]= (unsigned char) (state_map[i] == MY_LEX_IDENT ||
122
state_map[i] == MY_LEX_NUMBER_IDENT);
121
ident_map[i]= state_map[i] == MY_LEX_IDENT || state_map[i] == MY_LEX_NUMBER_IDENT;
125
124
/* Special handling of hex and binary strings */
126
state_map[(unsigned char)'x']= state_map[(unsigned char)'X']= (unsigned char) MY_LEX_IDENT_OR_HEX;
127
state_map[(unsigned char)'b']= state_map[(unsigned char)'B']= (unsigned char) MY_LEX_IDENT_OR_BIN;
125
state_map['x']= state_map['X']= MY_LEX_IDENT_OR_HEX;
126
state_map['b']= state_map['B']= MY_LEX_IDENT_OR_BIN;
132
130
static bool charset_initialized= false;
134
132
DRIZZLED_API CHARSET_INFO *all_charsets[256];