SF.net SVN: geany:[4718] branches/gnu-regex

ntrel at users.sourceforge.net ntrel at xxxxx
Mon Mar 1 18:28:57 UTC 2010


Revision: 4718
          http://geany.svn.sourceforge.net/geany/?rev=4718&view=rev
Author:   ntrel
Date:     2010-03-01 18:28:57 +0000 (Mon, 01 Mar 2010)

Log Message:
-----------
Fix not replacing escapes within a backreference match.

Modified Paths:
--------------
    branches/gnu-regex/ChangeLog
    branches/gnu-regex/src/document.c
    branches/gnu-regex/src/search.c
    branches/gnu-regex/src/utils.c

Modified: branches/gnu-regex/ChangeLog
===================================================================
--- branches/gnu-regex/ChangeLog	2010-03-01 18:16:28 UTC (rev 4717)
+++ branches/gnu-regex/ChangeLog	2010-03-01 18:28:57 UTC (rev 4718)
@@ -4,6 +4,8 @@
    Make regex search imply replacing escaped chars.
  * src/utils.c, src/utils.h, src/search.c, src/document.c:
    Fix regex search for '\\'.
+ * src/utils.c, src/search.c, src/document.c:
+   Fix not replacing escapes within a backreference match.
 
 
 2010-02-26  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>

Modified: branches/gnu-regex/src/document.c
===================================================================
--- branches/gnu-regex/src/document.c	2010-03-01 18:16:28 UTC (rev 4717)
+++ branches/gnu-regex/src/document.c	2010-03-01 18:28:57 UTC (rev 4718)
@@ -2099,17 +2099,12 @@
 			i++;
 			continue;
 		}
-		if (ptr[1] == '\\')
-		{
-			/* backslash escape, leave for later */
-			i += 2;
-			continue;
-		}
 		c = ptr[1];
-		if (!isdigit(c))
+		/* backslash or unnecessary escape */
+		if (c == '\\' || !isdigit(c))
 		{
-			/* unnecessary escape */
-			i += 2;
+			g_string_erase(str, i, 1);
+			i++;
 			continue;
 		}
 		/* digit escape */
@@ -2121,12 +2116,6 @@
 		i += strlen(grp);
 		g_free(grp);
 	}
-	/* now fix backslash, tabs, etc */
-	if (!utils_str_replace_escape(str->str, FALSE))
-	{
-		/* replace_text should already be checked as valid */
-		g_assert_not_reached();
-	}
 	ret = sci_replace_target(sci, str->str, FALSE);
 	g_string_free(str, TRUE);
 	return ret;

Modified: branches/gnu-regex/src/search.c
===================================================================
--- branches/gnu-regex/src/search.c	2010-03-01 18:16:28 UTC (rev 4717)
+++ branches/gnu-regex/src/search.c	2010-03-01 18:28:57 UTC (rev 4718)
@@ -1216,9 +1216,8 @@
 	}
 	if (search_flags_re & SCFIND_REGEXP)
 	{
-		/* we don't want to interpret escapes for replace string yet, so check a copy */
 		if (! utils_str_replace_escape(find, TRUE) ||
-			! utils_str_replace_escape(utils_strdupa(replace), TRUE))
+			! utils_str_replace_escape(replace, TRUE))
 			goto fail;
 	}
 	else if (search_replace_escape_re)

Modified: branches/gnu-regex/src/utils.c
===================================================================
--- branches/gnu-regex/src/utils.c	2010-03-01 18:16:28 UTC (rev 4717)
+++ branches/gnu-regex/src/utils.c	2010-03-01 18:28:57 UTC (rev 4718)
@@ -1045,7 +1045,8 @@
 
 
 /* Contributed by Stefan Oltmanns, thanks.
- * Replaces \\, \r, \n, \t and \uXXX by their real counterparts */
+ * Replaces \\, \r, \n, \t and \uXXX by their real counterparts.
+ * keep_backslash is used for regex strings to leave '\\' and '\?' in place */
 gboolean utils_str_replace_escape(gchar *string, gboolean keep_backslash)
 {
 	gsize i, j, len;
@@ -1165,6 +1166,8 @@
 				}
 				default:
 					/* unnecessary escapes are allowed */
+					if (keep_backslash)
+						string[j++] = '\\';
 					string[j] = string[i];
 			}
 		}


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Commits mailing list