aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/asterisk/strings.h8
-rw-r--r--main/utils.c37
2 files changed, 45 insertions, 0 deletions
diff --git a/include/asterisk/strings.h b/include/asterisk/strings.h
index 1ba62ede3..9646e94c2 100644
--- a/include/asterisk/strings.h
+++ b/include/asterisk/strings.h
@@ -155,6 +155,14 @@ char *ast_strip_quoted(char *s, const char *beg_quotes, const char *end_quotes);
char *ast_unescape_semicolon(char *s);
/*!
+ \brief Convert some C escape sequences (\b\f\n\r\t) into the
+ equivalent characters.
+ \brief s The string to be converted (will be modified).
+ \return The converted string.
+ */
+char *ast_unescape_c(char *s);
+
+/*!
\brief Size-limited null-terminating string copy.
\arg dst The destination buffer.
\arg src The source string
diff --git a/main/utils.c b/main/utils.c
index 2c4cef829..6920141b0 100644
--- a/main/utils.c
+++ b/main/utils.c
@@ -1020,6 +1020,43 @@ char *ast_unescape_semicolon(char *s)
return s;
}
+/* !\brief unescape some C sequences in place, return pointer to the original string.
+ */
+char *ast_unescape_c(char *src)
+{
+ char c, *ret, *dst;
+
+ if (src == NULL)
+ return NULL;
+ for (ret = dst = src; (c = *src++); *dst++ = c ) {
+ if (c != '\\')
+ continue; /* copy char at the end of the loop */
+ switch ((c = *src++)) {
+ case '\0': /* special, trailing '\' */
+ c = '\\';
+ break;
+ case 'b': /* backspace */
+ c = '\b';
+ break;
+ case 'f': /* form feed */
+ c = '\f';
+ break;
+ case 'n':
+ c = '\n';
+ break;
+ case 'r':
+ c = '\r';
+ break;
+ case 't':
+ c = '\t';
+ break;
+ }
+ /* default, use the char literally */
+ }
+ *dst = '\0';
+ return ret;
+}
+
int ast_build_string_va(char **buffer, size_t *space, const char *fmt, va_list ap)
{
int result;