+
+VLC_USED VLC_MALLOC
+static inline char *ToCodePage (unsigned cp, const char *utf8)
+{
+ wchar_t *wide = ToWide (utf8);
+ if (wide == NULL)
+ return NULL;
+
+ size_t len = WideCharToMultiByte (cp, 0, wide, -1, NULL, 0, NULL, NULL);
+ if (len == 0)
+ return NULL;
+
+ char *out = (char *)malloc (len);
+ if (likely(out != NULL))
+ WideCharToMultiByte (cp, 0, wide, -1, out, len, NULL, NULL);
+ free (wide);
+ return out;
+}
+
+VLC_USED VLC_MALLOC
+static inline char *FromCodePage (unsigned cp, const char *mb)
+{
+ int len = MultiByteToWideChar (cp, 0, mb, -1, NULL, 0);
+ if (len == 0)
+ return NULL;
+
+ wchar_t *wide = (wchar_t *)malloc (len * sizeof (wchar_t));
+ if (unlikely(wide == NULL))
+ return NULL;
+ MultiByteToWideChar (cp, 0, mb, -1, wide, len);
+
+ char *utf8 = FromWide (wide);
+ free (wide);
+ return utf8;
+}
+
+VLC_USED VLC_MALLOC
+static inline char *FromANSI (const char *ansi)
+{
+ return FromCodePage (GetACP (), ansi);
+}
+
+VLC_USED VLC_MALLOC
+static inline char *ToANSI (const char *utf8)
+{
+ return ToCodePage (GetACP (), utf8);
+}
+
+# ifdef UNICODE
+# define FromT FromWide
+# define ToT ToWide
+# else
+# define FromT FromANSI
+# define ToT ToANSI
+# endif
+# define FromLocale FromANSI
+# define ToLocale ToANSI
+# define LocaleFree(s) free((char *)(s))
+# define FromLocaleDup FromANSI
+# define ToLocaleDup ToANSI
+
+#elif defined(__OS2__)
+
+VLC_USED static inline char *FromLocale (const char *locale)
+{
+ return locale ? FromCharset ((char *)"", locale, strlen(locale)) : NULL;
+}
+
+VLC_USED static inline char *ToLocale (const char *utf8)
+{
+ size_t outsize;
+ return utf8 ? (char *)ToCharset ("", utf8, &outsize) : NULL;
+}
+
+VLC_USED static inline void LocaleFree (const char *str)
+{
+ free ((char *)str);
+}
+
+VLC_USED static inline char *FromLocaleDup (const char *locale)
+{
+ return FromCharset ("", locale, strlen(locale));
+}
+
+VLC_USED static inline char *ToLocaleDup (const char *utf8)
+{
+ size_t outsize;
+ return (char *)ToCharset ("", utf8, &outsize);
+}
+
+#else
+
+# define FromLocale(l) (l)
+# define ToLocale(u) (u)
+# define LocaleFree(s) ((void)(s))
+# define FromLocaleDup strdup
+# define ToLocaleDup strdup