int xmvwaddstr (WINDOW *win, const int y, const int x, const char *str) { int res; if (using_utf8) res = mvwaddstr (win, y, x, str); else { char *lstr = iconv_str (iconv_desc, str); res = mvwaddstr (win, y, x, lstr); free (lstr); } return res; }
int xwaddnstr (WINDOW *win, const char *str, const int n) { int res, width, inv_char; wchar_t *ucs; char *mstr, *lstr; size_t size, num_chars; assert (n > 0); assert (str != NULL); mstr = iconv_str (iconv_desc, str); size = xmbstowcs (NULL, mstr, -1, NULL) + 1; ucs = (wchar_t *)xmalloc (sizeof(wchar_t) * size); xmbstowcs (ucs, mstr, size, &inv_char); width = wcswidth (ucs, WIDTH_MAX); if (width == -1) { size_t clidx; for (clidx = 0; clidx < size - 1; clidx++) { if (wcwidth (ucs[clidx]) == -1) ucs[clidx] = L'?'; } width = wcswidth (ucs, WIDTH_MAX); inv_char = 1; } if (width > n) { while (width > n) width -= wcwidth (ucs[--size]); ucs[size] = L'\0'; } num_chars = wcstombs (NULL, ucs, 0); lstr = (char *)xmalloc (num_chars + 1); if (inv_char) wcstombs (lstr, ucs, num_chars + 1); else snprintf (lstr, num_chars + 1, "%s", mstr); res = waddstr (win, lstr); free (ucs); free (lstr); free (mstr); return res; }
int xwprintw (WINDOW *win, const char *fmt, ...) { va_list va; int res; char *buf; va_start (va, fmt); buf = format_msg_va (fmt, va); va_end (va); if (using_utf8) res = waddstr (win, buf); else { char *lstr = iconv_str (iconv_desc, buf); res = waddstr (win, lstr); free (lstr); } free (buf); return res; }
char *xterm_iconv_str (const char *str) { return iconv_str (xterm_iconv_desc, str); }
char *files_iconv_str (const char *str) { return iconv_str (files_iconv_desc, str); }
static char *id3v1_fix (const char *str) { if (iconv_id3_fix != (iconv_t)-1) return iconv_str (iconv_id3_fix, str); return xstrdup (str); }