This function tries to prefix all characters tagged in the <map> with the
<escape> character. The specified <chunk> contains the input to be
escaped.
---
include/common/standard.h | 11 +++++++++++
src/standard.c | 32 ++++++++++++++++++++++++++++++++
2 files changed, 43 insertions(+)
diff --git a/include/common/standard.h b/include/common/standard.h
index 357d22c..a33417d 100644
--- a/include/common/standard.h
+++ b/include/common/standard.h
@@ -380,6 +380,17 @@ char *encode_chunk(char *start, char *stop,
const char escape, const fd_set *map,
const struct chunk *chunk);
+/*
+ * Tries to prefix characters tagged in the <map> with the <escape>
+ * character. <chunk> contains the input to be escaped. The result will be
+ * stored between <start> (included) and <stop> (excluded). The function
+ * will always try to terminate the resulting string with a '\0' before
+ * <stop>, and will return its position if the conversion completes.
+ */
+char *escape_chunk(char *start, char *stop,
+ const char escape, const fd_set *map,
+ const struct chunk *chunk);
+
/* Check a string for using it in a CSV output format. If the string contains
* one of the following four char <">, <,>, CR or LF, the string is
diff --git a/src/standard.c b/src/standard.c
index 1b158e2..0a168b2 100644
--- a/src/standard.c
+++ b/src/standard.c
@@ -1431,6 +1431,38 @@ char *encode_chunk(char *start, char *stop,
return start;
}
+/*
+ * Tries to prefix characters tagged in the <map> with the <escape>
+ * character. <chunk> contains the input to be escaped. The result will be
+ * stored between <start> (included) and <stop> (excluded). The function
+ * will always try to terminate the resulting string with a '\0' before
+ * <stop>, and will return its position if the conversion completes.
+ */
+char *escape_chunk(char *start, char *stop,
+ const char escape, const fd_set *map,
+ const struct chunk *chunk)
+{
+ char *str = chunk->str;
+ char *end = chunk->str + chunk->len;
+
+ if (start < stop) {
+ stop--; /* reserve one byte for the final '\0' */
+ while (start < stop && str < end) {
+ if (!FD_ISSET((unsigned char)(*str), map))
+ *start++ = *str;
+ else {
+ if (start + 2 >= stop)
+ break;
+ *start++ = escape;
+ *start++ = *str;
+ }
+ str++;
+ }
+ *start = '\0';
+ }
+ return start;
+}
+
/* Check a string for using it in a CSV output format. If the string contains
* one of the following four char <">, <,>, CR or LF, the string is
* encapsulated between <"> and the <"> are escaped by a <""> sequence.
--
1.7.9.5