]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: standard: add function "escape_chunk"
authorDragan Dosen <ddosen@haproxy.com>
Fri, 12 Feb 2016 12:23:02 +0000 (13:23 +0100)
committerWilly Tarreau <w@1wt.eu>
Fri, 12 Feb 2016 12:36:47 +0000 (13:36 +0100)
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
src/standard.c

index 3e40fd50945d5e7ecaa53cf91265400e742e1d18..a66317171a2edf255757bb61a238782404c5bcfb 100644 (file)
@@ -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
index 67c82c7304b460e03fe7dc6761bdd514f283cb98..f4da01bc2ce5555e62768ccb73e1b0054e026cc3 100644 (file)
@@ -1439,6 +1439,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.