From: barbieri Date: Tue, 29 Jan 2008 22:08:12 +0000 (+0000) Subject: Better handling of strings that failed encoding. X-Git-Url: https://vcs.maemo.org/git/?p=lms;a=commitdiff_plain;h=81346b89f7862b21a7d472be0a394a2e81973098 Better handling of strings that failed encoding. Instead of just memset() the whole string to '?', just replace chars that are not printable (according to ctypes.h isprint()). --- diff --git a/lightmediascanner/src/lib/lightmediascanner_charset_conv.c b/lightmediascanner/src/lib/lightmediascanner_charset_conv.c index a43bf62..6297ea4 100644 --- a/lightmediascanner/src/lib/lightmediascanner_charset_conv.c +++ b/lightmediascanner/src/lib/lightmediascanner_charset_conv.c @@ -24,6 +24,7 @@ #include #include #include +#include struct lms_charset_conv { iconv_t check; @@ -273,6 +274,14 @@ _conv(iconv_t cd, char **p_str, unsigned int *p_len, char *ostr, unsigned int ol return 0; } +static void +_fix_non_ascii(char *s, int len) +{ + for (; len > 0; len--, s++) + if (!isprint(*s)) + *s = '?'; +} + /** * If required, do charset conversion to UTF-8. * @@ -322,7 +331,7 @@ lms_charset_conv(lms_charset_conv_t *lcc, char **p_str, unsigned int *p_len) *p_len, *p_str); i = _conv(lcc->fallback, p_str, p_len, outstr, outlen); if (i < 0) { - memset(*p_str, '?', *p_len); + _fix_non_ascii(*p_str, *p_len); free(outstr); } return i; @@ -372,7 +381,7 @@ lms_charset_conv_force(lms_charset_conv_t *lcc, char **p_str, unsigned int *p_le *p_len, *p_str); i = _conv(lcc->fallback, p_str, p_len, outstr, outlen); if (i < 0) { - memset(*p_str, '?', *p_len); + _fix_non_ascii(*p_str, *p_len); free(outstr); } return i;