SF.net SVN: geany: [586] trunk

eht16 at users.sourceforge.net eht16 at xxxxx
Wed Jul 19 11:31:20 UTC 2006


Revision: 586
Author:   eht16
Date:     2006-07-19 04:30:59 -0700 (Wed, 19 Jul 2006)
ViewCVS:  http://svn.sourceforge.net/geany/?rev=586&view=rev

Log Message:
-----------
Improved replacing escape sequences in Find and Replace dialog (thanks to Stefan Oltmanns).

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/THANKS
    trunk/src/callbacks.c
    trunk/src/dialogs.c
    trunk/src/utils.c
    trunk/src/utils.h
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-07-19 10:55:11 UTC (rev 585)
+++ trunk/ChangeLog	2006-07-19 11:30:59 UTC (rev 586)
@@ -3,6 +3,9 @@
  * src/highlighting.c, data/filetypes.common:
    Highlighting of current line can be disabled.
  * geany.glade, src/interface.c: Fixed typo.
+ * src/utils.c, src/callbacks.c, src/dialogs.c:
+   Improved replacing escape sequences in Find and Replace dialog
+   (thanks to Stefan Oltmanns).
 
 
 2006-07-18  Nick Treleaven  <nick.treleaven at btinternet.com>

Modified: trunk/THANKS
===================================================================
--- trunk/THANKS	2006-07-19 10:55:11 UTC (rev 585)
+++ trunk/THANKS	2006-07-19 11:30:59 UTC (rev 586)
@@ -7,8 +7,8 @@
 --------------------------
 These people have contributed to Geany by testing the software,
 reporting problems, sending patches and making useful suggestions.
-Frank Lanitz <frank at partysoke.de>
-Christoph Berg <Christoph.Berg at kpm-sport.de>
+Frank Lanitz <frank at partysoke.de> - heavy testing
+Christoph Berg <Christoph.Berg at kpm-sport.de> - testing and patch for filetype D
 Nick Treleaven <nick.treleaven at btinternet.com> - many patches
 Saleem Abdulrasool <compnerd at gentoo.org> - vte autoconf patch
 Marko Peric <cragwolf at gmail.com>
@@ -17,8 +17,8 @@
 Kristoffer A. Tjernås <kt at nupi.no>
 Tamim <amitamim at gmail.com>
 Kevin Ellwood <kellwood at ameritech.net>
+Stefan Oltmanns <stefan.oltmanns at abi2006.gymnasium-achim.de> - escape sequences patch
 
-
 Translators:
 ----------------------------------
 These people have translated Geany to foreign languages.

Modified: trunk/src/callbacks.c
===================================================================
--- trunk/src/callbacks.c	2006-07-19 10:55:11 UTC (rev 585)
+++ trunk/src/callbacks.c	2006-07-19 11:30:59 UTC (rev 586)
@@ -1864,18 +1864,13 @@
 
 		g_free(app->search_text);
 		app->search_text = g_strdup(gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(user_data)))));
-		if (strlen(app->search_text) == 0)
+		if (strlen(app->search_text) == 0 ||
+			(search_replace_escape && ! utils_str_replace_escape(app->search_text)))
 		{
 			utils_beep();
 			gtk_widget_grab_focus(GTK_WIDGET(GTK_BIN(lookup_widget(app->find_dialog, "entry"))->child));
 			return;
 		}
-		else if (search_replace_escape)
-		{
-			app->search_text = utils_str_replace(app->search_text, "\\n", "\n");
-			app->search_text = utils_str_replace(app->search_text, "\\r", "\r");
-			app->search_text = utils_str_replace(app->search_text, "\\t", "\t");
-		}
 		gtk_widget_hide(app->find_dialog);
 
 		gtk_combo_box_prepend_text(GTK_COMBO_BOX(user_data), app->search_text);
@@ -1952,18 +1947,15 @@
 		return;
 	}
 
-
 	gtk_combo_box_prepend_text(GTK_COMBO_BOX(entry_find), find);
 	gtk_combo_box_prepend_text(GTK_COMBO_BOX(entry_replace), replace);
 
-	if (search_replace_escape_re)
+	if (search_replace_escape_re &&
+		(! utils_str_replace_escape(find) || ! utils_str_replace_escape(replace)))
 	{
-		find = utils_str_replace(find, "\\n", "\n");
-		find = utils_str_replace(find, "\\r", "\r");
-		find = utils_str_replace(find, "\\t", "\t");
-		replace = utils_str_replace(replace, "\\n", "\n");
-		replace = utils_str_replace(replace, "\\r", "\r");
-		replace = utils_str_replace(replace, "\\t", "\t");
+		utils_beep();
+		gtk_widget_grab_focus(GTK_WIDGET(GTK_BIN(lookup_widget(app->replace_dialog, "entry_find"))->child));
+		return;
 	}
 
 	search_flags_re = (fl1 ? SCFIND_MATCHCASE : 0) |

Modified: trunk/src/dialogs.c
===================================================================
--- trunk/src/dialogs.c	2006-07-19 10:55:11 UTC (rev 585)
+++ trunk/src/dialogs.c	2006-07-19 11:30:59 UTC (rev 586)
@@ -865,7 +865,8 @@
 						gtk_widget_ref(checkbox6), (GDestroyNotify)gtk_widget_unref);
 		gtk_button_set_focus_on_click(GTK_BUTTON(checkbox6), FALSE);
 		gtk_tooltips_set_tip(tooltips, checkbox6,
-			_("Replace \\t, \\n and \\r with the corresponding control characters."), NULL);
+			_("Replace \\\\, \\t, \\n, \\r and \\uXXXX (Unicode chararacters) with the "
+			  "corresponding control characters."), NULL);
 
 		checkbox4 = gtk_check_button_new_with_mnemonic(_("_Search backwards"));
 		g_object_set_data_full(G_OBJECT(app->find_dialog), "check_back",
@@ -996,7 +997,8 @@
 						gtk_widget_ref(checkbox7), (GDestroyNotify)gtk_widget_unref);
 		gtk_button_set_focus_on_click(GTK_BUTTON(checkbox7), FALSE);
 		gtk_tooltips_set_tip(tooltips, checkbox7,
-			_("Replace \\t, \\n and \\r with the corresponding control characters."), NULL);
+			_("Replace \\\\, \\t, \\n, \\r and \\uXXXX (Unicode chararacters) with the "
+			  "corresponding control characters."), NULL);
 
 		checkbox4 = gtk_check_button_new_with_mnemonic(_("_Search backwards"));
 		g_object_set_data_full(G_OBJECT(app->replace_dialog), "check_back",

Modified: trunk/src/utils.c
===================================================================
--- trunk/src/utils.c	2006-07-19 10:55:11 UTC (rev 585)
+++ trunk/src/utils.c	2006-07-19 11:30:59 UTC (rev 586)
@@ -2428,3 +2428,134 @@
 	return result;
 }
 
+
+/* Contributed by Stefan Oltmanns, thanks.
+ * Replaces \\, \r, \n, \t and \uXXX by their real counterparts */
+gboolean utils_str_replace_escape(gchar *string)
+{
+	gint i, j;
+	guint unicodechar;
+
+	j = 0;
+	for (i = 0; i < strlen(string); i++)
+	{
+		if (string[i]=='\\')
+		{
+			if (i++ >= strlen(string))
+			{
+				return FALSE;
+			}
+			switch (string[i])
+			{
+				case '\\':
+					string[j] = '\\';
+					break;
+				case 'n':
+					string[j] = '\n';
+					break;
+				case 'r':
+					string[j] = '\r';
+					break;
+				case 't':
+					string[j] = '\t';
+					break;
+#if 0
+				case 'x': // Warning: May produce illegal utf-8 string!
+					i += 2;
+					if (i >= strlen(string))
+					{
+						return FALSE;
+					}
+					if (isdigit(string[i-1])) string[j] = string[i-1]-48;
+					else if (isxdigit(string[i-1])) string[j] = tolower(string[i-1])-87;
+					else return FALSE;
+					string[j] <<= 4;
+					if (isdigit(string[i])) string[j] |= string[i]-48;
+					else if (isxdigit(string[i])) string[j] |= tolower(string[i])-87;
+					else return FALSE;
+					break;
+#endif
+				case 'u':
+					i += 2;
+					if (i >= strlen(string))
+					{
+						return FALSE;
+					}
+					if (isdigit(string[i-1])) unicodechar = string[i-1]-48;
+					else if (isxdigit(string[i-1])) unicodechar = tolower(string[i-1])-87;
+					else return FALSE;
+					unicodechar <<= 4;
+					if (isdigit(string[i])) unicodechar |= string[i]-48;
+					else if (isxdigit(string[i])) unicodechar |= tolower(string[i])-87;
+					else return FALSE;
+					if (((i+2) < strlen(string)) && (isdigit(string[i+1]) || isxdigit(string[i+1]))
+						&& (isdigit(string[i+2]) || isxdigit(string[i+2])))
+					{
+						i += 2;
+						unicodechar <<= 8;
+						if (isdigit(string[i-1])) unicodechar |= ((string[i-1]-48)<<4);
+						else unicodechar |= ((tolower(string[i-1])-87) << 4);
+						if (isdigit(string[i])) unicodechar |= string[i]-48;
+						else unicodechar |= tolower(string[i])-87;
+					}
+					if (((i+2) < strlen(string)) && (isdigit(string[i+1]) || isxdigit(string[i+1]))
+						&& (isdigit(string[i+2]) || isxdigit(string[i+2])))
+					{
+						i += 2;
+						unicodechar <<= 8;
+						if (isdigit(string[i-1])) unicodechar |= ((string[i-1]-48) << 4);
+						else unicodechar |= ((tolower(string[i-1])-87) << 4);
+						if (isdigit(string[i])) unicodechar |= string[i]-48;
+						else unicodechar |= tolower(string[i])-87;
+					}
+					if(unicodechar < 0x80)
+					{
+						string[j] = unicodechar;
+					}
+					else if (unicodechar < 0x800)
+					{
+						string[j] = (unsigned char) ((unicodechar >> 6)| 0xC0);
+						j++;
+						string[j] = (unsigned char) ((unicodechar & 0x3F)| 0x80);
+					}
+					else if (unicodechar < 0x10000)
+					{
+						string[j] = (unsigned char) ((unicodechar >> 12) | 0xE0);
+						j++;
+						string[j] = (unsigned char) (((unicodechar >> 6) & 0x3F) | 0x80);
+						j++;
+						string[j] = (unsigned char) ((unicodechar & 0x3F) | 0x80);
+					}
+					else if (unicodechar < 0x110000) // more chars are not allowed in unicode
+					{
+						string[j] = (unsigned char) ((unicodechar >> 18) | 0xF0);
+						j++;
+						string[j] = (unsigned char) (((unicodechar >> 12) & 0x3F) | 0x80);
+						j++;
+						string[j] = (unsigned char) (((unicodechar >> 6) & 0x3F) | 0x80);
+						j++;
+						string[j] = (unsigned char) ((unicodechar & 0x3F) | 0x80);
+					}
+					else
+					{
+						return FALSE;
+					}
+					break;
+				default:
+					return FALSE;
+			}
+		}
+		else
+		{
+			string[j] = string[i];
+		}
+		j++;
+	}
+	while (j < i)
+	{
+		string[j] = 0;
+		j++;
+	}
+	return TRUE;
+}
+

Modified: trunk/src/utils.h
===================================================================
--- trunk/src/utils.h	2006-07-19 10:55:11 UTC (rev 585)
+++ trunk/src/utils.h	2006-07-19 11:30:59 UTC (rev 586)
@@ -218,4 +218,8 @@
 
 gchar **utils_read_file_in_array(const gchar *filename);
 
+/* Contributed by Stefan Oltmanns, thanks.
+ * Replaces \\, \r, \n, \t and \uXXX by their real counterparts */
+gboolean utils_str_replace_escape(gchar *string);
+
 #endif


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