/* * setlocale for NetBSD-1.6.2/hpcmips (broken setlocale) by m-ito * * Original idea is from yamamori@kt.rim.or.jp * * how to build : cc -fPIC -shared -o dmysetlocale.so dmysetlocale.c * usage : LD_PRELOAD=dmysetlocale.so CHARSET=EUC-JP somecommand */ #include #include #include #define MAX (64) #define DEF_LOCALE "C" static char *LocaleStr[_LC_LAST] = {"LC_ALL","LC_COLLATE","LC_CTYPE","LC_MONETARY","LC_NUMERIC","LC_TIME","LC_MESSAGES"}; char *setlocale(int cat,const char *locale) { static int flag = 0; static char dmylocale[_LC_LAST][MAX]; const char *p; int i; if (flag == 0){ MB_CUR_MAX = 2; for (i = 0; i < _LC_LAST; i++){ strncpy(dmylocale[i], DEF_LOCALE, MAX - 1); dmylocale[i][MAX - 1] = '\0'; } flag = 1; } if (cat < _LC_LAST){ if (locale == (char *)NULL){ return dmylocale[cat]; }else{ if (*locale == '\0'){ if ((p = getenv("LC_ALL")) == (char *)NULL || strlen(p) == 0){ if ((p = getenv(LocaleStr[cat])) == (char *)NULL || strlen(p) == 0){ if ((p = getenv("LANG")) == (char *)NULL || strlen(p) == 0){ p = DEF_LOCALE; } } } }else{ p = locale; } if (cat == LC_ALL){ for (i = 0; i < _LC_LAST; i++){ strncpy(dmylocale[i], p, MAX - 1); dmylocale[i][MAX - 1] = '\0'; } }else{ strncpy(dmylocale[cat], p, MAX - 1); dmylocale[cat][MAX - 1] = '\0'; } return dmylocale[cat]; } }else{ return (char *)NULL; } } int mbtowc(wchar_t *pwc, const char *s, size_t n) { int r; wchar_t wc; if (s == NULL) { return 0; } if (s[0] == '\0') { wc = 0; r = 0; } else if ((s[0] & 0x80) && n >= 2) { wc = 0x30000000 | ((s[0]<<7)&0x3f80) | (s[1]&0x7f); r = 2; } else { wc = (s[0]&0xff); r = 1; } if (pwc != NULL) { *pwc = wc; } return r; } size_t mbstowcs(wchar_t *pwcs, const char *s, size_t n) { int r, i; for (r = 0; r < n; r++) { if ((i = mbtowc(&pwcs[r], s, 2)) < 0) { return i; } if (pwcs[r] == 0) { break; } s += i; } return r; } int mblen(const char *s, size_t n) { return mbtowc(NULL, s, n); } int wctomb(char *s, wchar_t wc) { if (s == NULL) { return 0; } if (wc < 0x100) { s[0] = wc; return 1; } s[0] = (0x80|((wc>>7)&0x7f)); s[1] = (0x80|(wc&0x7f)); return 2; } size_t wcstombs(char *s, const wchar_t *pwcs, size_t n) { int r, i; for (r = 0; r < n;) { i = wctomb(&s[r], *pwcs); if (s[r] == '\0') { break; } pwcs++; r += i; } return r; }