diff options
-rw-r--r-- | include/asterisk/strings.h | 8 | ||||
-rw-r--r-- | main/utils.c | 37 |
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; |