|
@@ -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", "&"); break;
|
|
|
+ case '<' : av_bprintf(dstbuf, "%s", "<"); break;
|
|
|
+ case '>' : av_bprintf(dstbuf, "%s", ">"); break;
|
|
|
+ case '\'':
|
|
|
+ if (!(flags & AV_ESCAPE_FLAG_XML_SINGLE_QUOTES))
|
|
|
+ goto XML_DEFAULT_HANDLING;
|
|
|
+
|
|
|
+ av_bprintf(dstbuf, "%s", "'");
|
|
|
+ break;
|
|
|
+ case '"' :
|
|
|
+ if (!(flags & AV_ESCAPE_FLAG_XML_DOUBLE_QUOTES))
|
|
|
+ goto XML_DEFAULT_HANDLING;
|
|
|
+
|
|
|
+ av_bprintf(dstbuf, "%s", """);
|
|
|
+ break;
|
|
|
+XML_DEFAULT_HANDLING:
|
|
|
+ default: av_bprint_chars(dstbuf, *src, 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
/* case AV_ESCAPE_MODE_BACKSLASH or unknown mode */
|
|
|
default:
|
|
|
/* \-escape characters */
|