vlc | branch: master | Rémi Denis-Courmont <r...@remlab.net> | Fri Feb 24 22:01:38 2017 +0200| [7641dfe3eabcd7c3f1c2ae56cac3ed98b099d892] | committer: Rémi Denis-Courmont
strings: use vlc_memstream in vlc_xml_encode() > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=7641dfe3eabcd7c3f1c2ae56cac3ed98b099d892 --- src/text/strings.c | 45 ++++++++++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/src/text/strings.c b/src/text/strings.c index edc8834..45d72a1 100644 --- a/src/text/strings.c +++ b/src/text/strings.c @@ -284,38 +284,46 @@ void vlc_xml_decode( char *psz_value ) char *vlc_xml_encode (const char *str) { - assert (str != NULL); - - const size_t len = strlen (str); - char *const buf = malloc (6 * len + 1), *ptr = buf; - if (unlikely(buf == NULL)) - return NULL; - + struct vlc_memstream stream; size_t n; uint32_t cp; + assert(str != NULL); + vlc_memstream_open(&stream); + while ((n = vlc_towc (str, &cp)) != 0) { if (unlikely(n == (size_t)-1)) { - free (buf); + if (vlc_memstream_close(&stream)) + free(stream.ptr); errno = EILSEQ; return NULL; } switch (cp) { - case '\"': strcpy (ptr, """); ptr += 6; break; - case '&': strcpy (ptr, "&"); ptr += 5; break; - case '\'': strcpy (ptr, "'"); ptr += 5; break; - case '<': strcpy (ptr, "<"); ptr += 4; break; - case '>': strcpy (ptr, ">"); ptr += 4; break; + case '\"': + vlc_memstream_puts(&stream, """); + break; + case '&': + vlc_memstream_puts(&stream, "&"); + break; + case '\'': + vlc_memstream_puts(&stream, "'"); + break; + case '<': + vlc_memstream_puts(&stream, "<"); + break; + case '>': + vlc_memstream_puts(&stream, ">"); + break; default: if (cp < 32) /* C0 code not allowed (except 9, 10 and 13) */ break; if (cp >= 128 && cp < 160) /* C1 code encoded (except 133) */ { - ptr += sprintf (ptr, "&#%"PRIu32";", cp); + vlc_memstream_printf(&stream, "&#%"PRIu32";", cp); break; } /* fall through */ @@ -323,16 +331,15 @@ char *vlc_xml_encode (const char *str) case 10: case 13: case 133: - memcpy (ptr, str, n); - ptr += n; + vlc_memstream_write(&stream, str, n); break; } str += n; } - *(ptr++) = '\0'; - ptr = realloc (buf, ptr - buf); - return likely(ptr != NULL) ? ptr : buf; /* cannot fail */ + if (vlc_memstream_close(&stream)) + return NULL; + return stream.ptr; } /* Base64 encoding */ _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits