From c53e76528d1c7a120bbcba7077b1ef9e112554a5 Mon Sep 17 00:00:00 2001 From: Mark Spencer <markster@digium.com> Date: Mon, 14 Jun 2004 21:43:16 +0000 Subject: [PATCH] Allow escaping of commas as well as ability to use quotes (bug #1826) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@3209 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- pbx/pbx_config.c | 38 ++++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/pbx/pbx_config.c b/pbx/pbx_config.c index 0c0cbd1b64..47a4c96388 100755 --- a/pbx/pbx_config.c +++ b/pbx/pbx_config.c @@ -97,6 +97,36 @@ static char reload_extensions_help[] = "\n" "Example: extensions reload\n"; +/* + * Static code + */ +static char* process_quotes_and_slashes( char* start, char find, char replace_with ) +{ + char* dataPut = start; + int inEscape = 0; + int inQuotes = 0; + for( ; *start; start++ ) { + if( inEscape ) { + *dataPut++ = *start; /* Always goes verbatim */ + inEscape = 0; + } + else { + if( *start == '\\' ) { + inEscape = 1; /* Do not copy \ into the data */ + } + else if( *start == '\"' ) { + inQuotes = 1-inQuotes; /* Do not copy " into the data */ + } + else { + /* Replace , with |, unless in quotes */ + *dataPut++ = inQuotes ? *start : ((*start==find) ? replace_with : *start); + } + } + } + *dataPut = 0; + return dataPut; +} + /* * Implementation of functions provided by this module */ @@ -1144,9 +1174,7 @@ static int handle_context_add_extension(int fd, int argc, char *argv[]) if (app && (start = strchr(app, '(')) && (end = strrchr(app, ')'))) { *start = *end = '\0'; app_data = start + 1; - for (start = app_data; *start; start++) - if (*start == ',') - *start = '|'; + process_quotes_and_slashes(app_data,',','|'); } else app_data = whole_exten; @@ -1615,9 +1643,7 @@ static int pbx_load_module(void) if (start && (end = strrchr(appl, ')'))) { *start = *end = '\0'; data = start + 1; - for (start = data; *start; start++) - if (*start == ',') - *start = '|'; + process_quotes_and_slashes(data,',','|'); } else if (stringp!=NULL && *stringp=='"') { stringp++; data = strsep(&stringp, "\""); -- GitLab