436a2956d8
comment line where output as too long, and update typedefs for /lib directory. Also fix case where identifiers were used as variable names in the backend, but as typedefs in ecpg (favor the backend for indenting). Backpatch to 8.1.X.
73 lines
1.5 KiB
C
73 lines
1.5 KiB
C
#include "ts_locale.h"
|
|
|
|
#include "utils/builtins.h"
|
|
#include "utils/pg_locale.h"
|
|
#include "mb/pg_wchar.h"
|
|
|
|
|
|
#if defined(TS_USE_WIDE) && defined(WIN32)
|
|
|
|
size_t
|
|
wchar2char(char *to, const wchar_t *from, size_t len)
|
|
{
|
|
if (GetDatabaseEncoding() == PG_UTF8)
|
|
{
|
|
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;
|
|
}
|
|
|
|
return wcstombs(to, from, len);
|
|
}
|
|
|
|
size_t
|
|
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);
|
|
|
|
if (!r)
|
|
{
|
|
pg_verifymbstr(from, len, false);
|
|
ereport(ERROR,
|
|
(errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE),
|
|
errmsg("invalid multibyte character for locale"),
|
|
errhint("The server's LC_CTYPE locale is probably incompatible with the database encoding.")));
|
|
}
|
|
|
|
Assert(r <= len);
|
|
|
|
return r;
|
|
}
|
|
|
|
return mbstowcs(to, from, len);
|
|
}
|
|
|
|
#endif
|