Revision: 4706 http://geany.svn.sourceforge.net/geany/?rev=4706&view=rev Author: ntrel Date: 2010-02-26 16:08:34 +0000 (Fri, 26 Feb 2010)
Log Message: ----------- Implement regex backreference replacement for \0 (whole match) and groups \1 to \9.
Modified Paths: -------------- branches/gnu-regex/ChangeLog branches/gnu-regex/src/document.c
Modified: branches/gnu-regex/ChangeLog =================================================================== --- branches/gnu-regex/ChangeLog 2010-02-25 18:30:43 UTC (rev 4705) +++ branches/gnu-regex/ChangeLog 2010-02-26 16:08:34 UTC (rev 4706) @@ -1,3 +1,10 @@ +2010-02-26 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com> + + * src/document.c: + Implement regex backreference replacement for \0 (whole match) and + groups \1 to \9. + + 2010-02-25 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
* src/utils.c, src/document.c:
Modified: branches/gnu-regex/src/document.c =================================================================== --- branches/gnu-regex/src/document.c 2010-02-25 18:30:43 UTC (rev 4705) +++ branches/gnu-regex/src/document.c 2010-02-26 16:08:34 UTC (rev 4706) @@ -1952,24 +1952,38 @@ }
-static gint find_regex(ScintillaObject *sci, guint pos, regex_t *regex, regmatch_t *match) +/* groups that don't exist are handled OK as len = end - start = (-1) - (-1) = 0 */ +static gchar *get_regex_match_string(const gchar *text, regmatch_t *pmatch, gint match_idx) { + return g_strndup(&text[pmatch[match_idx].rm_so], + pmatch[match_idx].rm_eo - pmatch[match_idx].rm_so); +} + + +static regmatch_t regex_matches[10]; +/* All matching text from regex_matches[0].rm_so to regex_matches[0].rm_eo */ +static gchar *regex_match_text = NULL; + +static gint find_regex(ScintillaObject *sci, guint pos, regex_t *regex) +{ const gchar *text;
g_return_val_if_fail(pos <= (guint)sci_get_length(sci), FALSE);
text = (void*)scintilla_send_message(sci, SCI_GETCHARACTERPOINTER, 0, 0); text += pos; - if (regexec(regex, text, 1, match, 0) == 0) - return match->rm_so + pos; - + if (regexec(regex, text, G_N_ELEMENTS(regex_matches), regex_matches, 0) == 0) + { + setptr(regex_match_text, get_regex_match_string(text, regex_matches, 0)); + return regex_matches[0].rm_so + pos; + } + setptr(regex_match_text, NULL); return -1; }
static gint geany_search_next(ScintillaObject *sci, const gchar *str, gint flags) { - regmatch_t match; regex_t regex; gint ret = -1; gint pos; @@ -1981,9 +1995,9 @@ return -1;
pos = sci_get_current_position(sci); - ret = find_regex(sci, pos, ®ex, &match); + ret = find_regex(sci, pos, ®ex); if (ret >= 0) - sci_set_selection(sci, ret, match.rm_eo + pos); + sci_set_selection(sci, ret, regex_matches[0].rm_eo + pos);
regfree(®ex); return ret; @@ -2100,9 +2114,12 @@ } /* digit escape */ g_string_erase(str, i, 2); - grp = "{group}"; + /* fix match offsets by subtracting index of whole match start from the string */ + grp = get_regex_match_string(regex_match_text - regex_matches[0].rm_so, + regex_matches, c - '0'); g_string_insert(str, i, grp); i += strlen(grp); + g_free(grp); } /* now fix backslash, tabs, etc */ if (!utils_str_replace_escape(str->str))
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.