]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
I almost had comma escapes right, but 9184 points out the problem-- the escape is...
authorSteve Murphy <murf@digium.com>
Fri, 2 Mar 2007 05:21:36 +0000 (05:21 +0000)
committerSteve Murphy <murf@digium.com>
Fri, 2 Mar 2007 05:21:36 +0000 (05:21 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@57426 65c4cc65-6c06-0410-ace0-fbb531ad65f3

pbx/pbx_ael.c
utils/ael_main.c

index 2905f01cfc50a66a0a3b5f08dfcd4421109d2e21..6b787b8e0bc0a9b102273f162035bd134a83b938 100644 (file)
@@ -151,11 +151,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++;
        }
 }
index 0798fc553a8cc1162fee64f6bf43028361b5e685..f32e0b5ec72213f1b3e80395aa0b784867487b0c 100644 (file)
@@ -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  )