From 6e1c32e0997f83a1a490565f3a9e304c70ad32d2 Mon Sep 17 00:00:00 2001
From: Anthony Minessale <anthony.minessale@gmail.com>
Date: Sat, 19 Jan 2008 21:54:11 +0000
Subject: [PATCH] update

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@7301 d0543943-73ff-0310-b7d9-9358b9ac24b2
---
 src/switch_regex.c |  2 +-
 src/switch_utils.c | 35 ++++++++++++++++++++++-------------
 2 files changed, 23 insertions(+), 14 deletions(-)

diff --git a/src/switch_regex.c b/src/switch_regex.c
index c132ee1eb0..146da45fa6 100644
--- a/src/switch_regex.c
+++ b/src/switch_regex.c
@@ -95,7 +95,7 @@ SWITCH_DECLARE(int) switch_regex_perform(const char *field, const char *expressi
 					  &erroffset,	/* for error offset */
 					  NULL);	/* use default character tables */
 	if (error) {
-		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "COMPILE ERROR: %d [%s]\n", erroffset, error);
+		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "COMPILE ERROR: %d [%s][%s]\n", erroffset, error, expression);
 		switch_regex_safe_free(re);
 		goto end;
 	}
diff --git a/src/switch_utils.c b/src/switch_utils.c
index 04dbc0ccd1..c97a2782b4 100644
--- a/src/switch_utils.c
+++ b/src/switch_utils.c
@@ -35,7 +35,7 @@
 #include <arpa/inet.h>
 #endif
 #include "private/switch_core_pvt.h"
-
+#define ESCAPE_META '\\'
 
 SWITCH_DECLARE(char *) switch_find_end_paren(const char *s, char open, char close)
 {
@@ -1017,7 +1017,7 @@ SWITCH_DECLARE(char *) switch_escape_char(switch_memory_pool_t *pool, char *in,
 static char unescape_char(char escaped)
 {
 	char unescaped;
-	
+	printf("WTF [%c]\n", escaped);
 	switch (escaped) {
 		case 'n':
 			unescaped = '\n';
@@ -1052,16 +1052,25 @@ static char *cleanup_separated_string(char *str)
 	}
 
 	for (start = dest = ptr; *ptr; ++ptr) {
-		if (*ptr == '\\') {
-			++ptr;
-			*dest++ = unescape_char(*ptr);
-			end = dest;
-		} else if (*ptr == '\'') {
-			inside_quotes = (1 - inside_quotes);
-		} else {
-			*dest++ = *ptr;
-			if (*ptr != ' ' || inside_quotes) {
+		char e;
+		int esc = 0;
+
+		if (*ptr == ESCAPE_META) {
+			if ((e = unescape_char(*(ptr+1))) != e) {
+				++ptr;
+				*dest++ = e;
 				end = dest;
+				esc++;
+			}
+		}
+		if (!esc) {
+			if (*ptr == '\'') {
+				inside_quotes = (1 - inside_quotes);
+			} else {
+				*dest++ = *ptr;
+				if (*ptr != ' ' || inside_quotes) {
+					end = dest;
+				}
 			}
 		}
 	}
@@ -1093,7 +1102,7 @@ static unsigned int separate_string_char_delim(char *buf, char delim, char **arr
 
 			case FIND_DELIM:
 				/* escaped characters are copied verbatim to the destination string */
-				if (*ptr == '\\') {
+				if (*ptr == ESCAPE_META) {
 					++ptr;
 				} else if (*ptr == '\'') {
 					inside_quotes = (1 - inside_quotes);
@@ -1143,7 +1152,7 @@ static unsigned int separate_string_blank_delim(char *buf, char **array, unsigne
 				break;
 
 			case FIND_DELIM:
-				if (*ptr == '\\') {
+				if (*ptr == ESCAPE_META) {
 					++ptr;
 				} else if (*ptr == '\'') {
 					inside_quotes = (1 - inside_quotes);