static rc_uint_type wind_MultiByteToWideChar (rc_uint_type cp, const char *mb, unichar *u, rc_uint_type u_len) { rc_uint_type ret = 0; #if defined (_WIN32) || defined (__CYGWIN__) rc_uint_type conv_flags = MB_PRECOMPOSED; /* MB_PRECOMPOSED is not allowed for UTF-7 or UTF-8. MultiByteToWideChar will set the last error to ERROR_INVALID_FLAGS if we do. */ if (cp == CP_UTF8 || cp == CP_UTF7) conv_flags = 0; ret = (rc_uint_type) MultiByteToWideChar (cp, conv_flags, mb, -1, u, u_len); /* Convert to bytes. */ ret *= sizeof (unichar); #elif defined (HAVE_ICONV) int first = 1; char tmp[32]; char *p_tmp; const char *iconv_name = wind_iconv_cp (cp); if (!mb || !iconv_name) return 0; iconv_t cd = iconv_open ("UTF-16LE", iconv_name); while (1) { int iret; const char *n_mb = ""; char *n_tmp = ""; p_tmp = tmp; iret = iconv_onechar (cd, (ICONV_CONST char *) mb, p_tmp, 32, & n_mb, & n_tmp); if (first) { first = 0; continue; } if (!iret) { size_t l_tmp = (size_t) (n_tmp - p_tmp); if (u) { if ((size_t) u_len < l_tmp) break; memcpy (u, tmp, l_tmp); u += l_tmp/2; u_len -= l_tmp; } ret += l_tmp; } else break; if (tmp[0] == 0 && tmp[1] == 0) break; mb = n_mb; } iconv_close (cd); #else if (cp) ret = 0; ret = strlen (mb) + 1; ret *= sizeof (unichar); if (u != NULL && u_len != 0) { do { *u++ = ((unichar) *mb) & 0xff; --u_len; mb++; } while (u_len != 0 && mb[-1] != 0); } if (u != NULL && u_len != 0) *u = 0; #endif return ret; }
static rc_uint_type wind_WideCharToMultiByte (rc_uint_type cp, const unichar *u, char *mb, rc_uint_type mb_len) { rc_uint_type ret = 0; #if defined (_WIN32) || defined (__CYGWIN__) WINBOOL used_def = FALSE; ret = (rc_uint_type) WideCharToMultiByte (cp, 0, u, -1, mb, mb_len, NULL, & used_def); #elif defined (HAVE_ICONV) int first = 1; char tmp[32]; char *p_tmp; const char *iconv_name = wind_iconv_cp (cp); if (!u || !iconv_name) return 0; iconv_t cd = iconv_open (iconv_name, "UTF-16LE"); while (1) { int iret; const char *n_u = ""; char *n_tmp = ""; p_tmp = tmp; iret = iconv_onechar (cd, (ICONV_CONST char *) u, p_tmp, 32, &n_u, & n_tmp); if (first) { first = 0; continue; } if (!iret) { size_t l_tmp = (size_t) (n_tmp - p_tmp); if (mb) { if ((size_t) mb_len < l_tmp) break; memcpy (mb, tmp, l_tmp); mb += l_tmp; mb_len -= l_tmp; } ret += l_tmp; } else break; if (u[0] == 0) break; u = (const unichar *) n_u; } iconv_close (cd); #else if (cp) ret = 0; while (u[ret] != 0) ++ret; ++ret; if (mb) { while (*u != 0 && mb_len != 0) { if (u[0] == (u[0] & 0x7f)) *mb++ = (char) u[0]; else *mb++ = '_'; ++u; --mb_len; } if (mb_len != 0) *mb = 0; } #endif return ret; }
static rc_uint_type wind_MultiByteToWideChar (rc_uint_type cp, const char *mb, unichar *u, rc_uint_type u_len) { rc_uint_type ret = 0; #if defined (_WIN32) || defined (__CYGWIN__) ret = (rc_uint_type) MultiByteToWideChar (cp, MB_PRECOMPOSED, mb, -1, u, u_len); /* Convert to bytes. */ ret *= sizeof (unichar); #elif defined (HAVE_ICONV_H) int first = 1; char tmp[32]; char *p_tmp; const char *iconv_name = wind_iconv_cp (cp); if (!mb || !iconv_name) return 0; iconv_t cd = iconv_open ("UTF-16", iconv_name); while (1) { int iret; const char *n_mb; char *n_tmp; p_tmp = tmp; iret = iconv_onechar (cd, (const char *) mb, p_tmp, 32, & n_mb, & n_tmp); if (first) { first = 0; continue; } if (!iret) { size_t l_tmp = (size_t) (n_tmp - p_tmp); if (u) { if ((size_t) u_len < l_tmp) break; memcpy (u, tmp, l_tmp); u += l_tmp/2; u_len -= l_tmp; } ret += l_tmp; } else break; if (tmp[0] == 0 && tmp[1] == 0) break; mb = n_mb; } iconv_close (cd); #else if (cp) ret = 0; ret = strlen (mb) + 1; ret *= sizeof (unichar); if (u != NULL && u_len != 0) { do { *u++ = ((unichar) *mb) & 0xff; --u_len; mb++; } while (u_len != 0 && mb[-1] != 0); } if (u != NULL && u_len != 0) *u = 0; #endif return ret; }