mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 00:03:57 -04:00 
			
		
		
		
	Fixes motivated by snake and spoonbill pgbuildfarm members
This commit is contained in:
		
							parent
							
								
									725ace44f9
								
							
						
					
					
						commit
						3c6cd8a113
					
				| @ -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; | ||||||
| 
 | 
 | ||||||
|  | 		/* 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, | 		r = WideCharToMultiByte(CP_UTF8, 0, from, len, to, nbytes, | ||||||
| 				NULL, NULL); | 				NULL, NULL); | ||||||
| 
 | 
 | ||||||
| 		 |  | ||||||
| 		if ( r==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()))); | ||||||
| 
 |  | ||||||
| 		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; | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -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 */ | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -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 */ | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user