83 lines
1.6 KiB
C
83 lines
1.6 KiB
C
#ifndef PL_PERL_HELPERS_H
|
|
#define PL_PERL_HELPERS_H
|
|
|
|
/*
|
|
* convert from utf8 to database encoding
|
|
*/
|
|
static inline char *
|
|
utf_u2e(const char *utf8_str, size_t len)
|
|
{
|
|
int enc = GetDatabaseEncoding();
|
|
|
|
char *ret = (char *) pg_do_encoding_conversion((unsigned char *) utf8_str, len, PG_UTF8, enc);
|
|
|
|
/*
|
|
* when we are a PG_UTF8 or SQL_ASCII database
|
|
* pg_do_encoding_conversion() will not do any conversion or
|
|
* verification. we need to do it manually instead.
|
|
*/
|
|
if (enc == PG_UTF8 || enc == PG_SQL_ASCII)
|
|
pg_verify_mbstr_len(PG_UTF8, utf8_str, len, false);
|
|
|
|
if (ret == utf8_str)
|
|
ret = pstrdup(ret);
|
|
|
|
return ret;
|
|
}
|
|
|
|
/*
|
|
* convert from database encoding to utf8
|
|
*/
|
|
static inline char *
|
|
utf_e2u(const char *str)
|
|
{
|
|
char *ret = (char *) pg_do_encoding_conversion((unsigned char *) str, strlen(str), GetDatabaseEncoding(), PG_UTF8);
|
|
|
|
if (ret == str)
|
|
ret = pstrdup(ret);
|
|
return ret;
|
|
}
|
|
|
|
|
|
/*
|
|
* Convert an SV to a char * in the current database encoding
|
|
*/
|
|
static inline char *
|
|
sv2cstr(SV *sv)
|
|
{
|
|
char *val;
|
|
STRLEN len;
|
|
|
|
/*
|
|
* get a utf8 encoded char * out of perl. *note* it may not be valid utf8!
|
|
*/
|
|
val = SvPVutf8(sv, len);
|
|
|
|
/*
|
|
* we use perls length in the event we had an embedded null byte to ensure
|
|
* we error out properly
|
|
*/
|
|
return utf_u2e(val, len);
|
|
}
|
|
|
|
/*
|
|
* Create a new SV from a string assumed to be in the current database's
|
|
* encoding.
|
|
*/
|
|
|
|
static inline SV *
|
|
cstr2sv(const char *str)
|
|
{
|
|
SV *sv;
|
|
char *utf8_str = utf_e2u(str);
|
|
|
|
sv = newSVpv(utf8_str, 0);
|
|
SvUTF8_on(sv);
|
|
|
|
pfree(utf8_str);
|
|
|
|
return sv;
|
|
}
|
|
|
|
#endif /* PL_PERL_HELPERS_H */
|