Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
3523650a
Commit
3523650a
authored
Jan 14, 2003
by
bar@bar.mysql.r18.ru
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Charset loading has been moved to /string library
parent
a5f77c82
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
238 additions
and
236 deletions
+238
-236
include/m_ctype.h
include/m_ctype.h
+9
-1
mysys/charset.c
mysys/charset.c
+6
-235
strings/ctype.c
strings/ctype.c
+223
-0
No files found.
include/m_ctype.h
View file @
3523650a
...
@@ -27,6 +27,13 @@ extern "C" {
...
@@ -27,6 +27,13 @@ extern "C" {
#endif
#endif
#define MY_CS_NAME_SIZE 32
#define MY_CS_CTYPE_TABLE_SIZE 257
#define MY_CS_TO_LOWER_TABLE_SIZE 256
#define MY_CS_TO_UPPER_TABLE_SIZE 256
#define MY_CS_SORT_ORDER_TABLE_SIZE 256
#define MY_CS_TO_UNI_TABLE_SIZE 256
#define CHARSET_DIR "charsets/"
#define CHARSET_DIR "charsets/"
#define my_wc_t ulong
#define my_wc_t ulong
...
@@ -145,7 +152,8 @@ extern CHARSET_INFO *default_charset_info;
...
@@ -145,7 +152,8 @@ extern CHARSET_INFO *default_charset_info;
extern
CHARSET_INFO
*
system_charset_info
;
extern
CHARSET_INFO
*
system_charset_info
;
extern
CHARSET_INFO
*
all_charsets
[
256
];
extern
CHARSET_INFO
*
all_charsets
[
256
];
extern
my_bool
init_compiled_charsets
(
myf
flags
);
extern
my_bool
init_compiled_charsets
(
myf
flags
);
extern
my_bool
my_parse_charset_xml
(
const
char
*
bug
,
uint
len
,
int
(
*
add
)(
CHARSET_INFO
*
cs
));
/* declarations for simple charsets */
/* declarations for simple charsets */
extern
int
my_strnxfrm_simple
(
CHARSET_INFO
*
,
uchar
*
,
uint
,
const
uchar
*
,
uint
);
extern
int
my_strnxfrm_simple
(
CHARSET_INFO
*
,
uchar
*
,
uint
,
const
uchar
*
,
uint
);
...
...
mysys/charset.c
View file @
3523650a
...
@@ -22,217 +22,6 @@
...
@@ -22,217 +22,6 @@
#include <my_xml.h>
#include <my_xml.h>
#define CS_MAX_NM_LEN 32
#define CTYPE_TABLE_SIZE 257
#define TO_LOWER_TABLE_SIZE 256
#define TO_UPPER_TABLE_SIZE 256
#define SORT_ORDER_TABLE_SIZE 256
#define TO_UNI_TABLE_SIZE 256
static
char
*
mstr
(
char
*
str
,
const
char
*
src
,
uint
l1
,
uint
l2
)
{
l1
=
l1
<
l2
?
l1
:
l2
;
memcpy
(
str
,
src
,
l1
);
str
[
l1
]
=
'\0'
;
return
str
;
}
struct
my_cs_file_section_st
{
int
state
;
const
char
*
str
;
};
#define _CS_MISC 1
#define _CS_ID 2
#define _CS_CSNAME 3
#define _CS_FAMILY 4
#define _CS_ORDER 5
#define _CS_COLNAME 6
#define _CS_FLAG 7
#define _CS_CHARSET 8
#define _CS_COLLATION 9
#define _CS_UPPERMAP 10
#define _CS_LOWERMAP 11
#define _CS_UNIMAP 12
#define _CS_COLLMAP 13
#define _CS_CTYPEMAP 14
static
struct
my_cs_file_section_st
sec
[]
=
{
{
_CS_MISC
,
"xml"
},
{
_CS_MISC
,
"xml.version"
},
{
_CS_MISC
,
"xml.encoding"
},
{
_CS_MISC
,
"charsets"
},
{
_CS_MISC
,
"charsets.max-id"
},
{
_CS_MISC
,
"charsets.description"
},
{
_CS_CHARSET
,
"charsets.charset"
},
{
_CS_CSNAME
,
"charsets.charset.name"
},
{
_CS_FAMILY
,
"charsets.charset.family"
},
{
_CS_MISC
,
"charsets.charset.alias"
},
{
_CS_MISC
,
"charsets.charset.ctype"
},
{
_CS_CTYPEMAP
,
"charsets.charset.ctype.map"
},
{
_CS_MISC
,
"charsets.charset.upper"
},
{
_CS_UPPERMAP
,
"charsets.charset.upper.map"
},
{
_CS_MISC
,
"charsets.charset.lower"
},
{
_CS_LOWERMAP
,
"charsets.charset.lower.map"
},
{
_CS_MISC
,
"charsets.charset.unicode"
},
{
_CS_UNIMAP
,
"charsets.charset.unicode.map"
},
{
_CS_COLLATION
,
"charsets.charset.collation"
},
{
_CS_COLNAME
,
"charsets.charset.collation.name"
},
{
_CS_ID
,
"charsets.charset.collation.id"
},
{
_CS_ORDER
,
"charsets.charset.collation.order"
},
{
_CS_FLAG
,
"charsets.charset.collation.flag"
},
{
_CS_COLLMAP
,
"charsets.charset.collation.map"
},
{
0
,
NULL
}
};
static
struct
my_cs_file_section_st
*
cs_file_sec
(
const
char
*
attr
,
uint
len
)
{
struct
my_cs_file_section_st
*
s
;
for
(
s
=
sec
;
s
->
str
;
s
++
)
{
if
(
!
strncmp
(
attr
,
s
->
str
,
len
))
return
s
;
}
return
NULL
;
}
struct
my_cs_file_info
{
char
csname
[
CS_MAX_NM_LEN
];
char
name
[
CS_MAX_NM_LEN
];
uchar
ctype
[
CTYPE_TABLE_SIZE
];
uchar
to_lower
[
TO_LOWER_TABLE_SIZE
];
uchar
to_upper
[
TO_UPPER_TABLE_SIZE
];
uchar
sort_order
[
SORT_ORDER_TABLE_SIZE
];
uint16
tab_to_uni
[
TO_UNI_TABLE_SIZE
];
CHARSET_INFO
cs
;
myf
myflags
;
int
(
*
add_collation
)(
CHARSET_INFO
*
cs
);
};
static
int
fill_uchar
(
uchar
*
a
,
uint
size
,
const
char
*
str
,
uint
len
)
{
uint
i
=
0
;
const
char
*
s
,
*
b
,
*
e
=
str
+
len
;
for
(
s
=
str
;
s
<
e
;
i
++
)
{
for
(
;
(
s
<
e
)
&&
strchr
(
"
\t\r\n
"
,
s
[
0
]);
s
++
)
;
b
=
s
;
for
(
;
(
s
<
e
)
&&
!
strchr
(
"
\t\r\n
"
,
s
[
0
]);
s
++
)
;
if
(
s
==
b
||
i
>
size
)
break
;
a
[
i
]
=
my_strntoul
(
my_charset_latin1
,
b
,
s
-
b
,
NULL
,
16
);
}
return
0
;
}
static
int
fill_uint16
(
uint16
*
a
,
uint
size
,
const
char
*
str
,
uint
len
)
{
uint
i
=
0
;
const
char
*
s
,
*
b
,
*
e
=
str
+
len
;
for
(
s
=
str
;
s
<
e
;
i
++
)
{
for
(
;
(
s
<
e
)
&&
strchr
(
"
\t\r\n
"
,
s
[
0
]);
s
++
)
;
b
=
s
;
for
(
;
(
s
<
e
)
&&
!
strchr
(
"
\t\r\n
"
,
s
[
0
]);
s
++
)
;
if
(
s
==
b
||
i
>
size
)
break
;
a
[
i
]
=
my_strntol
(
my_charset_latin1
,
b
,
s
-
b
,
NULL
,
16
);
}
return
0
;
}
static
int
cs_enter
(
MY_XML_PARSER
*
st
,
const
char
*
attr
,
uint
len
)
{
struct
my_cs_file_info
*
i
=
(
struct
my_cs_file_info
*
)
st
->
user_data
;
struct
my_cs_file_section_st
*
s
=
cs_file_sec
(
attr
,
len
);
if
(
s
&&
(
s
->
state
==
_CS_CHARSET
))
{
bzero
(
&
i
->
cs
,
sizeof
(
i
->
cs
));
}
return
MY_XML_OK
;
}
static
int
cs_leave
(
MY_XML_PARSER
*
st
,
const
char
*
attr
,
uint
len
)
{
struct
my_cs_file_info
*
i
=
(
struct
my_cs_file_info
*
)
st
->
user_data
;
struct
my_cs_file_section_st
*
s
=
cs_file_sec
(
attr
,
len
);
int
state
=
s
?
s
->
state
:
0
;
int
rc
;
switch
(
state
){
case
_CS_COLLATION
:
rc
=
i
->
add_collation
?
i
->
add_collation
(
&
i
->
cs
)
:
MY_XML_OK
;
break
;
default:
rc
=
MY_XML_OK
;
}
return
rc
;
}
static
int
cs_value
(
MY_XML_PARSER
*
st
,
const
char
*
attr
,
uint
len
)
{
struct
my_cs_file_info
*
i
=
(
struct
my_cs_file_info
*
)
st
->
user_data
;
struct
my_cs_file_section_st
*
s
;
int
state
=
(
s
=
cs_file_sec
(
st
->
attr
,
strlen
(
st
->
attr
)))
?
s
->
state
:
0
;
#ifndef DBUG_OFF
if
(
0
){
char
str
[
1024
];
mstr
(
str
,
attr
,
len
,
sizeof
(
str
)
-
1
);
printf
(
"VALUE %d %s='%s'
\n
"
,
state
,
st
->
attr
,
str
);
}
#endif
switch
(
state
)
{
case
_CS_ID
:
i
->
cs
.
number
=
my_strntoul
(
my_charset_latin1
,
attr
,
len
,(
char
**
)
NULL
,
0
);
break
;
case
_CS_COLNAME
:
i
->
cs
.
name
=
mstr
(
i
->
name
,
attr
,
len
,
CS_MAX_NM_LEN
-
1
);
break
;
case
_CS_CSNAME
:
i
->
cs
.
csname
=
mstr
(
i
->
csname
,
attr
,
len
,
CS_MAX_NM_LEN
-
1
);
break
;
case
_CS_FLAG
:
if
(
!
strncmp
(
"primary"
,
attr
,
len
))
i
->
cs
.
state
|=
MY_CS_PRIMARY
;
break
;
case
_CS_UPPERMAP
:
fill_uchar
(
i
->
to_upper
,
TO_UPPER_TABLE_SIZE
,
attr
,
len
);
i
->
cs
.
to_upper
=
i
->
to_upper
;
break
;
case
_CS_LOWERMAP
:
fill_uchar
(
i
->
to_lower
,
TO_LOWER_TABLE_SIZE
,
attr
,
len
);
i
->
cs
.
to_lower
=
i
->
to_lower
;
break
;
case
_CS_UNIMAP
:
fill_uint16
(
i
->
tab_to_uni
,
TO_UNI_TABLE_SIZE
,
attr
,
len
);
i
->
cs
.
tab_to_uni
=
i
->
tab_to_uni
;
break
;
case
_CS_COLLMAP
:
fill_uchar
(
i
->
sort_order
,
SORT_ORDER_TABLE_SIZE
,
attr
,
len
);
i
->
cs
.
sort_order
=
i
->
sort_order
;
break
;
case
_CS_CTYPEMAP
:
fill_uchar
(
i
->
ctype
,
CTYPE_TABLE_SIZE
,
attr
,
len
);
i
->
cs
.
ctype
=
i
->
ctype
;
break
;
}
return
MY_XML_OK
;
}
static
void
set_max_sort_char
(
CHARSET_INFO
*
cs
)
static
void
set_max_sort_char
(
CHARSET_INFO
*
cs
)
{
{
...
@@ -385,23 +174,23 @@ static void simple_cs_copy_data(CHARSET_INFO *to, CHARSET_INFO *from)
...
@@ -385,23 +174,23 @@ static void simple_cs_copy_data(CHARSET_INFO *to, CHARSET_INFO *from)
if
(
from
->
ctype
)
if
(
from
->
ctype
)
to
->
ctype
=
(
uchar
*
)
my_once_memdup
((
char
*
)
from
->
ctype
,
to
->
ctype
=
(
uchar
*
)
my_once_memdup
((
char
*
)
from
->
ctype
,
CTYPE_TABLE_SIZE
,
MYF
(
MY_WME
));
MY_CS_
CTYPE_TABLE_SIZE
,
MYF
(
MY_WME
));
if
(
from
->
to_lower
)
if
(
from
->
to_lower
)
to
->
to_lower
=
(
uchar
*
)
my_once_memdup
((
char
*
)
from
->
to_lower
,
to
->
to_lower
=
(
uchar
*
)
my_once_memdup
((
char
*
)
from
->
to_lower
,
TO_LOWER_TABLE_SIZE
,
MYF
(
MY_WME
));
MY_CS_
TO_LOWER_TABLE_SIZE
,
MYF
(
MY_WME
));
if
(
from
->
to_upper
)
if
(
from
->
to_upper
)
to
->
to_upper
=
(
uchar
*
)
my_once_memdup
((
char
*
)
from
->
to_upper
,
to
->
to_upper
=
(
uchar
*
)
my_once_memdup
((
char
*
)
from
->
to_upper
,
TO_UPPER_TABLE_SIZE
,
MYF
(
MY_WME
));
MY_CS_
TO_UPPER_TABLE_SIZE
,
MYF
(
MY_WME
));
if
(
from
->
sort_order
)
if
(
from
->
sort_order
)
{
{
to
->
sort_order
=
(
uchar
*
)
my_once_memdup
((
char
*
)
from
->
sort_order
,
to
->
sort_order
=
(
uchar
*
)
my_once_memdup
((
char
*
)
from
->
sort_order
,
SORT_ORDER_TABLE_SIZE
,
MY_CS_
SORT_ORDER_TABLE_SIZE
,
MYF
(
MY_WME
));
MYF
(
MY_WME
));
set_max_sort_char
(
to
);
set_max_sort_char
(
to
);
}
}
if
(
from
->
tab_to_uni
)
if
(
from
->
tab_to_uni
)
{
{
uint
sz
=
TO_UNI_TABLE_SIZE
*
sizeof
(
uint16
);
uint
sz
=
MY_CS_
TO_UNI_TABLE_SIZE
*
sizeof
(
uint16
);
to
->
tab_to_uni
=
(
uint16
*
)
my_once_memdup
((
char
*
)
from
->
tab_to_uni
,
sz
,
to
->
tab_to_uni
=
(
uint16
*
)
my_once_memdup
((
char
*
)
from
->
tab_to_uni
,
sz
,
MYF
(
MY_WME
));
MYF
(
MY_WME
));
create_fromuni
(
to
);
create_fromuni
(
to
);
...
@@ -448,24 +237,6 @@ static int add_collation(CHARSET_INFO *cs)
...
@@ -448,24 +237,6 @@ static int add_collation(CHARSET_INFO *cs)
}
}
static
my_bool
my_parse_charset_xml
(
const
char
*
buf
,
uint
len
)
{
MY_XML_PARSER
p
;
struct
my_cs_file_info
i
;
my_bool
rc
;
my_xml_parser_create
(
&
p
);
my_xml_set_enter_handler
(
&
p
,
cs_enter
);
my_xml_set_value_handler
(
&
p
,
cs_value
);
my_xml_set_leave_handler
(
&
p
,
cs_leave
);
i
.
add_collation
=
add_collation
;
my_xml_set_user_data
(
&
p
,(
void
*
)
&
i
);
rc
=
(
my_xml_parse
(
&
p
,
buf
,
len
)
==
MY_XML_OK
)
?
FALSE
:
TRUE
;
my_xml_parser_free
(
&
p
);
return
rc
;
}
#define MAX_BUF 1024*16
#define MAX_BUF 1024*16
#define MY_CHARSET_INDEX "Index.xml"
#define MY_CHARSET_INDEX "Index.xml"
...
@@ -490,7 +261,7 @@ static my_bool my_read_charset_file(const char *filename, myf myflags)
...
@@ -490,7 +261,7 @@ static my_bool my_read_charset_file(const char *filename, myf myflags)
len
=
read
(
fd
,
buf
,
MAX_BUF
);
len
=
read
(
fd
,
buf
,
MAX_BUF
);
my_close
(
fd
,
myflags
);
my_close
(
fd
,
myflags
);
if
(
my_parse_charset_xml
(
buf
,
len
))
if
(
my_parse_charset_xml
(
buf
,
len
,
add_collation
))
{
{
#ifdef NOT_YET
#ifdef NOT_YET
printf
(
"ERROR at line %d pos %d '%s'
\n
"
,
printf
(
"ERROR at line %d pos %d '%s'
\n
"
,
...
...
strings/ctype.c
View file @
3523650a
...
@@ -16,6 +16,7 @@
...
@@ -16,6 +16,7 @@
#include <my_global.h>
#include <my_global.h>
#include <m_ctype.h>
#include <m_ctype.h>
#include <my_xml.h>
#ifndef SCO
#ifndef SCO
#include <m_string.h>
#include <m_string.h>
#endif
#endif
...
@@ -3895,6 +3896,228 @@ static CHARSET_INFO compiled_charsets[] = {
...
@@ -3895,6 +3896,228 @@ static CHARSET_INFO compiled_charsets[] = {
};
};
static
char
*
mstr
(
char
*
str
,
const
char
*
src
,
uint
l1
,
uint
l2
)
{
l1
=
l1
<
l2
?
l1
:
l2
;
memcpy
(
str
,
src
,
l1
);
str
[
l1
]
=
'\0'
;
return
str
;
}
struct
my_cs_file_section_st
{
int
state
;
const
char
*
str
;
};
#define _CS_MISC 1
#define _CS_ID 2
#define _CS_CSNAME 3
#define _CS_FAMILY 4
#define _CS_ORDER 5
#define _CS_COLNAME 6
#define _CS_FLAG 7
#define _CS_CHARSET 8
#define _CS_COLLATION 9
#define _CS_UPPERMAP 10
#define _CS_LOWERMAP 11
#define _CS_UNIMAP 12
#define _CS_COLLMAP 13
#define _CS_CTYPEMAP 14
static
struct
my_cs_file_section_st
sec
[]
=
{
{
_CS_MISC
,
"xml"
},
{
_CS_MISC
,
"xml.version"
},
{
_CS_MISC
,
"xml.encoding"
},
{
_CS_MISC
,
"charsets"
},
{
_CS_MISC
,
"charsets.max-id"
},
{
_CS_MISC
,
"charsets.description"
},
{
_CS_CHARSET
,
"charsets.charset"
},
{
_CS_CSNAME
,
"charsets.charset.name"
},
{
_CS_FAMILY
,
"charsets.charset.family"
},
{
_CS_MISC
,
"charsets.charset.alias"
},
{
_CS_MISC
,
"charsets.charset.ctype"
},
{
_CS_CTYPEMAP
,
"charsets.charset.ctype.map"
},
{
_CS_MISC
,
"charsets.charset.upper"
},
{
_CS_UPPERMAP
,
"charsets.charset.upper.map"
},
{
_CS_MISC
,
"charsets.charset.lower"
},
{
_CS_LOWERMAP
,
"charsets.charset.lower.map"
},
{
_CS_MISC
,
"charsets.charset.unicode"
},
{
_CS_UNIMAP
,
"charsets.charset.unicode.map"
},
{
_CS_COLLATION
,
"charsets.charset.collation"
},
{
_CS_COLNAME
,
"charsets.charset.collation.name"
},
{
_CS_ID
,
"charsets.charset.collation.id"
},
{
_CS_ORDER
,
"charsets.charset.collation.order"
},
{
_CS_FLAG
,
"charsets.charset.collation.flag"
},
{
_CS_COLLMAP
,
"charsets.charset.collation.map"
},
{
0
,
NULL
}
};
static
struct
my_cs_file_section_st
*
cs_file_sec
(
const
char
*
attr
,
uint
len
)
{
struct
my_cs_file_section_st
*
s
;
for
(
s
=
sec
;
s
->
str
;
s
++
)
{
if
(
!
strncmp
(
attr
,
s
->
str
,
len
))
return
s
;
}
return
NULL
;
}
typedef
struct
my_cs_file_info
{
char
csname
[
MY_CS_NAME_SIZE
];
char
name
[
MY_CS_NAME_SIZE
];
uchar
ctype
[
MY_CS_CTYPE_TABLE_SIZE
];
uchar
to_lower
[
MY_CS_TO_LOWER_TABLE_SIZE
];
uchar
to_upper
[
MY_CS_TO_UPPER_TABLE_SIZE
];
uchar
sort_order
[
MY_CS_SORT_ORDER_TABLE_SIZE
];
uint16
tab_to_uni
[
MY_CS_TO_UNI_TABLE_SIZE
];
CHARSET_INFO
cs
;
int
(
*
add_collation
)(
CHARSET_INFO
*
cs
);
}
MY_CHARSET_LOADER
;
static
int
fill_uchar
(
uchar
*
a
,
uint
size
,
const
char
*
str
,
uint
len
)
{
uint
i
=
0
;
const
char
*
s
,
*
b
,
*
e
=
str
+
len
;
for
(
s
=
str
;
s
<
e
;
i
++
)
{
for
(
;
(
s
<
e
)
&&
strchr
(
"
\t\r\n
"
,
s
[
0
]);
s
++
)
;
b
=
s
;
for
(
;
(
s
<
e
)
&&
!
strchr
(
"
\t\r\n
"
,
s
[
0
]);
s
++
)
;
if
(
s
==
b
||
i
>
size
)
break
;
a
[
i
]
=
my_strntoul
(
my_charset_latin1
,
b
,
s
-
b
,
NULL
,
16
);
}
return
0
;
}
static
int
fill_uint16
(
uint16
*
a
,
uint
size
,
const
char
*
str
,
uint
len
)
{
uint
i
=
0
;
const
char
*
s
,
*
b
,
*
e
=
str
+
len
;
for
(
s
=
str
;
s
<
e
;
i
++
)
{
for
(
;
(
s
<
e
)
&&
strchr
(
"
\t\r\n
"
,
s
[
0
]);
s
++
)
;
b
=
s
;
for
(
;
(
s
<
e
)
&&
!
strchr
(
"
\t\r\n
"
,
s
[
0
]);
s
++
)
;
if
(
s
==
b
||
i
>
size
)
break
;
a
[
i
]
=
my_strntol
(
my_charset_latin1
,
b
,
s
-
b
,
NULL
,
16
);
}
return
0
;
}
static
int
cs_enter
(
MY_XML_PARSER
*
st
,
const
char
*
attr
,
uint
len
)
{
struct
my_cs_file_info
*
i
=
(
struct
my_cs_file_info
*
)
st
->
user_data
;
struct
my_cs_file_section_st
*
s
=
cs_file_sec
(
attr
,
len
);
if
(
s
&&
(
s
->
state
==
_CS_CHARSET
))
{
bzero
(
&
i
->
cs
,
sizeof
(
i
->
cs
));
}
return
MY_XML_OK
;
}
static
int
cs_leave
(
MY_XML_PARSER
*
st
,
const
char
*
attr
,
uint
len
)
{
struct
my_cs_file_info
*
i
=
(
struct
my_cs_file_info
*
)
st
->
user_data
;
struct
my_cs_file_section_st
*
s
=
cs_file_sec
(
attr
,
len
);
int
state
=
s
?
s
->
state
:
0
;
int
rc
;
switch
(
state
){
case
_CS_COLLATION
:
rc
=
i
->
add_collation
?
i
->
add_collation
(
&
i
->
cs
)
:
MY_XML_OK
;
break
;
default:
rc
=
MY_XML_OK
;
}
return
rc
;
}
static
int
cs_value
(
MY_XML_PARSER
*
st
,
const
char
*
attr
,
uint
len
)
{
struct
my_cs_file_info
*
i
=
(
struct
my_cs_file_info
*
)
st
->
user_data
;
struct
my_cs_file_section_st
*
s
;
int
state
=
(
s
=
cs_file_sec
(
st
->
attr
,
strlen
(
st
->
attr
)))
?
s
->
state
:
0
;
#ifndef DBUG_OFF
if
(
0
){
char
str
[
1024
];
mstr
(
str
,
attr
,
len
,
sizeof
(
str
)
-
1
);
printf
(
"VALUE %d %s='%s'
\n
"
,
state
,
st
->
attr
,
str
);
}
#endif
switch
(
state
)
{
case
_CS_ID
:
i
->
cs
.
number
=
my_strntoul
(
my_charset_latin1
,
attr
,
len
,(
char
**
)
NULL
,
0
);
break
;
case
_CS_COLNAME
:
i
->
cs
.
name
=
mstr
(
i
->
name
,
attr
,
len
,
MY_CS_NAME_SIZE
-
1
);
break
;
case
_CS_CSNAME
:
i
->
cs
.
csname
=
mstr
(
i
->
csname
,
attr
,
len
,
MY_CS_NAME_SIZE
-
1
);
break
;
case
_CS_FLAG
:
if
(
!
strncmp
(
"primary"
,
attr
,
len
))
i
->
cs
.
state
|=
MY_CS_PRIMARY
;
break
;
case
_CS_UPPERMAP
:
fill_uchar
(
i
->
to_upper
,
MY_CS_TO_UPPER_TABLE_SIZE
,
attr
,
len
);
i
->
cs
.
to_upper
=
i
->
to_upper
;
break
;
case
_CS_LOWERMAP
:
fill_uchar
(
i
->
to_lower
,
MY_CS_TO_LOWER_TABLE_SIZE
,
attr
,
len
);
i
->
cs
.
to_lower
=
i
->
to_lower
;
break
;
case
_CS_UNIMAP
:
fill_uint16
(
i
->
tab_to_uni
,
MY_CS_TO_UNI_TABLE_SIZE
,
attr
,
len
);
i
->
cs
.
tab_to_uni
=
i
->
tab_to_uni
;
break
;
case
_CS_COLLMAP
:
fill_uchar
(
i
->
sort_order
,
MY_CS_SORT_ORDER_TABLE_SIZE
,
attr
,
len
);
i
->
cs
.
sort_order
=
i
->
sort_order
;
break
;
case
_CS_CTYPEMAP
:
fill_uchar
(
i
->
ctype
,
MY_CS_CTYPE_TABLE_SIZE
,
attr
,
len
);
i
->
cs
.
ctype
=
i
->
ctype
;
break
;
}
return
MY_XML_OK
;
}
my_bool
my_parse_charset_xml
(
const
char
*
buf
,
uint
len
,
int
(
*
add_collation
)(
CHARSET_INFO
*
cs
))
{
MY_XML_PARSER
p
;
struct
my_cs_file_info
i
;
my_bool
rc
;
my_xml_parser_create
(
&
p
);
my_xml_set_enter_handler
(
&
p
,
cs_enter
);
my_xml_set_value_handler
(
&
p
,
cs_value
);
my_xml_set_leave_handler
(
&
p
,
cs_leave
);
i
.
add_collation
=
add_collation
;
my_xml_set_user_data
(
&
p
,(
void
*
)
&
i
);
rc
=
(
my_xml_parse
(
&
p
,
buf
,
len
)
==
MY_XML_OK
)
?
FALSE
:
TRUE
;
my_xml_parser_free
(
&
p
);
return
rc
;
}
CHARSET_INFO
*
my_charset_latin1
=
&
compiled_charsets
[
0
];
CHARSET_INFO
*
my_charset_latin1
=
&
compiled_charsets
[
0
];
CHARSET_INFO
*
all_charsets
[
256
];
CHARSET_INFO
*
all_charsets
[
256
];
CHARSET_INFO
*
default_charset_info
=
&
compiled_charsets
[
0
];
CHARSET_INFO
*
default_charset_info
=
&
compiled_charsets
[
0
];
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment