OSDN Git Service

Fixes motivated by snake and spoonbill pgbuildfarm members
authorTeodor Sigaev <teodor@sigaev.ru>
Tue, 22 Nov 2005 09:01:35 +0000 (09:01 +0000)
committerTeodor Sigaev <teodor@sigaev.ru>
Tue, 22 Nov 2005 09:01:35 +0000 (09:01 +0000)
contrib/tsearch2/ts_locale.c
contrib/tsearch2/ts_locale.h
contrib/tsearch2/wordparser/parser.c

index b84681f..8bb4532 100644 (file)
@@ -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;
        }
index a7ce6f1..4935e70 100644 (file)
@@ -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 */
 
index d2ed281..565c3c1 100644 (file)
@@ -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 */