/* local: some stuff for localisation Currently, this is just about determining if we got UTF-8 locale. copyright 2008 by the mpg123 project - free software under the terms of the LGPL 2.1 see COPYING and AUTHORS files in distribution or http://mpg123.org initially written by Thomas Orgis, based on a patch by Thorsten Glaser. */ #include "config.h" #ifdef HAVE_LOCALE_H #include #endif #ifdef HAVE_LANGINFO_H #include #endif #include "compat.h" #include "mpg123app.h" #include "debug.h" int utf8env = 0; /* Check some language variable for UTF-8-ness. */ static int is_utf8(const char *lang); void check_locale(void) { if(param.force_utf8) utf8env = 1; else { const char *cp; /* Check for env vars in proper oder. */ if((cp = getenv("LC_ALL")) == NULL && (cp = getenv("LC_CTYPE")) == NULL) cp = getenv("LANG"); if(is_utf8(cp)) utf8env = 1; } #if defined(HAVE_SETLOCALE) && defined(LC_CTYPE) /* To query, we need to set from environment... */ if(!utf8env && is_utf8(setlocale(LC_CTYPE, ""))) utf8env = 1; #endif #if defined(HAVE_NL_LANGINFO) && defined(CODESET) /* ...langinfo works after we set a locale, eh? So it makes sense after setlocale, if only. */ if(!utf8env && is_utf8(nl_langinfo(CODESET))) utf8env = 1; #endif debug1("UTF-8 locale: %i", utf8env); } static int is_utf8(const char *lang) { if(lang == NULL) return 0; /* Now, if the variable mentions UTF-8 anywhere, in some variation, the locale is UTF-8. */ if( strstr(lang, "UTF-8") || strstr(lang, "utf-8") || strstr(lang, "UTF8") || strstr(lang, "utf8") ) return 1; else return 0; }