diff options
author | Přemysl Janouch <p.janouch@gmail.com> | 2016-10-10 08:39:31 +0200 |
---|---|---|
committer | Přemysl Janouch <p.janouch@gmail.com> | 2016-10-10 10:16:28 +0200 |
commit | 29bc035ecfed9e37ce63b42de982b95569753463 (patch) | |
tree | 877faaeb0e78b80207082a8028d8e7e29d061bb1 | |
parent | 44e19d68f0fbbc5ddda9a780647bf4838d30d342 (diff) | |
download | nncmpp-29bc035ecfed9e37ce63b42de982b95569753463.tar.gz nncmpp-29bc035ecfed9e37ce63b42de982b95569753463.tar.xz nncmpp-29bc035ecfed9e37ce63b42de982b95569753463.zip |
Ensure UTF-8 when parsing playlists
-rw-r--r-- | nncmpp.c | 34 |
1 files changed, 30 insertions, 4 deletions
@@ -142,6 +142,25 @@ clock_msec (clockid_t clock) return (int64_t) tp.tv_sec * 1000 + (int64_t) tp.tv_nsec / 1000000; } +static char * +latin1_to_utf8 (const char *latin1) +{ + struct str converted; + str_init (&converted); + while (*latin1) + { + uint8_t c = *latin1++; + if (c < 0x80) + str_append_c (&converted, c); + else + { + str_append_c (&converted, 0xC0 | (c >> 6)); + str_append_c (&converted, 0x80 | (c & 0x3F)); + } + } + return str_steal (&converted); +} + // --- cURL async wrapper ------------------------------------------------------ // You are meant to subclass this structure, no user_data pointers needed @@ -1888,11 +1907,18 @@ parse_playlist (const char *playlist, const char *content_type, regmatch_t groups[2]; for (size_t i = 0; i < lines.len; i++) - { if (regexec (re, lines.vector[i], 2, groups, 0) != REG_NOMATCH) - str_vector_add (out, xstrndup (lines.vector[i] + groups[1].rm_so, - groups[1].rm_eo - groups[1].rm_so)); - } + { + char *target = xstrndup (lines.vector[i] + groups[1].rm_so, + groups[1].rm_eo - groups[1].rm_so); + if (utf8_validate (target, strlen (target))) + str_vector_add_owned (out, target); + else + { + str_vector_add_owned (out, latin1_to_utf8 (target)); + free (target); + } + } regex_free (re); str_vector_free (&lines); } |