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