Revision: 5726 http://geany.svn.sourceforge.net/geany/?rev=5726&view=rev Author: ntrel Date: 2011-04-15 16:59:15 +0000 (Fri, 15 Apr 2011)
Log Message: ----------- Add function utils_string_replace() to replace in a fixed range. Remove utils_string_replace_helper() and update cursor marker code.
Modified Paths: -------------- trunk/ChangeLog trunk/src/editor.c trunk/src/utils.c trunk/src/utils.h
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2011-04-14 17:37:46 UTC (rev 5725) +++ trunk/ChangeLog 2011-04-15 16:59:15 UTC (rev 5726) @@ -1,3 +1,10 @@ +2011-04-15 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com> + + * src/utils.c, src/utils.h, src/editor.c: + Add function utils_string_replace() to replace in a fixed range. + Remove utils_string_replace_helper() and update cursor marker code. + + 2011-04-14 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
* src/editor.c:
Modified: trunk/src/editor.c =================================================================== --- trunk/src/editor.c 2011-04-14 17:37:46 UTC (rev 5725) +++ trunk/src/editor.c 2011-04-15 16:59:15 UTC (rev 5726) @@ -2436,10 +2436,8 @@
if (cursor_index >= 0) { - gint idx = utils_strpos(buf->str, geany_cursor_marker); + gint idx = utils_string_replace(buf, 0, -1, geany_cursor_marker, NULL);
- g_string_erase(buf, idx, strlen(geany_cursor_marker)); - sci_insert_text(sci, insert_pos, buf->str); sci_set_current_position(sci, insert_pos + idx, FALSE); } @@ -2530,7 +2528,7 @@ static gssize replace_cursor_markers(GeanyEditor *editor, GString *pattern, gsize indent_size) { gssize cur_index = -1; - gint i, pos, idx, nl_count = 0; + gint i, idx, nl_count = 0; GList *temp_list = NULL; gint cursor_steps, old_cursor = 0;
@@ -2540,15 +2538,13 @@ { /* replace every newline (up to next cursor) with EOL, * count newlines and update cursor_steps after */ - while ((pos = utils_strpos(pattern->str + idx, "\n")) != -1) + while (1) { - idx += pos; - if (idx >= cursor_steps) + idx = utils_string_replace(pattern, idx, cursor_steps, "\n", editor_get_eol_char(editor)); + if (idx == -1) break;
nl_count++; - g_string_erase(pattern, idx, 1); - g_string_insert(pattern, idx, editor_get_eol_char(editor)); idx += editor_get_eol_char_len(editor);
cursor_steps = utils_strpos(pattern->str, geany_cursor_marker); @@ -2571,11 +2567,12 @@ old_cursor = cursor_steps; } /* replace remaining \n which may occur after the last cursor */ - while ((pos = utils_strpos(pattern->str + idx, "\n")) != -1) + while (1) { - idx += pos; - g_string_erase(pattern, idx, 1); - g_string_insert(pattern, idx, editor_get_eol_char(editor)); + idx = utils_string_replace(pattern, idx, -1, "\n", editor_get_eol_char(editor)); + if (idx == -1) + break; + idx += editor_get_eol_char_len(editor); }
Modified: trunk/src/utils.c =================================================================== --- trunk/src/utils.c 2011-04-14 17:37:46 UTC (rev 5725) +++ trunk/src/utils.c 2011-04-15 16:59:15 UTC (rev 5726) @@ -1530,39 +1530,39 @@ }
-static guint utils_string_replace_helper(GString *haystack, const gchar *needle, - const gchar *replace, const guint max_replaces) +/* Replaces needle if in range. + * end can be -1 for haystack->len. + * returns: position of replaced text or -1. */ +gint utils_string_replace(GString *haystack, gint start, gint end, + const gchar *needle, const gchar *replace) { - const gchar *stack, *match; - guint ret = 0; - gssize pos; + gint pos;
- g_return_val_if_fail(haystack != NULL, 0); + g_return_val_if_fail(haystack != NULL, -1); if (haystack->len == 0) - return FALSE; - g_return_val_if_fail(NZV(needle), 0); + return -1;
- stack = haystack->str; - if (! (match = strstr(stack, needle))) - return 0; - do - { - pos = match - haystack->str; - g_string_erase(haystack, pos, strlen(needle)); + g_return_val_if_fail(start >= 0, -1); + if (start >= (gint)haystack->len) + return -1;
- /* make next search after removed matching text. - * (we have to be careful to only use haystack->str as its address may change) */ - stack = haystack->str + pos; + g_return_val_if_fail(NZV(needle), -1);
- if (G_LIKELY(replace)) - { - g_string_insert(haystack, pos, replace); - stack = haystack->str + pos + strlen(replace); /* skip past replacement */ - } - } - while (++ret != max_replaces && (match = strstr(stack, needle))); + if (end < 0) + end = haystack->len;
- return ret; + pos = utils_strpos(haystack->str + start, needle); + if (pos == -1) + return -1; + + pos += start; + if (pos >= end) + return -1; + + g_string_erase(haystack, pos, strlen(needle)); + if (G_LIKELY(replace)) + g_string_insert(haystack, pos, replace); + return pos; }
@@ -1579,7 +1579,21 @@ **/ guint utils_string_replace_all(GString *haystack, const gchar *needle, const gchar *replace) { - return utils_string_replace_helper(haystack, needle, replace, 0); + guint count = 0; + gint pos = 0; + + while (1) + { + pos = utils_string_replace(haystack, pos, -1, needle, replace); + + if (pos == -1) + break; + + if (replace) + pos += strlen(replace); + count++; + } + return count; }
@@ -1598,7 +1612,7 @@ */ guint utils_string_replace_first(GString *haystack, const gchar *needle, const gchar *replace) { - return utils_string_replace_helper(haystack, needle, replace, 1); + return utils_string_replace(haystack, 0, -1, needle, replace) == -1 ? 0 : 1; }
Modified: trunk/src/utils.h =================================================================== --- trunk/src/utils.h 2011-04-14 17:37:46 UTC (rev 5725) +++ trunk/src/utils.h 2011-04-15 16:59:15 UTC (rev 5726) @@ -168,6 +168,9 @@
gchar *utils_get_hostname(void);
+gint utils_string_replace(GString *haystack, gint start, gint end, + const gchar *needle, const gchar *replace); + guint utils_string_replace_all(GString *haystack, const gchar *needle, const gchar *replace);
guint utils_string_replace_first(GString *haystack, const gchar *needle, const gchar *replace);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.