Revision: 1739 http://geany.svn.sourceforge.net/geany/?rev=1739&view=rev Author: ntrel Date: 2007-07-24 08:34:35 -0700 (Tue, 24 Jul 2007)
Log Message: ----------- Fix hang when replacing all '[ ]*' regex matches (closes #1757748).
Modified Paths: -------------- trunk/ChangeLog trunk/src/document.c
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2007-07-24 11:46:03 UTC (rev 1738) +++ trunk/ChangeLog 2007-07-24 15:34:35 UTC (rev 1739) @@ -3,6 +3,8 @@ * src/plugindata.h, src/plugins.c: Apply patch from Jeff Pohlmeyer to add plugin functions for getting a file list and modifying scintilla text selections (thanks). + * src/document.c: + Fix hang when replacing all '[ ]*' regex matches (closes #1757748).
2007-07-24 Enrico Tröger enrico.troeger@uvena.de
Modified: trunk/src/document.c =================================================================== --- trunk/src/document.c 2007-07-24 11:46:03 UTC (rev 1738) +++ trunk/src/document.c 2007-07-24 15:34:35 UTC (rev 1739) @@ -1329,24 +1329,28 @@ document_replace_range(gint idx, const gchar *find_text, const gchar *replace_text, gint flags, gint start, gint end, gboolean scroll_to_match, gint *new_range_end) { - gint search_pos; gint count = 0; - gint find_len = 0, replace_len = 0; struct TextToFind ttf; + ScintillaObject *sci;
if (new_range_end != NULL) *new_range_end = -1; g_return_val_if_fail(find_text != NULL && replace_text != NULL, 0); if (idx == -1 || ! *find_text || doc_list[idx].readonly) return 0;
- sci_start_undo_action(doc_list[idx].sci); + sci = doc_list[idx].sci; + + sci_start_undo_action(sci); ttf.chrg.cpMin = start; ttf.chrg.cpMax = end; ttf.lpstrText = (gchar*)find_text;
while (TRUE) { - search_pos = sci_find_text(doc_list[idx].sci, flags, &ttf); + gint search_pos; + gint find_len = 0, replace_len = 0; + + search_pos = sci_find_text(sci, flags, &ttf); find_len = ttf.chrgText.cpMax - ttf.chrgText.cpMin; if (search_pos == -1) break; // no more matches @@ -1357,29 +1361,39 @@ break; // found text is partly out of range else { - sci_target_start(doc_list[idx].sci, search_pos); - sci_target_end(doc_list[idx].sci, search_pos + find_len); - replace_len = sci_target_replace(doc_list[idx].sci, replace_text, + gint movepastEOL = 0; + + sci_target_start(sci, search_pos); + sci_target_end(sci, search_pos + find_len); + + if (find_len <= 0) + { + gchar chNext = sci_get_char_at(sci, SSM(sci, SCI_GETTARGETEND, 0, 0)); + if (chNext == '\r' || chNext == '\n') { + movepastEOL = 1; + } + } + replace_len = sci_target_replace(sci, replace_text, flags & SCFIND_REGEXP); count++; if (search_pos == end) break; // Prevent hang when replacing regex $
// make the next search start after the replaced text - start = search_pos + replace_len; - if (find_len == 0 && replace_len == 0) - start++; // skip past ^ or $ for regexes (prevents rematching) + start = search_pos + replace_len + movepastEOL; + if (find_len == 0) + start = SSM(sci, SCI_POSITIONAFTER, start, 0); // prevent '[ ]*' regex rematching part of replaced text ttf.chrg.cpMin = start; end += replace_len - find_len; // update end of range now text has changed ttf.chrg.cpMax = end; } } - sci_end_undo_action(doc_list[idx].sci); + sci_end_undo_action(sci);
if (count > 0) { // scroll last match in view, will destroy the existing selection if (scroll_to_match) - sci_goto_pos(doc_list[idx].sci, ttf.chrg.cpMin, TRUE); + sci_goto_pos(sci, ttf.chrg.cpMin, TRUE);
if (new_range_end != NULL) *new_range_end = end;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.