tried to do better scrolling; don't like the result
[k8sterm.git] / src / locales.c
blob049b6791ff7a4cd67dca015ab7ace590906efd73
1 ////////////////////////////////////////////////////////////////////////////////
2 // locale conversions
3 static iconv_t icFromLoc;
4 static iconv_t icToLoc;
5 static int needConversion = 0;
6 static const char *cliLocale = NULL;
9 static void initLCConversion (void) {
10 const char *lct = setlocale(LC_CTYPE, NULL);
11 char *cstr;
13 needConversion = 0;
14 if (cliLocale == NULL) {
15 if (strrchr(lct, '.') != NULL) lct = strrchr(lct, '.')+1;
16 } else {
17 lct = cliLocale;
19 if (strcasecmp(lct, "utf8") == 0 || strcasecmp(lct, "utf-8") == 0) return;
20 //fprintf(stderr, "locale: [%s]\n", lct);
21 icFromLoc = iconv_open("UTF-8", lct);
22 if (icFromLoc == (iconv_t)-1) k8t_die("can't initialize locale conversion");
23 cstr = SPrintf("%s//TRANSLIT", lct);
24 icToLoc = iconv_open(cstr, "UTF-8");
25 free(cstr);
26 if (icToLoc == (iconv_t)-1) k8t_die("can't initialize locale conversion");
27 needConversion = 1;
31 static int loc2utf (char *dest, const char *src, int len) {
32 if (needConversion) {
33 char *ibuf, *obuf;
34 size_t il, ol, ool;
36 ibuf = (char *)src;
37 obuf = dest;
38 il = len;
39 ool = ol = il*4;
40 il = iconv(icFromLoc, &ibuf, &il, &obuf, &ol);
41 if (il == (size_t)-1) return 0;
42 return ool-ol;
43 } else {
44 if (len > 0) memmove(dest, src, len);
45 return len;
50 static int utf2loc (char *dest, const char *src, int len) {
51 if (needConversion) {
52 char *ibuf, *obuf;
53 size_t il, ol, ool;
55 ibuf = (char *)src;
56 obuf = dest;
57 il = len;
58 ool = ol = il*4;
59 il = iconv(icToLoc, &ibuf, &il, &obuf, &ol);
60 if (il == (size_t)-1) return 0;
61 return ool-ol;
62 } else {
63 if (len > 0) memmove(dest, src, len);
64 return len;
69 static int loc2utfCB (K8Term *term, char *dest, const char *src, int len) {
70 return loc2utf(dest, src, len);
74 static int utf2locCB (K8Term *term, char *dest, const char *src, int len) {
75 return utf2loc(dest, src, len);
79 static int isConversionNecessaryCB (K8Term *term) {
80 return needConversion;