diff --git a/contrib/tsearch2/ts_locale.c b/contrib/tsearch2/ts_locale.c index b84681f1b0..8bb453276b 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; - r = WideCharToMultiByte(CP_UTF8, 0, from, len, to, nbytes, - NULL, NULL); - - - if ( r==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 a7ce6f1bbc..4935e70c6a 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 d2ed28122c..565c3c1741 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 */