diff --git a/include/asterisk/utils.h b/include/asterisk/utils.h index 06805e82d08cc231e5acb321b71c0b568ba8d297..13ced53d218ccff44dba2324d857ee839d0b4a7d 100755 --- a/include/asterisk/utils.h +++ b/include/asterisk/utils.h @@ -20,6 +20,7 @@ #include <arpa/inet.h> /* we want to override inet_ntoa */ #include <netdb.h> #include <limits.h> +#include <string.h> #include "asterisk/lock.h" @@ -135,21 +136,59 @@ struct ast_hostent { \param str the input string \return a pointer to the first non-whitespace character */ +#ifdef LOW_MEMORY char *ast_skip_blanks(char *str); +#else +static inline char *ast_skip_blanks(char *str) +{ + while (*str && *str < 33) + str++; + return str; +} +#endif /*! \brief Trims trailing whitespace characters from a string. \param str the input string \return a pointer to the NULL following the string */ +#ifdef LOW_MEMORY char *ast_trim_blanks(char *str); +#else +static inline char *ast_trim_blanks(char *str) +{ + char *work = str; + + if (work) { + work += strlen(work) - 1; + /* It's tempting to only want to erase after we exit this loop, + but since ast_trim_blanks *could* receive a constant string + (which we presumably wouldn't have to touch), we shouldn't + actually set anything unless we must, and it's easier just + to set each position to \0 than to keep track of a variable + for it */ + while ((work >= str) && *work < 33) + *(work--) = '\0'; + } + return str; +} +#endif /*! \brief Gets a pointer to first whitespace character in a string. \param str the input string \return a pointer to the first whitespace character */ +#ifdef LOW_MEMORY char *ast_skip_nonblanks(char *str); +#else +static inline char *ast_skip_nonblanks(char *str) +{ + while (*str && *str > 32) + str++; + return str; +} +#endif /*! \brief Strip leading/trailing whitespace from a string. @@ -160,7 +199,17 @@ char *ast_skip_nonblanks(char *str); characters from the input string, and returns a pointer to the resulting string. The string is modified in place. */ +#ifdef LOW_MEMORY char *ast_strip(char *s); +#else +static inline char *ast_strip(char *s) +{ + s = ast_skip_blanks(s); + if (s) + ast_trim_blanks(s); + return s; +} +#endif /*! \brief Strip leading/trailing whitespace and quotes from a string. diff --git a/utils.c b/utils.c index 776853816aa3a9f8a89db6772d750333819d8f96..d8bd34f21bd03985f5fc018a2002909ca3ca627c 100755 --- a/utils.c +++ b/utils.c @@ -37,6 +37,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") static char base64[64]; static char b2a[256]; +#ifdef LOW_MEMORY char *ast_skip_blanks(char *str) { while (*str && *str < 33) @@ -48,13 +49,18 @@ char *ast_trim_blanks(char *str) { char *work = str; - if (work && !ast_strlen_zero(work)) { + if (work) { work += strlen(work) - 1; - while ((work >= str) && *work && *work < 33) - work--; - *(++work) = '\0'; /* terminate string */ + /* It's tempting to only want to erase after we exit this loop, + but since ast_trim_blanks *could* receive a constant string + (which we presumably wouldn't have to touch), we shouldn't + actually set anything unless we must, and it's easier just + to set each position to \0 than to keep track of a variable + for it */ + while ((work >= str) && *work < 33) + *(work--) = '\0'; } - return work; + return str; } char *ast_skip_nonblanks(char *str) @@ -71,6 +77,7 @@ char *ast_strip(char *s) ast_trim_blanks(s); return s; } +#endif char *ast_strip_quoted(char *s, const char *beg_quotes, const char *end_quotes) {