From 1fba654845c8202bf84c58b203a3bc9624164c4e Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 1 Jul 2010 14:21:44 -0500 Subject: [PATCH] fix parse err in originate code --- src/include/switch_utils.h | 41 ++++++++++++++++++++++++++++++++++++++ src/switch_event.c | 4 ++-- src/switch_ivr_originate.c | 6 +++--- 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/src/include/switch_utils.h b/src/include/switch_utils.h index 7c4541671e..514f78d0d8 100644 --- a/src/include/switch_utils.h +++ b/src/include/switch_utils.h @@ -92,6 +92,47 @@ static inline switch_bool_t switch_is_moh(const char *s) return SWITCH_TRUE; } +/* find a character (find) in a string (in) and return a pointer to that point in the string where the character was found + using the array (allowed) as allowed non-matching characters, when (allowed) is NULL, behaviour should be identical to strchr() + */ +static inline char *switch_strchr_strict(const char *in, char find, const char *allowed) +{ + const char *p; + + switch_assert(in); + + p = in; + + while(p && *p) { + const char *a = allowed; + int found = 0; + + if (!a) { + found = 1; + } else { + + while(a && *a) { + + if (*p == *a) { + found = 1; + break; + } + + a++; + } + + } + + if (!found) return NULL; + + if (*p == find) break; + + p++; + } + + return (char *) p; +} + #define switch_arraylen(_a) (sizeof(_a) / sizeof(_a[0])) #define switch_split(_data, _delim, _array) switch_separate_string(_data, _delim, _array, switch_arraylen(_array)) diff --git a/src/switch_event.c b/src/switch_event.c index 130032c0ed..ed2b38466a 100644 --- a/src/switch_event.c +++ b/src/switch_event.c @@ -1064,7 +1064,7 @@ SWITCH_DECLARE(switch_status_t) switch_event_create_brackets(char *data, char a, check_a = end; - while (check_a && (check_b = strchr(check_a, a))) { + while (check_a && (check_b = switch_strchr_strict(check_a, a, " "))) { if ((check_b = switch_find_end_paren(check_b, a, b))) { check_a = check_b; } @@ -1090,7 +1090,7 @@ SWITCH_DECLARE(switch_status_t) switch_event_create_brackets(char *data, char a, char *pnext; *next++ = '\0'; - if ((pnext = strchr(next, a))) { + if ((pnext = switch_strchr_strict(next, a, " "))) { next = pnext + 1; } } diff --git a/src/switch_ivr_originate.c b/src/switch_ivr_originate.c index 1edc491be5..9cd71f334e 100644 --- a/src/switch_ivr_originate.c +++ b/src/switch_ivr_originate.c @@ -2313,7 +2313,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess } if (p == end) { - end = strchr(p, '['); + end = switch_strchr_strict(p, '[', " "); } p++; @@ -2537,7 +2537,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess current_variable = NULL; switch_event_add_header_string(var_event, SWITCH_STACK_BOTTOM, "originate_early_media", oglobals.early_ok ? "true" : "false"); - + printf("ASS %s\n", vdata); if (vdata) { char *var_array[1024] = { 0 }; int var_count = 0; @@ -2552,7 +2552,7 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_originate(switch_core_session_t *sess char *pnext; *next++ = '\0'; - if ((pnext = strchr(next, '['))) { + if ((pnext = switch_strchr_strict(next, '[', " "))) { next = pnext + 1; } }