@@ -1571,21 +1571,10 @@ static av_cold int xml_init(WriterContext *wctx)
return 0;
}
-static const char *xml_escape_str(AVBPrint *dst, const char *src, void *log_ctx)
+static const char *xml_escape_str(AVBPrint *dst, const char *src)
{
- const char *p;
-
- for (p = src; *p; p++) {
- switch (*p) {
- case '&' : av_bprintf(dst, "%s", "&"); break;
- case '<' : av_bprintf(dst, "%s", "<"); break;
- case '>' : av_bprintf(dst, "%s", ">"); break;
- case '"' : av_bprintf(dst, "%s", """); break;
- case '\'': av_bprintf(dst, "%s", "'"); break;
- default: av_bprint_chars(dst, *p, 1);
- }
- }
-
+ av_bprint_clear(dst);
+ av_bprint_escape(dst, src, NULL, AV_ESCAPE_MODE_XML, AV_ESCAPE_FLAG_ESCAPE_DOUBLE_QUOTE);
return dst->str;
}
@@ -1660,14 +1649,12 @@ static void xml_print_str(WriterContext *wctx, const char *key, const char *valu
if (section->flags & SECTION_FLAG_HAS_VARIABLE_FIELDS) {
XML_INDENT();
- printf("<%s key=\"%s\"",
- section->element_name, xml_escape_str(&buf, key, wctx));
- av_bprint_clear(&buf);
- printf(" value=\"%s\"/>\n", xml_escape_str(&buf, value, wctx));
+ printf("<%s key=\"%s\"", section->element_name, xml_escape_str(&buf, key));
+ printf(" value=\"%s\"/>\n", xml_escape_str(&buf, value));
} else {
if (wctx->nb_item[wctx->level])
printf(" ");
- printf("%s=\"%s\"", key, xml_escape_str(&buf, value, wctx));
+ printf("%s=\"%s\"", key, xml_escape_str(&buf, value));
}
av_bprint_finalize(&buf, NULL);
@@ -51,7 +51,7 @@
<format filename="tests/data/ffprobe-test.nut" nb_streams="3" nb_programs="0" format_name="nut" start_time="0.000000" duration="0.120000" size="1054887" bit_rate="70325800" probe_score="100">
<tag key="title" value="ffprobe test file"/>
- <tag key="comment" value="'A comment with CSV, XML & JSON special chars': <tag value="x">"/>
+ <tag key="comment" value="'A comment with CSV, XML & JSON special chars': <tag value="x">"/>
<tag key="comment2" value="I ♥ Üñîçød€"/>
</format>
</ffprobe>