SF.net SVN: geany:[5754] trunk

colombanw at users.sourceforge.net colombanw at xxxxx
Sat Apr 30 21:50:50 UTC 2011


Revision: 5754
          http://geany.svn.sourceforge.net/geany/?rev=5754&view=rev
Author:   colombanw
Date:     2011-04-30 21:50:50 +0000 (Sat, 30 Apr 2011)

Log Message:
-----------
Open the file in the msgwindow even if no line number is specified

Plugins may need to open a file from the message window without
specifying the line number, so allow messages of the form:

file[:line[...]]

For instance, all the following are now correctly parsed and the
corresponding file is opened:

/path/to/file
/path/to/file:line
/path/to/file: something not a line
/path/to/file:line: something
/path/to/file:line something

etc.

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/msgwindow.c

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2011-04-30 21:50:37 UTC (rev 5753)
+++ trunk/ChangeLog	2011-04-30 21:50:50 UTC (rev 5754)
@@ -6,6 +6,8 @@
  * src/search.c:
    Use project patterns in the FIF dialog (based on a patch
    by Jiří Techet, thanks).
+ * src/msgwindow.c:
+   Open the file in the msgwindow even if no line number is specified.
 
 
 2011-04-30  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>

Modified: trunk/src/msgwindow.c
===================================================================
--- trunk/src/msgwindow.c	2011-04-30 21:50:37 UTC (rev 5753)
+++ trunk/src/msgwindow.c	2011-04-30 21:50:50 UTC (rev 5754)
@@ -71,7 +71,6 @@
 static void prepare_status_tree_view(void);
 static void prepare_compiler_tree_view(void);
 static GtkWidget *create_message_popup_menu(gint type);
-static void msgwin_parse_grep_line(const gchar *string, gchar **filename, gint *line);
 static gboolean on_msgwin_button_press_event(GtkWidget *widget, GdkEventButton *event,
 																			gpointer user_data);
 static void on_scribble_populate(GtkTextView *textview, GtkMenu *arg1, gpointer user_data);
@@ -996,6 +995,51 @@
 }
 
 
+/* Tries to parse strings of the file:line style, allowing line field to be missing
+ * * filename is filled with the filename, should be freed
+ * * line is filled with the line number or -1 */
+static void msgwin_parse_generic_line(const gchar *string, gchar **filename, gint *line)
+{
+	gchar **fields;
+	gboolean incertain = TRUE; /* whether we're reasonably certain of the result */
+
+	*filename = NULL;
+	*line = -1;
+
+	fields = g_strsplit(string, ":", 2);
+	/* extract the filename */
+	if (fields[0] != NULL)
+	{
+		*filename = g_strdup(fields[0]);
+		if (msgwindow.messages_dir != NULL)
+			make_absolute(filename, msgwindow.messages_dir);
+
+		/* now the line */
+		if (fields[1] != NULL)
+		{
+			gchar *end;
+
+			*line = strtol(fields[1], &end, 10);
+			if (end == fields[1])
+				*line = -1;
+			else if (*end == ':' || g_ascii_isspace(*end))
+			{	/* if we have a blank or a separator right after the number, assume we really got a
+				 * filename (it's a grep-like syntax) */
+				incertain = FALSE;
+			}
+		}
+
+		/* if we aren't sure we got a supposedly correct filename, check it */
+		if (incertain && ! g_file_test(*filename, G_FILE_TEST_EXISTS))
+		{
+			setptr(*filename, NULL);
+			*line = -1;
+		}
+	}
+	g_strfreev(fields);
+}
+
+
 gboolean msgwin_goto_messages_file_line(guint keyval)
 {
 	GtkTreeIter iter;
@@ -1023,14 +1067,15 @@
 		{
 			gchar *filename;
 
-			msgwin_parse_grep_line(string, &filename, &line);
-			if (filename != NULL && line > -1)
+			/* try with a file:line parsing */
+			msgwin_parse_generic_line(string, &filename, &line);
+			if (filename != NULL)
 			{
 				/* use document_open_file to find an already open file, or open it in place */
 				doc = document_open_file(filename, FALSE, NULL, NULL);
 				if (doc != NULL)
 				{
-					ret = navqueue_goto_line(old_doc, doc, line);
+					ret = (line < 0) ? TRUE : navqueue_goto_line(old_doc, doc, line);
 					if (ret && ui_is_keyval_enter_or_return(keyval))
 						gtk_widget_grab_focus(GTK_WIDGET(doc->editor->sci));
 				}
@@ -1043,36 +1088,6 @@
 }
 
 
-/* Try to parse the file and line number for string and when something useful is
- * found, store the line number in *line and the relevant file with the error in
- * *filename.
- * *line will be -1 if no error was found in string.
- * *filename must be freed unless NULL. */
-static void msgwin_parse_grep_line(const gchar *string, gchar **filename, gint *line)
-{
-	ParseData data;
-
-	*filename = NULL;
-	*line = -1;
-
-	if (string == NULL)
-		return;
-
-	/* conflict:3:conflicting types for `foo' */
-	data.string = string;
-	data.pattern = ":";
-	data.min_fields = 3;
-	data.line_idx = 1;
-	data.file_idx = 0;
-
-	parse_file_line(&data, filename, line);
-
-	/* FIF dir should be set, but a plugin might not have set it */
-	if (msgwindow.messages_dir != NULL)
-		make_absolute(filename, msgwindow.messages_dir);
-}
-
-
 static gboolean on_msgwin_button_press_event(GtkWidget *widget, GdkEventButton *event,
 											 gpointer user_data)
 {


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