summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavutil/avstring.h14
-rw-r--r--libavutil/bprint.c29
-rw-r--r--libavutil/version.h2
-rw-r--r--tools/ffescape.c7
4 files changed, 49 insertions, 3 deletions
diff --git a/libavutil/avstring.h b/libavutil/avstring.h
index ee225585b3..fae446c302 100644
--- a/libavutil/avstring.h
+++ b/libavutil/avstring.h
@@ -324,6 +324,7 @@ enum AVEscapeMode {
AV_ESCAPE_MODE_AUTO, ///< Use auto-selected escaping mode.
AV_ESCAPE_MODE_BACKSLASH, ///< Use backslash escaping.
AV_ESCAPE_MODE_QUOTE, ///< Use single-quote escaping.
+ AV_ESCAPE_MODE_XML, ///< Use XML non-markup character data escaping.
};
/**
@@ -344,6 +345,19 @@ enum AVEscapeMode {
#define AV_ESCAPE_FLAG_STRICT (1 << 1)
/**
+ * Within AV_ESCAPE_MODE_XML, additionally escape single quotes for single
+ * quoted attributes.
+ */
+#define AV_ESCAPE_FLAG_XML_SINGLE_QUOTES (1 << 2)
+
+/**
+ * Within AV_ESCAPE_MODE_XML, additionally escape double quotes for double
+ * quoted attributes.
+ */
+#define AV_ESCAPE_FLAG_XML_DOUBLE_QUOTES (1 << 3)
+
+
+/**
* Escape string in src, and put the escaped string in an allocated
* string in *dst, which must be freed with av_free().
*
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 */
diff --git a/libavutil/version.h b/libavutil/version.h
index b7c5892a37..356c54d633 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -79,7 +79,7 @@
*/
#define LIBAVUTIL_VERSION_MAJOR 56
-#define LIBAVUTIL_VERSION_MINOR 66
+#define LIBAVUTIL_VERSION_MINOR 67
#define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
diff --git a/tools/ffescape.c b/tools/ffescape.c
index 0530d28c6d..1ed8daa801 100644
--- a/tools/ffescape.c
+++ b/tools/ffescape.c
@@ -78,8 +78,10 @@ int main(int argc, char **argv)
infilename = optarg;
break;
case 'f':
- if (!strcmp(optarg, "whitespace")) escape_flags |= AV_ESCAPE_FLAG_WHITESPACE;
- else if (!strcmp(optarg, "strict")) escape_flags |= AV_ESCAPE_FLAG_STRICT;
+ if (!strcmp(optarg, "whitespace")) escape_flags |= AV_ESCAPE_FLAG_WHITESPACE;
+ else if (!strcmp(optarg, "strict")) escape_flags |= AV_ESCAPE_FLAG_STRICT;
+ else if (!strcmp(optarg, "xml_single_quotes")) escape_flags |= AV_ESCAPE_FLAG_XML_SINGLE_QUOTES;
+ else if (!strcmp(optarg, "xml_double_quotes")) escape_flags |= AV_ESCAPE_FLAG_XML_DOUBLE_QUOTES;
else {
av_log(NULL, AV_LOG_ERROR,
"Invalid value '%s' for option -f, "
@@ -104,6 +106,7 @@ int main(int argc, char **argv)
if (!strcmp(optarg, "auto")) escape_mode = AV_ESCAPE_MODE_AUTO;
else if (!strcmp(optarg, "backslash")) escape_mode = AV_ESCAPE_MODE_BACKSLASH;
else if (!strcmp(optarg, "quote")) escape_mode = AV_ESCAPE_MODE_QUOTE;
+ else if (!strcmp(optarg, "xml")) escape_mode = AV_ESCAPE_MODE_XML;
else {
av_log(NULL, AV_LOG_ERROR,
"Invalid value '%s' for option -m, "