88
99#include "dict.h"
1010#include "common.h"
11+ #include "ts_locale.h"
1112
1213#define CS_WAITKEY 0
1314#define CS_INKEY 1
@@ -30,11 +31,11 @@ nstrdup(char *ptr, int len)
3031cptr = ptr = res ;
3132while (* ptr )
3233{
33- if (* ptr == '\\' )
34+ if (t_iseq ( ptr , '\\' ) )
3435ptr ++ ;
35- * cptr = * ptr ;
36- ptr ++ ;
37- cptr ++ ;
36+ COPYCHAR ( cptr , ptr ) ;
37+ cptr += pg_mblen ( ptr ) ;
38+ ptr += pg_mblen ( ptr ) ;
3839}
3940* cptr = '\0' ;
4041
@@ -52,9 +53,9 @@ parse_cfgdict(text *in, Map ** m)
5253
5354while (ptr - VARDATA (in )< VARSIZE (in )- VARHDRSZ )
5455{
55- if (* ptr == ',' )
56+ if (t_iseq ( ptr , ',' ) )
5657num ++ ;
57- ptr ++ ;
58+ ptr += pg_mblen ( ptr ) ;
5859}
5960
6061* m = mptr = (Map * )palloc (sizeof (Map )* (num + 2 ));
@@ -64,93 +65,93 @@ parse_cfgdict(text *in, Map ** m)
6465{
6566if (state == CS_WAITKEY )
6667{
67- if (isalpha (( unsigned char ) * ptr ))
68+ if (t_isalpha ( ptr ))
6869{
6970begin = ptr ;
7071state = CS_INKEY ;
7172}
72- else if (!isspace (( unsigned char ) * ptr ))
73+ else if (!t_isspace ( ptr ))
7374ereport (ERROR ,
7475(errcode (ERRCODE_SYNTAX_ERROR ),
7576errmsg ("syntax error" ),
76- errdetail ("Syntax error in position %d near \"%c\" " ,
77- (int ) (ptr - VARDATA (in )), * ptr )));
77+ errdetail ("Syntax error in position %d" ,
78+ (int ) (ptr - VARDATA (in )))));
7879}
7980else if (state == CS_INKEY )
8081{
81- if (isspace (( unsigned char ) * ptr ))
82+ if (t_isspace ( ptr ))
8283{
8384mptr -> key = nstrdup (begin ,ptr - begin );
8485state = CS_WAITEQ ;
8586}
86- else if (* ptr == '=' )
87+ else if (t_iseq ( ptr , '=' ) )
8788{
8889mptr -> key = nstrdup (begin ,ptr - begin );
8990state = CS_WAITVALUE ;
9091}
91- else if (!isalpha (( unsigned char ) * ptr ))
92+ else if (!t_isalpha ( ptr ))
9293ereport (ERROR ,
9394(errcode (ERRCODE_SYNTAX_ERROR ),
9495errmsg ("syntax error" ),
95- errdetail ("Syntax error in position %d near \"%c\" " ,
96- (int ) (ptr - VARDATA (in )), * ptr )));
96+ errdetail ("Syntax error in position %d" ,
97+ (int ) (ptr - VARDATA (in )))));
9798}
9899else if (state == CS_WAITEQ )
99100{
100- if (* ptr == '=' )
101+ if (t_iseq ( ptr , '=' ) )
101102state = CS_WAITVALUE ;
102- else if (!isspace (( unsigned char ) * ptr ))
103+ else if (!t_isspace ( ptr ))
103104ereport (ERROR ,
104105(errcode (ERRCODE_SYNTAX_ERROR ),
105106errmsg ("syntax error" ),
106- errdetail ("Syntax error in position %d near \"%c\" " ,
107- (int ) (ptr - VARDATA (in )), * ptr )));
107+ errdetail ("Syntax error in position %d" ,
108+ (int ) (ptr - VARDATA (in )))));
108109}
109110else if (state == CS_WAITVALUE )
110111{
111- if (* ptr == '"' )
112+ if (t_iseq ( ptr , '"' ) )
112113{
113114begin = ptr + 1 ;
114115state = CS_INVALUE ;
115116}
116- else if (!isspace (( unsigned char ) * ptr ))
117+ else if (!t_isspace ( ptr ))
117118{
118119begin = ptr ;
119120state = CS_IN2VALUE ;
120121}
121122}
122123else if (state == CS_INVALUE )
123124{
124- if (* ptr == '"' )
125+ if (t_iseq ( ptr , '"' ) )
125126{
126127mptr -> value = nstrdup (begin ,ptr - begin );
127128mptr ++ ;
128129state = CS_WAITDELIM ;
129130}
130- else if (* ptr == '\\' )
131+ else if (t_iseq ( ptr , '\\' ) )
131132state = CS_INESC ;
132133}
133134else if (state == CS_IN2VALUE )
134135{
135- if (isspace (( unsigned char ) * ptr )|| * ptr == ',' )
136+ if (t_isspace ( ptr )|| t_iseq ( ptr , ',' ) )
136137{
137138mptr -> value = nstrdup (begin ,ptr - begin );
138139mptr ++ ;
139- state = (* ptr == ',' ) ?CS_WAITKEY :CS_WAITDELIM ;
140+ state = (t_iseq ( ptr , ',' ) ) ?CS_WAITKEY :CS_WAITDELIM ;
140141}
141- else if (* ptr == '\\' )
142+ else if (t_iseq ( ptr , '\\' ) )
142143state = CS_INESC ;
143144}
144145else if (state == CS_WAITDELIM )
145146{
146- if (* ptr == ',' )
147+ if (t_iseq ( ptr , ',' ) )
147148state = CS_WAITKEY ;
148- else if (!isspace (( unsigned char ) * ptr ))
149+ else if (!t_isspace ( ptr ))
149150ereport (ERROR ,
150151(errcode (ERRCODE_SYNTAX_ERROR ),
151152errmsg ("syntax error" ),
152- errdetail ("Syntax error in position %d near \"%c\" " ,
153- (int ) (ptr - VARDATA (in )), * ptr )));
153+ errdetail ("Syntax error in position %d" ,
154+ (int ) (ptr - VARDATA (in )))));
154155}
155156else if (state == CS_INESC )
156157state = CS_INVALUE ;
@@ -160,9 +161,9 @@ parse_cfgdict(text *in, Map ** m)
160161ereport (ERROR ,
161162(errcode (ERRCODE_SYNTAX_ERROR ),
162163errmsg ("bad parser state" ),
163- errdetail ("%d at position %d near \"%c\" " ,
164- state , (int ) (ptr - VARDATA (in )), * ptr )));
165- ptr ++ ;
164+ errdetail ("%d at position %d" ,
165+ state , (int ) (ptr - VARDATA (in )))));
166+ ptr += pg_mblen ( ptr ) ;
166167}
167168
168169if (state == CS_IN2VALUE )