diff options
author | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-10-26 00:11:31 +0000 |
---|---|---|
committer | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-10-26 00:11:31 +0000 |
commit | 1c1252b9de75dd49d26574b89e2a2d0dec6575df (patch) | |
tree | f18deeb3b8bd469705735ccfc9d9b2b2089ce917 | |
parent | daac309efb0a17003d0973540c23519d851d7245 (diff) |
Use the same delimited character as the FILTER function in FIELDQTY and CUT.
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@87103 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r-- | funcs/func_cut.c | 20 | ||||
-rw-r--r-- | funcs/func_strings.c | 87 | ||||
-rw-r--r-- | include/asterisk/app.h | 3 | ||||
-rw-r--r-- | main/app.c | 67 |
4 files changed, 82 insertions, 95 deletions
diff --git a/funcs/func_cut.c b/funcs/func_cut.c index 4466e3269..7b4f0f41d 100644 --- a/funcs/func_cut.c +++ b/funcs/func_cut.c @@ -118,6 +118,7 @@ static int sort_internal(struct ast_channel *chan, char *data, char *buffer, siz static int cut_internal(struct ast_channel *chan, char *data, char *buffer, size_t buflen) { char *parse; + size_t delim_consumed; AST_DECLARE_APP_ARGS(args, AST_APP_ARG(varname); AST_APP_ARG(delimiter); @@ -134,7 +135,7 @@ static int cut_internal(struct ast_channel *chan, char *data, char *buffer, size if (args.argc < 3) { return ERROR_NOARG; } else { - char d, ds[2]; + char d, ds[2] = ""; char *tmp = alloca(strlen(args.varname) + 4); char varvalue[MAXRESULT], *tmp2=varvalue; @@ -145,22 +146,11 @@ static int cut_internal(struct ast_channel *chan, char *data, char *buffer, size return ERROR_NOMEM; } - if (args.delimiter[0] == '\\') { - if (args.delimiter[1] == 'n') - d = '\n'; - else if (args.delimiter[1] == 't') - d = '\t'; - else if (args.delimiter[1]) - d = args.delimiter[1]; - else - d = '-'; - } else if (args.delimiter[0]) - d = args.delimiter[0]; - else - d = '-'; + if (ast_get_encoded_char(args.delimiter, ds, &delim_consumed)) + return ERROR_NOARG; /* String form of the delimiter, for use with strsep(3) */ - snprintf(ds, sizeof(ds), "%c", d); + d = *ds; pbx_substitute_variables_helper(chan, tmp, tmp2, MAXRESULT - 1); diff --git a/funcs/func_strings.c b/funcs/func_strings.c index d8327b5ce..3230b67ad 100644 --- a/funcs/func_strings.c +++ b/funcs/func_strings.c @@ -54,19 +54,13 @@ static int function_fieldqty(struct ast_channel *chan, const char *cmd, AST_APP_ARG(varname); AST_APP_ARG(delim); ); + char delim[2] = ""; + size_t delim_used; AST_STANDARD_APP_ARGS(args, parse); if (args.delim) { - if (args.delim[0] == '\\') { - if (args.delim[1] == 'n') - ast_copy_string(args.delim, "\n", 2); - else if (args.delim[1] == 't') - ast_copy_string(args.delim, "\t", 2); - else if (args.delim[1]) - ast_copy_string(args.delim, &args.delim[1], 2); - else - ast_copy_string(args.delim, "-", 2); - } + ast_get_encoded_char(args.delim, delim, &delim_used); + varsubst = alloca(strlen(args.varname) + 4); sprintf(varsubst, "${%s}", args.varname); @@ -74,7 +68,7 @@ static int function_fieldqty(struct ast_channel *chan, const char *cmd, if (ast_strlen_zero(varval2)) fieldcount = 0; else { - while (strsep(&varval2, args.delim)) + while (strsep(&varval2, delim)) fieldcount++; } } else { @@ -92,73 +86,6 @@ static struct ast_custom_function fieldqty_function = { .read = function_fieldqty, }; -static int get_filter_char(const char *stream, char *result, size_t *consumed) -{ - int i; - *consumed = 1; - *result = 0; - if (*stream == '\\') { - *consumed = 2; - switch (*(stream + 1)) { - case 'n': - *result = '\n'; - break; - case 'r': - *result = '\r'; - break; - case 't': - *result = '\t'; - break; - case 'x': - /* Hexadecimal */ - if (strchr("0123456789ABCDEFabcdef", *(stream + 2)) && *(stream + 2) != '\0') { - *consumed = 3; - if (*(stream + 2) <= '9') - *result = *(stream + 2) - '0'; - else if (*(stream + 2) <= 'F') - *result = *(stream + 2) - 'A' + 10; - else - *result = *(stream + 2) - 'a' + 10; - } else { - ast_log(LOG_ERROR, "Illegal character '%c' in hexadecimal string\n", *(stream + 2)); - return -1; - } - - if (strchr("0123456789ABCDEFabcdef", *(stream + 3)) && *(stream + 3) != '\0') { - *consumed = 4; - *result <<= 4; - if (*(stream + 3) <= '9') - *result += *(stream + 3) - '0'; - else if (*(stream + 3) <= 'F') - *result += *(stream + 3) - 'A' + 10; - else - *result += *(stream + 3) - 'a' + 10; - } - break; - case '0': - /* Octal */ - *consumed = 2; - for (i = 2; ; i++) { - if (strchr("01234567", *(stream + i)) && *(stream + i) != '\0') { - (*consumed)++; - ast_debug(5, "result was %d, ", *result); - *result <<= 3; - *result += *(stream + i) - '0'; - ast_debug(5, "is now %d\n", *result); - } else - break; - } - break; - default: - *result = *(stream + 1); - } - } else { - *result = *stream; - *consumed = 1; - } - return 0; -} - static int filter(struct ast_channel *chan, const char *cmd, char *parse, char *buf, size_t len) { @@ -182,12 +109,12 @@ static int filter(struct ast_channel *chan, const char *cmd, char *parse, char * char c1 = 0, c2 = 0; size_t consumed = 0; - if (get_filter_char(args.allowed, &c1, &consumed)) + if (ast_get_encoded_char(args.allowed, &c1, &consumed)) return -1; args.allowed += consumed; if (*(args.allowed) == '-') { - if (get_filter_char(args.allowed + 1, &c2, &consumed)) + if (ast_get_encoded_char(args.allowed + 1, &c2, &consumed)) c2 = -1; args.allowed += consumed + 1; diff --git a/include/asterisk/app.h b/include/asterisk/app.h index 6e5d993c3..0529f9258 100644 --- a/include/asterisk/app.h +++ b/include/asterisk/app.h @@ -457,6 +457,9 @@ int ast_app_dtget(struct ast_channel *chan, const char *context, char *collect, /*! Allow to record message and have a review option */ int ast_record_review(struct ast_channel *chan, const char *playfile, const char *recordfile, int maxtime, const char *fmt, int *duration, const char *path); +/*! Decode an encoded control or extended ASCII character */ +int ast_get_encoded_char(const char *stream, char *result, size_t *consumed); + #if defined(__cplusplus) || defined(c_plusplus) } #endif diff --git a/main/app.c b/main/app.c index a0feb36cc..f08c83929 100644 --- a/main/app.c +++ b/main/app.c @@ -1664,3 +1664,70 @@ int ast_app_parse_options64(const struct ast_app_option *options, struct ast_fla return res; } +int ast_get_encoded_char(const char *stream, char *result, size_t *consumed) +{ + int i; + *consumed = 1; + *result = 0; + if (*stream == '\\') { + *consumed = 2; + switch (*(stream + 1)) { + case 'n': + *result = '\n'; + break; + case 'r': + *result = '\r'; + break; + case 't': + *result = '\t'; + break; + case 'x': + /* Hexadecimal */ + if (strchr("0123456789ABCDEFabcdef", *(stream + 2)) && *(stream + 2) != '\0') { + *consumed = 3; + if (*(stream + 2) <= '9') + *result = *(stream + 2) - '0'; + else if (*(stream + 2) <= 'F') + *result = *(stream + 2) - 'A' + 10; + else + *result = *(stream + 2) - 'a' + 10; + } else { + ast_log(LOG_ERROR, "Illegal character '%c' in hexadecimal string\n", *(stream + 2)); + return -1; + } + + if (strchr("0123456789ABCDEFabcdef", *(stream + 3)) && *(stream + 3) != '\0') { + *consumed = 4; + *result <<= 4; + if (*(stream + 3) <= '9') + *result += *(stream + 3) - '0'; + else if (*(stream + 3) <= 'F') + *result += *(stream + 3) - 'A' + 10; + else + *result += *(stream + 3) - 'a' + 10; + } + break; + case '0': + /* Octal */ + *consumed = 2; + for (i = 2; ; i++) { + if (strchr("01234567", *(stream + i)) && *(stream + i) != '\0') { + (*consumed)++; + ast_debug(5, "result was %d, ", *result); + *result <<= 3; + *result += *(stream + i) - '0'; + ast_debug(5, "is now %d\n", *result); + } else + break; + } + break; + default: + *result = *(stream + 1); + } + } else { + *result = *stream; + *consumed = 1; + } + return 0; +} + |