aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contrib/tsearch2/ts_locale.c21
-rw-r--r--contrib/tsearch2/ts_locale.h4
-rw-r--r--contrib/tsearch2/wordparser/parser.c6
3 files changed, 18 insertions, 13 deletions
diff --git a/contrib/tsearch2/ts_locale.c b/contrib/tsearch2/ts_locale.c
index b84681f1b07..8bb453276bd 100644
--- a/contrib/tsearch2/ts_locale.c
+++ b/contrib/tsearch2/ts_locale.c
@@ -8,23 +8,29 @@
#if defined(TS_USE_WIDE) && defined(WIN32)
size_t
-wchar2char( const char *to, const wchar_t *from, size_t len ) {
+wchar2char( char *to, const wchar_t *from, size_t len ) {
if (GetDatabaseEncoding() == PG_UTF8) {
- int r;
+ int r, nbytes;
if (len==0)
return 0;
+ /* in any case, *to should be allocated with enough space */
+ nbytes = WideCharToMultiByte(CP_UTF8, 0, from, len, NULL, 0, NULL, NULL);
+ if ( nbytes==0 )
+ ereport(ERROR,
+ (errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE),
+ errmsg("UTF-16 to UTF-8 translation failed: %lu",
+ GetLastError())));
+
r = WideCharToMultiByte(CP_UTF8, 0, from, len, to, nbytes,
NULL, NULL);
-
if ( r==0 )
ereport(ERROR,
(errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE),
errmsg("UTF-16 to UTF-8 translation failed: %lu",
GetLastError())));
-
return r;
}
@@ -32,15 +38,14 @@ wchar2char( const char *to, const wchar_t *from, size_t len ) {
}
size_t
-char2wchar( const wchar_t *to, const char *from, size_t len ) {
+char2wchar( wchar_t *to, const char *from, size_t len ) {
if (GetDatabaseEncoding() == PG_UTF8) {
int r;
if (len==0)
return 0;
- r = MultiByteToWideChar(CP_UTF8, 0, from, len,
- to, len);
+ r = MultiByteToWideChar(CP_UTF8, 0, from, len, to, len);
if (!r) {
pg_verifymbstr(from, len, false);
@@ -50,7 +55,7 @@ char2wchar( const wchar_t *to, const char *from, size_t len ) {
errhint("The server's LC_CTYPE locale is probably incompatible with the database encoding.")));
}
- Assert(r <= nbytes);
+ Assert( r <= len );
return r;
}
diff --git a/contrib/tsearch2/ts_locale.h b/contrib/tsearch2/ts_locale.h
index a7ce6f1bbc5..4935e70c6ac 100644
--- a/contrib/tsearch2/ts_locale.h
+++ b/contrib/tsearch2/ts_locale.h
@@ -22,8 +22,8 @@
#ifdef WIN32
-size_t wchar2char( const char *to, const wchar_t *from, size_t len );
-size_t char2wchar( const wchar_t *to, const char *from, size_t len );
+size_t wchar2char( char *to, const wchar_t *from, size_t len );
+size_t char2wchar( wchar_t *to, const char *from, size_t len );
#else /* WIN32 */
diff --git a/contrib/tsearch2/wordparser/parser.c b/contrib/tsearch2/wordparser/parser.c
index d2ed28122ca..565c3c17416 100644
--- a/contrib/tsearch2/wordparser/parser.c
+++ b/contrib/tsearch2/wordparser/parser.c
@@ -79,7 +79,7 @@ TParserClose( TParser* prs ) {
static int \
p_is##type(TParser *prs) { \
Assert( prs->state ); \
- return ( ( prs->usewide ) ? isw##type( (wint_t)*( prs->wstr + prs->state->poschar ) ) : \
+ return ( ( prs->usewide ) ? isw##type( (wint_t)*( prs->wstr + prs->state->poschar ) ) : \
is##type( (unsigned char)*( prs->str + prs->state->posbyte ) ) ); \
} \
\
@@ -104,7 +104,7 @@ p_iseq(TParser *prs, char c) {
static int \
p_is##type(TParser *prs) { \
Assert( prs->state ); \
- return is##type( (unsigned char)*( prs->str + prs->state->posbyte ) ) ); \
+ return is##type( (unsigned char)*( prs->str + prs->state->posbyte ) ); \
} \
\
static int \
@@ -116,7 +116,7 @@ p_isnot##type(TParser *prs) { \
static int
p_iseq(TParser *prs, char c) {
Assert( prs->state );
- return ( *( prs->str + prs->state->posbyte ) == c ) ) ? 1 : 0;
+ return ( *( prs->str + prs->state->posbyte ) == c ) ? 1 : 0;
}
#endif /* TS_USE_WIDE */