From 40b2713d84d4d3681fdbdd0e3f9a1cbd12749e6b Mon Sep 17 00:00:00 2001 From: murf Date: Fri, 2 Mar 2007 05:57:06 +0000 Subject: [PATCH] Merged revisions 57426 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r57426 | murf | 2007-03-01 22:21:36 -0700 (Thu, 01 Mar 2007) | 1 line I almost had comma escapes right, but 9184 points out the problem-- the escape is removed by pbx_config, and pbx_ael should also, before sending it down into the pbx engine. Also, you have to insert it back in, if you are generating extensions.conf code from the AEL. ........ git-svn-id: http://svn.digium.com/svn/asterisk/trunk@57438 f38db490-d61c-443f-a65b-d21fe96a405b --- pbx/pbx_ael.c | 8 ++++++++ utils/ael_main.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/pbx/pbx_ael.c b/pbx/pbx_ael.c index 364c185da..66a37dc32 100644 --- a/pbx/pbx_ael.c +++ b/pbx/pbx_ael.c @@ -155,11 +155,19 @@ static void substitute_commas(char *str); static void substitute_commas(char *str) { char *p = str; + while (p && *p) { if (*p == ',' && ((p != str && *(p-1) != '\\') || p == str)) *p = '|'; + if (*p == '\\' && *(p+1) == ',') { /* learning experience: the '\,' is turned into just ',' by pbx_config; So we need to do the same */ + char *q = p; + while (*q) { /* move the ',' and everything after it up 1 char */ + *q = *(q+1); + q++; + } + } p++; } } diff --git a/utils/ael_main.c b/utils/ael_main.c index 0798fc553..f32e0b5ec 100644 --- a/utils/ael_main.c +++ b/utils/ael_main.c @@ -181,6 +181,8 @@ int ast_add_extension2(struct ast_context *con, if( dump_extensions && dumpfile ) { struct namelist *n; + char *data2,*data3=0; + int commacount = 0; if( FIRST_TIME ) { FIRST_TIME = 0; @@ -215,11 +217,43 @@ int ast_add_extension2(struct ast_context *con, filter_newlines((char*)data); filter_leading_space_from_exprs((char*)data); + /* compiling turns commas into vertical bars in the app data, and also removes the backslash from before escaped commas; + we have to restore the escaping backslash in front of any commas; the vertical bars are OK to leave as-is */ + for (data2 = data; *data2; data2++) { + if (*data2 == ',') + commacount++; /* we need to know how much bigger the string will grow-- one backslash for each comma */ + } + if (commacount) + { + char *d3,*d4; + + data2 = (char*)malloc(strlen(data)+commacount+1); + data3 = data; + d3 = data; + d4 = data2; + while (*d3) { + if (*d3 == ',') { + *d4++ = '\\'; /* put a backslash in front of each comma */ + *d4++ = *d3++; + } else + *d4++ = *d3++; /* or just copy the char */ + } + *d4++ = 0; /* cap off the new string */ + data = data2; + } else + data2 = 0; + if( strcmp(label,"(null)") != 0 ) fprintf(dumpfile,"exten => %s,%d(%s),%s(%s)\n", extension, priority, label, application, (char*)data); else fprintf(dumpfile,"exten => %s,%d,%s(%s)\n", extension, priority, application, (char*)data); + if (data2) { + free(data2); + data2 = 0; + data = data3; /* restore data to pre-messedup state */ + } + } else { if( strcmp(label,"(null)") != 0 )