summaryrefslogtreecommitdiff
path: root/libavutil/bprint.c
diff options
context:
space:
mode:
authorStefano Sabatini <stefasab@gmail.com>2020-11-16 09:38:39 +0200
committerJan Ekström <jeebjp@gmail.com>2021-03-05 19:45:00 +0200
commit0f6bf94eb71c2d5e996c89c290f1a53660c46c2e (patch)
tree6786c1885eba8746deceeac4a6ff1816072b735e /libavutil/bprint.c
parenta272f382d3eb143e9da99537aec25dbbe5778614 (diff)
avutil/{avstring,bprint}: add XML escaping from ffprobe to avutil
Base escaping only escapes values required for base character data according to part 2.4 of XML, and if additional flags are added single and double quotes can additionally be escaped in order to handle single and double quoted attributes. Co-authored-by: Jan Ekström <jan.ekstrom@24i.com> Signed-off-by: Jan Ekström <jan.ekstrom@24i.com>
Diffstat (limited to 'libavutil/bprint.c')
-rw-r--r--libavutil/bprint.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/libavutil/bprint.c b/libavutil/bprint.c
index 2f059c5ba6..e12fb263fe 100644
--- a/libavutil/bprint.c
+++ b/libavutil/bprint.c
@@ -283,6 +283,35 @@ void av_bprint_escape(AVBPrint *dstbuf, const char *src, const char *special_cha
av_bprint_chars(dstbuf, '\'', 1);
break;
+ case AV_ESCAPE_MODE_XML:
+ /* escape XML non-markup character data as per 2.4 by default: */
+ /* [^<&]* - ([^<&]* ']]>' [^<&]*) */
+
+ /* additionally, given one of the AV_ESCAPE_FLAG_XML_* flags, */
+ /* escape those specific characters as required. */
+ for (; *src; src++) {
+ switch (*src) {
+ case '&' : av_bprintf(dstbuf, "%s", "&amp;"); break;
+ case '<' : av_bprintf(dstbuf, "%s", "&lt;"); break;
+ case '>' : av_bprintf(dstbuf, "%s", "&gt;"); break;
+ case '\'':
+ if (!(flags & AV_ESCAPE_FLAG_XML_SINGLE_QUOTES))
+ goto XML_DEFAULT_HANDLING;
+
+ av_bprintf(dstbuf, "%s", "&apos;");
+ break;
+ case '"' :
+ if (!(flags & AV_ESCAPE_FLAG_XML_DOUBLE_QUOTES))
+ goto XML_DEFAULT_HANDLING;
+
+ av_bprintf(dstbuf, "%s", "&quot;");
+ break;
+XML_DEFAULT_HANDLING:
+ default: av_bprint_chars(dstbuf, *src, 1);
+ }
+ }
+ break;
+
/* case AV_ESCAPE_MODE_BACKSLASH or unknown mode */
default:
/* \-escape characters */