Fixes motivated by snake and spoonbill pgbuildfarm members

This commit is contained in:
Teodor Sigaev 2005-11-22 09:01:35 +00:00
parent 725ace44f9
commit 3c6cd8a113
3 changed files with 21 additions and 16 deletions

View File

@ -8,23 +8,29 @@
#if defined(TS_USE_WIDE) && defined(WIN32) #if defined(TS_USE_WIDE) && defined(WIN32)
size_t 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) { if (GetDatabaseEncoding() == PG_UTF8) {
int r; int r, nbytes;
if (len==0) if (len==0)
return 0; return 0;
r = WideCharToMultiByte(CP_UTF8, 0, from, len, to, nbytes, /* in any case, *to should be allocated with enough space */
NULL, NULL); nbytes = WideCharToMultiByte(CP_UTF8, 0, from, len, NULL, 0, NULL, NULL);
if ( nbytes==0 )
if ( r==0 )
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE), (errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE),
errmsg("UTF-16 to UTF-8 translation failed: %lu", errmsg("UTF-16 to UTF-8 translation failed: %lu",
GetLastError()))); 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; return r;
} }
@ -32,15 +38,14 @@ wchar2char( const char *to, const wchar_t *from, size_t len ) {
} }
size_t 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) { if (GetDatabaseEncoding() == PG_UTF8) {
int r; int r;
if (len==0) if (len==0)
return 0; return 0;
r = MultiByteToWideChar(CP_UTF8, 0, from, len, r = MultiByteToWideChar(CP_UTF8, 0, from, len, to, len);
to, len);
if (!r) { if (!r) {
pg_verifymbstr(from, len, false); 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."))); errhint("The server's LC_CTYPE locale is probably incompatible with the database encoding.")));
} }
Assert(r <= nbytes); Assert( r <= len );
return r; return r;
} }

View File

@ -22,8 +22,8 @@
#ifdef WIN32 #ifdef WIN32
size_t wchar2char( const char *to, const wchar_t *from, size_t len ); size_t wchar2char( char *to, const wchar_t *from, size_t len );
size_t char2wchar( const wchar_t *to, const char *from, size_t len ); size_t char2wchar( wchar_t *to, const char *from, size_t len );
#else /* WIN32 */ #else /* WIN32 */

View File

@ -79,7 +79,7 @@ TParserClose( TParser* prs ) {
static int \ static int \
p_is##type(TParser *prs) { \ p_is##type(TParser *prs) { \
Assert( prs->state ); \ 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 ) ) ); \ is##type( (unsigned char)*( prs->str + prs->state->posbyte ) ) ); \
} \ } \
\ \
@ -104,7 +104,7 @@ p_iseq(TParser *prs, char c) {
static int \ static int \
p_is##type(TParser *prs) { \ p_is##type(TParser *prs) { \
Assert( prs->state ); \ 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 \ static int \
@ -116,7 +116,7 @@ p_isnot##type(TParser *prs) { \
static int static int
p_iseq(TParser *prs, char c) { p_iseq(TParser *prs, char c) {
Assert( prs->state ); 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 */ #endif /* TS_USE_WIDE */