SF.net SVN: geany: [441] trunk

eht16 at users.sourceforge.net eht16 at xxxxx
Tue Jun 13 15:49:24 UTC 2006


Revision: 441
Author:   eht16
Date:     2006-06-13 08:49:19 -0700 (Tue, 13 Jun 2006)
ViewCVS:  http://svn.sourceforge.net/geany/?rev=441&view=rev

Log Message:
-----------
Improved and finished switching between files when clicking on compiler error messages.

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/utils.c
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-06-13 14:51:43 UTC (rev 440)
+++ trunk/ChangeLog	2006-06-13 15:49:19 UTC (rev 441)
@@ -4,6 +4,8 @@
                     geany.xsl to EXTRA_DIST.
  * doc/geany.docbook: Removed appendix for keybindings, updated section
                       keybindings to new action identifiers.
+ * src/utils.c: Improved and finished switching between files when
+                clicking on compiler error messages.
 
 
 2006-06-12  Enrico Troeger  <enrico.troeger at uvena.de>

Modified: trunk/src/utils.c
===================================================================
--- trunk/src/utils.c	2006-06-13 14:51:43 UTC (rev 440)
+++ trunk/src/utils.c	2006-06-13 15:49:19 UTC (rev 441)
@@ -2289,18 +2289,26 @@
  * and when something useful is found, it jumps to file and scrolls to the line  */
 void utils_parse_compiler_error_line(const gchar *string)
 {
-	/// TODO remove the assignment
 	gint idx = document_get_cur_idx();
-	gint idx_of_error_file = document_get_cur_idx();
+	gint idx_of_error_file;
 	gint line = -1;
-
+	gchar *end = NULL;
+	gchar *path;
+	gchar *filename;
+	gchar **fields;
+	gchar *pattern;			// pattern to split the error message into some fields
+	guint field_min_len;	// used to detect errors after parsing
+	guint field_idx_line;	// idx of the field where the line is
+	guint field_idx_file;	// idx of the field where the filename is
+	
+	
 	if (string == NULL || ! doc_list[app->cur_idx].is_valid ||
 		doc_list[app->cur_idx].file_type == NULL)
 		return;
 
-	// first get the line
 	switch (doc_list[app->cur_idx].file_type->id)
 	{
+		// only gcc is supported, I don't know any other C(++) compilers and their error messages
 		case GEANY_FILETYPES_C:
 		case GEANY_FILETYPES_CPP:
 		case GEANY_FILETYPES_RUBY:
@@ -2308,130 +2316,95 @@
 		{
 			// empty.h:4: Warnung: type defaults to `int' in declaration of `foo'
 			// empty.c:21: error: conflicting types for `foo'
-			gchar **fields = g_strsplit(string, ":", 3);
-			gchar *end = NULL;
-			gchar *path;
-			gchar *filename;
-
-			// parse the line
-			if (g_strv_length(fields) < 3 || fields[0] == NULL || fields[1] == NULL)
-			{
-				g_strfreev(fields);
-				return;
-			}
-
-			/// FIXME this is C99
-			line = strtol(fields[1], &end, 10);
-
-			// if the line could not be read, line is 0 and an error occurred, so we leave
-			if (fields[1] == end)
-			{
-				g_strfreev(fields);
-				return;
-			}
-
-			// get the basename of the built file to get the path to look for other files
-			path = g_path_get_dirname(doc_list[app->cur_idx].file_name);
-			filename = g_strconcat(path, G_DIR_SEPARATOR_S, fields[0], NULL);
-
-			// use document_open_file to find an already opened file, or to open it in place
-			idx_of_error_file = document_open_file(-1, filename, 0, FALSE, NULL);
-
-			g_free(path);
-			g_free(filename);
-
-			if (idx_of_error_file == -1 || ! doc_list[idx_of_error_file].is_valid)
-			{
-				g_strfreev(fields);
-				return;
-			}
-
+			pattern = ":";
+			field_min_len = 3;
+			field_idx_line = 1;
+			field_idx_file = 0;
 			break;
 		}
-		/// TODO parse also the file where the error occurred like above
-		// the error output of python, perl and php -l on errors equals in "line xx", so they
-		// are "compatible"
 		case GEANY_FILETYPES_PHP:
+		{
+			// Parse error: parse error, unexpected T_CASE in brace_bug.php on line 3
+			pattern = " ";
+			field_min_len = 11;
+			field_idx_line = 10;
+			field_idx_file = 7;
+			break;
+		}
 		case GEANY_FILETYPES_PERL:
+		{
+			// syntax error at test.pl line 7, near "{
+			pattern = " ";
+			field_min_len = 6;
+			field_idx_line = 5;
+			field_idx_file = 3;
+			break;
+		}
+		// the error output of python and tcl equals
 		case GEANY_FILETYPES_TCL:
 		case GEANY_FILETYPES_PYTHON:
-		{	// File "HyperArch.py", line 37, in ?
-			gchar *space = strchr(string, ' ');
-
-			while (space != NULL && strncmp(space, " line ", 6) != 0)
-			{
-				space = strchr(space+1, ' ');
-			}
-			if (space == NULL) return;
-
-			// this comparison may be unnecessary, but I think it is safer
-			if (strncmp(space, " line ", 6) == 0)
-			{
-				gchar *end = NULL;
-				space += 6;
-
-				line = strtol(space, &end, 10);
-
-				// if the line could not be read, line is 0 and an error occurred, so we leave
-				if (space == end)
-					return;
-			}
-			idx_of_error_file = app->cur_idx;
+		{	
+			// File "HyperArch.py", line 37, in ?
+			// (file "clrdial.tcl" line 12)
+			pattern = " \"";
+			field_min_len = 6;
+			field_idx_line = 5;
+			field_idx_file = 2;
 			break;
 		}
 		case GEANY_FILETYPES_PASCAL:
-		{	// bandit.pas(149,3) Fatal: Syntax error, ";" expected but "ELSE" found
+		{	
+			// bandit.pas(149,3) Fatal: Syntax error, ";" expected but "ELSE" found
 			// still untested with other files than the opened
-			gchar **fields = g_strsplit(string, "(", 2);
-			gchar *end = NULL;
-			gchar *path;
-			gchar *filename;
+			pattern = "(";
+			field_min_len = 2;
+			field_idx_line = 1;
+			field_idx_file = 0;
+			break;
+		}
+		default: return;
+	}
 
-			// parse the line
-			if (g_strv_length(fields) < 2 || fields[0] == NULL || fields[1] == NULL)
-			{
-				g_strfreev(fields);
-				return;
-			}
+	fields = g_strsplit_set(string, pattern, field_min_len);
+	
+	// parse the line
+	if (g_strv_length(fields) < field_min_len)
+	{
+		g_strfreev(fields);
+		return;
+	}
 
-			line = strtol(fields[1], &end, 10);
+	line = strtol(fields[field_idx_line], &end, 10);
 
-			// if the line could not be read, line is 0 and an error occurred, so we leave
-			if (fields[1] == end)
-			{
-				g_strfreev(fields);
-				return;
-			}
+	// if the line could not be read, line is 0 and an error occurred, so we leave
+	if (fields[field_idx_line] == end)
+	{
+		g_strfreev(fields);
+		return;
+	}
 
-			// get the basename of the built file to get the path to look for other files
-			path = g_path_get_dirname(doc_list[app->cur_idx].file_name);
-			filename = g_strconcat(path, G_DIR_SEPARATOR_S, fields[0], NULL);
+	// get the basename of the built file to get the path to look for other files
+	path = g_path_get_dirname(doc_list[app->cur_idx].file_name);
+	filename = g_strconcat(path, G_DIR_SEPARATOR_S, fields[field_idx_file], NULL);
 
-			// use document_open_file to find an already opened file, or to open it in place
-			idx_of_error_file = document_open_file(-1, filename, 0, FALSE, NULL);
+	// use document_open_file to find an already opened file, or to open it in place
+	idx_of_error_file = document_open_file(-1, filename, 0, FALSE, NULL);
 
-			g_free(path);
-			g_free(filename);
+	g_free(path);
+	g_free(filename);
+	g_strfreev(fields);
 
-			if (idx_of_error_file == -1 || ! doc_list[idx_of_error_file].is_valid)
-			{
-				g_strfreev(fields);
-				return;
-			}
-
-			break;
-		}
+	if (idx_of_error_file == -1 || ! doc_list[idx_of_error_file].is_valid || line == -1)
+	{
+		return;
 	}
 
 	// finally jump to the line (and file)
-	if (line != -1)
+	if (idx != idx_of_error_file)
 	{
-		if (idx != idx_of_error_file)
-		{
-			gtk_notebook_set_current_page(GTK_NOTEBOOK(app->notebook),
-									gtk_notebook_page_num(GTK_NOTEBOOK(app->notebook),
-									GTK_WIDGET(doc_list[idx_of_error_file].sci)));
-		}
-		utils_goto_line(idx_of_error_file, line);
+		gtk_notebook_set_current_page(GTK_NOTEBOOK(app->notebook),
+								gtk_notebook_page_num(GTK_NOTEBOOK(app->notebook),
+								GTK_WIDGET(doc_list[idx_of_error_file].sci)));
 	}
+	utils_goto_line(idx_of_error_file, line);
 }


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