diff -Naur -Naru dvd-vr-0.9.1/dvd-vr.c dvd-vr-0.9.2/dvd-vr.c --- dvd-vr-0.9.1/dvd-vr.c 2009-02-25 00:48:57.000000000 +0000 +++ dvd-vr-0.9.2/dvd-vr.c 2009-07-13 13:43:58.000000000 +0000 @@ -113,6 +113,7 @@ #include #endif const char* disc_charset; +const char* sys_charset; /********************************************************************************* * support routines @@ -332,32 +333,71 @@ } #endif //MMAP_WRITE +static const char* get_charset(void) +{ + const char* codeset = nl_langinfo(CODESET); +#ifdef __CYGWIN__ + /* Cygwin 1.5 does not support locales and nl_langinfo (CODESET) + always returns "US-ASCII". This is fixed in v1.7 I think? */ + if (codeset && STREQ(codeset, "US-ASCII")) { + + /* parse LANG=ja_JP.SJIS -> SJIS */ + const char* locale = getenv ("LANG"); + if (locale && *locale) { + const char *dot = strchr (locale, '.'); + + if (dot) { + const char *modifier; + + dot++; + if (!(modifier = strchr (dot, '@'))) { + return dot; + } else { + static char buf[32]; + size_t len = modifier - dot; + if (len < sizeof (buf)) { + memcpy (buf, dot, len); + *(buf+len) = '\0'; + return buf; + } + } + } + } + return "UTF-8"; + } +#endif + return codeset; +} + static bool text_convert(const char *src, size_t srclen, char *dst, size_t dstlen) { bool ret=false; #ifdef HAVE_ICONV - iconv_t cd = iconv_open (nl_langinfo(CODESET), disc_charset); + iconv_t cd = iconv_open (sys_charset, disc_charset); if (cd != (iconv_t)-1) { if (iconv (cd, (ICONV_CONST char**)&src, &srclen, &dst, &dstlen) != (size_t)-1) { if (iconv (cd, NULL, NULL, &dst, &dstlen) != (size_t)-1) { /* terminate string */ ret=true; } } else { - fprintf(stderr, "Error converting from %s to %s\n", - disc_charset, nl_langinfo(CODESET)); + fprintf(stderr, "Error converting text from %s to %s\n", + disc_charset, sys_charset); } iconv_close (cd); } else { - fprintf(stderr, - "Error converting from %s (not supported by this system)\n", - disc_charset); + fprintf(stderr, "Error converting text from %s to %s. Not supported\n", + disc_charset, sys_charset); } #else /* avoid warnings (__attribute__ ((unused)) is too verbose/non standard) */ (void)src; (void)dst; (void)srclen; (void)dstlen; + fprintf(stderr, + "Error converting text. libiconv missing\n", + disc_charset); #endif return ret; } + /********************************************************************************* * Internal structures *********************************************************************************/ @@ -1088,6 +1128,7 @@ int main(int argc, char** argv) { setlocale(LC_ALL,""); + sys_charset=get_charset(); get_options(argc, argv);