SF.net SVN: geany:[4705] branches/gnu-regex
ntrel at users.sourceforge.net
ntrel at xxxxx
Thu Feb 25 18:30:43 UTC 2010
Revision: 4705
http://geany.svn.sourceforge.net/geany/?rev=4705&view=rev
Author: ntrel
Date: 2010-02-25 18:30:43 +0000 (Thu, 25 Feb 2010)
Log Message:
-----------
Implement single POSIX regex replacement - escape replacements are
done with utils_str_replace_escape().
Warning: regex backreference replacement is still to do.
Make utils_str_replace_escape() accept unnecessary escapes (e.g.
'\e' goes to 'e').
Modified Paths:
--------------
branches/gnu-regex/ChangeLog
branches/gnu-regex/src/document.c
branches/gnu-regex/src/utils.c
Modified: branches/gnu-regex/ChangeLog
===================================================================
--- branches/gnu-regex/ChangeLog 2010-02-24 15:27:12 UTC (rev 4704)
+++ branches/gnu-regex/ChangeLog 2010-02-25 18:30:43 UTC (rev 4705)
@@ -1,3 +1,13 @@
+2010-02-25 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
+
+ * src/utils.c, src/document.c:
+ Implement single POSIX regex replacement - escape replacements are
+ done with utils_str_replace_escape().
+ Warning: regex backreference replacement is still to do.
+ Make utils_str_replace_escape() accept unnecessary escapes (e.g.
+ '\e' goes to 'e').
+
+
2010-02-24 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
* src/keybindings.c, doc/geany.txt, doc/geany.html:
Modified: branches/gnu-regex/src/document.c
===================================================================
--- branches/gnu-regex/src/document.c 2010-02-24 15:27:12 UTC (rev 4704)
+++ branches/gnu-regex/src/document.c 2010-02-25 18:30:43 UTC (rev 4705)
@@ -2063,6 +2063,59 @@
}
+static gint geany_replace_target(ScintillaObject *sci, const gchar *replace_text,
+ gboolean regex)
+{
+ GString *str;
+ gint ret = 0;
+ gint i = 0;
+
+ if (!regex)
+ return sci_replace_target(sci, replace_text, FALSE);
+
+ str = g_string_new(replace_text);
+ while (str->str[i])
+ {
+ gchar *ptr = &str->str[i];
+ gchar *grp;
+ gchar c;
+
+ if (ptr[0] != '\\')
+ {
+ i++;
+ continue;
+ }
+ if (ptr[1] == '\\')
+ {
+ /* backslash escape, leave for later */
+ i += 2;
+ continue;
+ }
+ c = ptr[1];
+ if (!isdigit(c))
+ {
+ /* unnecessary escape */
+ i += 2;
+ continue;
+ }
+ /* digit escape */
+ g_string_erase(str, i, 2);
+ grp = "{group}";
+ g_string_insert(str, i, grp);
+ i += strlen(grp);
+ }
+ /* now fix backslash, tabs, etc */
+ if (!utils_str_replace_escape(str->str))
+ {
+ /* 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;
+}
+
+
/* Replaces the selection if it matches, otherwise just finds the next match.
* Returns: start of replaced text, or -1 if no replacement was made */
gint document_replace_text(GeanyDocument *doc, const gchar *find_text, const gchar *replace_text,
@@ -2104,7 +2157,7 @@
gint replace_len;
/* search next/prev will select matching text, which we use to set the replace target */
sci_target_from_selection(doc->editor->sci);
- replace_len = sci_replace_target(doc->editor->sci, replace_text, flags & SCFIND_REGEXP);
+ replace_len = geany_replace_target(doc->editor->sci, replace_text, flags & SCFIND_REGEXP);
/* select the replacement - find text will skip past the selected text */
sci_set_selection_start(doc->editor->sci, search_pos);
sci_set_selection_end(doc->editor->sci, search_pos + replace_len);
Modified: branches/gnu-regex/src/utils.c
===================================================================
--- branches/gnu-regex/src/utils.c 2010-02-24 15:27:12 UTC (rev 4704)
+++ branches/gnu-regex/src/utils.c 2010-02-25 18:30:43 UTC (rev 4705)
@@ -1094,6 +1094,7 @@
break;
#endif
case 'u':
+ {
i += 2;
if (i >= strlen(string))
{
@@ -1159,8 +1160,10 @@
return FALSE;
}
break;
+ }
default:
- return FALSE;
+ /* unnecessary escapes are allowed */
+ string[j] = string[i];
}
}
else
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