SF.net SVN: geany-plugins:[2123] trunk/geany-plugins/debugger/src

cesspit at users.sourceforge.net cesspit at xxxxx
Sat Aug 6 10:15:27 UTC 2011


Revision: 2123
          http://geany-plugins.svn.sourceforge.net/geany-plugins/?rev=2123&view=rev
Author:   cesspit
Date:     2011-08-06 10:15:27 +0000 (Sat, 06 Aug 2011)

Log Message:
-----------
debugger plugin:
 - fixing bug with the breakpoint removing when deleting a corresponding line from the document
 - some refactoring

Modified Paths:
--------------
    trunk/geany-plugins/debugger/src/breakpoints.c
    trunk/geany-plugins/debugger/src/breakpoints.h
    trunk/geany-plugins/debugger/src/callbacks.c
    trunk/geany-plugins/debugger/src/debug.c
    trunk/geany-plugins/debugger/src/tpage.c
    trunk/geany-plugins/debugger/src/utils.c
    trunk/geany-plugins/debugger/src/utils.h

Modified: trunk/geany-plugins/debugger/src/breakpoints.c
===================================================================
--- trunk/geany-plugins/debugger/src/breakpoints.c	2011-08-06 06:02:50 UTC (rev 2122)
+++ trunk/geany-plugins/debugger/src/breakpoints.c	2011-08-06 10:15:27 UTC (rev 2123)
@@ -44,10 +44,12 @@
  * Functions for breakpoint iteration support
  */
 
+typedef void 	(*breaks_iterate_function)(void* bp);
+
 /*
  * Iterates through GTree for the particular file
  */
-gboolean tree_foreach(gpointer key, gpointer value, gpointer data)
+gboolean tree_foreach_call_function(gpointer key, gpointer value, gpointer data)
 {
 	((breaks_iterate_function)data)(value);
 	return FALSE;
@@ -56,16 +58,46 @@
 /*
  * Iterates through hash table of GTree-s
  */
-void hash_table_foreach(gpointer key, gpointer value, gpointer user_data)
+void hash_table_foreach_call_function(gpointer key, gpointer value, gpointer user_data)
 {
-	g_tree_foreach((GTree*)value, tree_foreach, user_data);
+	g_tree_foreach((GTree*)value, tree_foreach_call_function, user_data);
 }
 
 /*
+ * Iterates through GTree
+ * adding each item to GList that is passed through data variable
+ */
+gboolean tree_foreach_add_to_list(gpointer key, gpointer value, gpointer data)
+{
+	GList **list = (GList**)data;
+	*list = g_list_append(*list, value);
+	return FALSE;
+}
+
+/*
+ * Iterates through hash table of GTree-s
+ * calling list collection functions on each tree
+ */
+void hash_table_foreach_add_to_list(gpointer key, gpointer value, gpointer user_data)
+{
+	g_tree_foreach((GTree*)value, tree_foreach_add_to_list, user_data);
+}
+
+/*
  * Helper functions
  */
 
 /*
+ * Remove breakpoint while iterating through GTree.
+ * arguments:
+ * 		bp - breakpoint
+ */
+void breaks_remove_internal(breakpoint *bp)
+{
+	handle_break_remove(bp, TRUE);
+}
+
+/*
  * lookup for breakpoint
  * arguments:
  * 		file - breakpoints filename
@@ -260,7 +292,15 @@
 void breaks_destroy()
 {
 	/* remove all markers */
-	breaks_iterate((breaks_iterate_function)markers_remove_breakpoint);
+	GList *breaks, *iter;
+	breaks = iter = breaks_get_all();
+	while (iter)
+	{
+		markers_remove_breakpoint((breakpoint*)iter->data);
+		iter = iter->next;
+	}
+	g_list_free(breaks);
+	
 	/* free storage */
 	g_hash_table_destroy(files);
 }
@@ -333,6 +373,16 @@
 }
 
 /*
+ * Removes all breakpoints.
+ * arguments:
+ */
+void breaks_remove_all()
+{
+	g_hash_table_foreach(files, hash_table_foreach_call_function, (gpointer)breaks_remove_internal);
+	g_hash_table_remove_all(files);
+}
+
+/*
  * Switch breakpoints state.
  * arguments:
  * 		file - breakpoints filename
@@ -425,6 +475,30 @@
 }
 
 /*
+ * Moves a breakpoint from to another line
+ * arguments:
+ * 		file - breakpoints filename
+ * 		line_from - old line number
+ * 		line_to - new line number
+ */
+void breaks_move_to_line(char* file, int line_from, int line_to)
+{
+	/* first look for the tree for the given file */
+	GTree *tree = NULL;
+	if (tree = g_hash_table_lookup(files, file))
+	{
+		/* lookup for the break in GTree*/
+		breakpoint *bp = (breakpoint*)g_tree_lookup(tree, GINT_TO_POINTER(line_from));
+		if (bp)
+		{
+			g_tree_steal(tree, GINT_TO_POINTER(line_from));
+			bp->line = line_to;
+			g_tree_insert(tree, GINT_TO_POINTER(line_to), bp);
+		}
+	}
+}
+
+/*
  * Checks whether breakpoint is set.
  * arguments:
  * 		file - breakpoints filename
@@ -449,25 +523,32 @@
  * arguments:
  * 		file - file name to get breaks for 
  */
-GTree *breaks_get_for_document(char* file)
+GList *breaks_get_for_document(char* file)
 {
-	return g_hash_table_lookup(files, file);
+	GList *breaks = NULL;
+	GTree *tree = g_hash_table_lookup(files, file);
+	if (tree)
+	{
+		g_tree_foreach(tree, tree_foreach_add_to_list, &breaks);
+	}
+	return breaks;
 }
 
 /*
- * Get breakpoints widget
+ * Gets all breakpoints
+ * arguments:
  */
-GtkWidget* breaks_get_widget()
+GList* breaks_get_all()
 {
-	return bptree_get_widget();
+	GList *breaks  = NULL;
+	g_hash_table_foreach(files, hash_table_foreach_add_to_list, &breaks);
+	return breaks;
 }
 
 /*
- * Calls specified function on every breakpoint
- * arguments:
- * 		bif - function to call 
+ * Get breakpoints widget
  */
-void breaks_iterate(breaks_iterate_function bif)
+GtkWidget* breaks_get_widget()
 {
-	g_hash_table_foreach(files, hash_table_foreach, (gpointer)bif);
+	return bptree_get_widget();
 }

Modified: trunk/geany-plugins/debugger/src/breakpoints.h
===================================================================
--- trunk/geany-plugins/debugger/src/breakpoints.h	2011-08-06 06:02:50 UTC (rev 2122)
+++ trunk/geany-plugins/debugger/src/breakpoints.h	2011-08-06 10:15:27 UTC (rev 2123)
@@ -20,16 +20,18 @@
  */
 
 typedef void	(*move_to_line_cb)(char* file, int line);
-typedef void 	(*breaks_iterate_function)(void* bp);
 
 gboolean		breaks_init(move_to_line_cb callback);
 void			breaks_destroy();
 void			breaks_add(char* file, int line, char* condition, int enable, int hitscount);
 void			breaks_remove(char* file, int line);
+void			breaks_remove_all();
 void			breaks_switch(char* file, int line);
 void			breaks_set_hits_count(char* file, int line, int count);
 void			breaks_set_condition(char* file, int line, char* condition);
-void 			breaks_iterate(breaks_iterate_function bif);
+void			breaks_move_to_line(char* file, int line_from, int line_to);
 gboolean		breaks_is_set(char* file, int line);
 GtkWidget*	breaks_get_widget();
-GTree*		breaks_get_for_document(char* file);
+GList*			breaks_get_for_document(char* file);
+GList*			breaks_get_all();
+

Modified: trunk/geany-plugins/debugger/src/callbacks.c
===================================================================
--- trunk/geany-plugins/debugger/src/callbacks.c	2011-08-06 06:02:50 UTC (rev 2122)
+++ trunk/geany-plugins/debugger/src/callbacks.c	2011-08-06 10:15:27 UTC (rev 2123)
@@ -98,9 +98,19 @@
 	/* check if current path contains config file */
 	tpage_on_document_activate(doc);
 
-	GTree *tree;
-	if (tree = breaks_get_for_document(file))
-		g_tree_foreach(tree, tree_foreach_set_marker, NULL);
+	GList *breaks;
+	if (breaks = breaks_get_for_document(file))
+	{
+		GList *iter = breaks;
+		while (iter)
+		{
+			breakpoint *bp = (breakpoint*)iter->data;
+			markers_add_breakpoint(bp);
+			
+			iter = iter->next;
+		}
+		g_list_free(breaks);
+	}
 
 	/* if debug is active - tell the debug module that a file was opened */
 	if (DBS_IDLE != debug_get_state())
@@ -174,21 +184,17 @@
 			{
 				int line = sci_get_line_from_position(editor->sci, nt->position) + 1;
 
-				GTree *breakpoints = breaks_get_for_document(editor->document->file_name);
-				if (breakpoints && g_tree_nnodes(breakpoints))
+				GList *breaks = breaks_get_for_document(editor->document->file_name);
+				if (breaks)
 				{
-
-					GList *breaks_list = NULL;
-					g_tree_foreach(breakpoints, tree_foreach_add_to_list, &breaks_list);
-
-					GList *iter = breaks_list;
+					GList *iter = breaks;
 					while (iter)
 					{
 						breakpoint *bp = (breakpoint*)iter->data;
 
 						if (nt->linesAdded > 0 && bp->line >= line)
 						{
-							bp->line += nt->linesAdded;
+							breaks_move_to_line(bp->file, bp->line, bp->line + nt->linesAdded);
 							bptree_update_breakpoint(bp);
 						}
 						else if (nt->linesAdded < 0 && bp->line >= line)
@@ -199,14 +205,14 @@
 							}
 							else
 							{
-								bp->line += nt->linesAdded;
+								breaks_move_to_line(bp->file, bp->line, bp->line + nt->linesAdded);
 								bptree_update_breakpoint(bp);
 							}
 						}
 						iter = iter->next;
 					}
 
-					g_list_free(breaks_list);
+					g_list_free(breaks);
 				}
 			}
 			break;

Modified: trunk/geany-plugins/debugger/src/debug.c
===================================================================
--- trunk/geany-plugins/debugger/src/debug.c	2011-08-06 06:02:50 UTC (rev 2122)
+++ trunk/geany-plugins/debugger/src/debug.c	2011-08-06 10:15:27 UTC (rev 2123)
@@ -772,21 +772,6 @@
 };
 
 /*
- * iterating staff to add breakpoints on startup
- * erroneous_break - pointer to the breakpoint that caused error
- * when setting.
- */
-breakpoint* erroneous_break;
-void set_new_break(void* bp)
-{
-	if (erroneous_break)
-		return;
-	
-	if(!active_module->set_break((breakpoint*)bp, BSA_NEW_BREAK))
-		erroneous_break = (breakpoint*)bp;
-}
-
-/*
  * Interface functions
  */
 
@@ -1000,14 +985,26 @@
 			if (active_module->load(target, commandline, env, watches))
 			{
 				/* set breaks */
-				erroneous_break = NULL;
-				breaks_iterate(set_new_break);
-				
-				if (erroneous_break)
+
+				GList *breaks = breaks_get_all();
+
+				GList *iter = breaks;
+				while (iter)
 				{
+					breakpoint *bp = (breakpoint*)iter->data;
+					if(!active_module->set_break(bp, BSA_NEW_BREAK))
+					{
+						break;
+					}
+					iter = iter->next;
+				}
+
+				if (iter)
+				{
+					breakpoint *bad_break = (breakpoint*)iter->data;
 					gchar msg[1000];
 					sprintf(msg, _("Breakpoint at %s:%i cannot be set\nDebugger message: %s"),
-						erroneous_break->file, erroneous_break->line, active_module->error_message());
+						bad_break->file, bad_break->line, active_module->error_message());
 						
 					dialogs_show_msgbox(GTK_MESSAGE_ERROR, "%s", msg);
 						
@@ -1015,6 +1012,8 @@
 					debug_state = DBS_STOP_REQUESTED;
 					return;
 				}
+
+				g_list_free(breaks);
 				
 				/* set target page - readonly */
 				tpage_set_readonly(TRUE);

Modified: trunk/geany-plugins/debugger/src/tpage.c
===================================================================
--- trunk/geany-plugins/debugger/src/tpage.c	2011-08-06 06:02:50 UTC (rev 2122)
+++ trunk/geany-plugins/debugger/src/tpage.c	2011-08-06 10:15:27 UTC (rev 2123)
@@ -406,15 +406,6 @@
 }
 
 /*
- * GList and function to collect breaks from breakpoints page to save in config
- */
-GList *breaks = NULL;
-void collect_breaks(void* bp)
-{
-	breaks = g_list_append(breaks, bp);
-}
-
-/*
  * save config
  */
 void on_save_config(GtkButton *button, gpointer user_data)
@@ -470,7 +461,7 @@
 	while (gtk_tree_model_iter_next(model, &iter));
 
 	/* breakpoints */
-	breaks_iterate(collect_breaks);
+	GList *breaks = breaks_get_all();
 	GList *biter = breaks;
 	while (biter)
 	{
@@ -525,16 +516,6 @@
 } 
 
 /*
- * function to remove a break when loading config and iterating through
- * existing breaks
- */
-void removebreak(void *p)
-{
-	breakpoint *bp = (breakpoint*)p;
-	breaks_remove(bp->file, bp->line);
-}
-
-/*
  * load config file
  */
 void on_load_config(GtkButton *button, gpointer user_data)
@@ -565,9 +546,9 @@
 	readline(config, arguments, FILENAME_MAX - 1);
 	GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
 	gtk_text_buffer_set_text(buffer, arguments, -1);
-	
+
 	/* breakpoints and environment variables */
-	breaks_iterate(removebreak);
+	breaks_remove_all();
 	wtree_remove_all();
 	
 	gboolean wrongbreaks = FALSE;
@@ -647,7 +628,7 @@
 void on_clear(GtkButton *button, gpointer user_data)
 {
 	/* breakpoints */
-	breaks_iterate(removebreak);
+	breaks_remove_all();
 
 	/* watches */
 	wtree_remove_all();

Modified: trunk/geany-plugins/debugger/src/utils.c
===================================================================
--- trunk/geany-plugins/debugger/src/utils.c	2011-08-06 06:02:50 UTC (rev 2122)
+++ trunk/geany-plugins/debugger/src/utils.c	2011-08-06 10:15:27 UTC (rev 2123)
@@ -103,26 +103,6 @@
 }
 
 /*
- * GTree iteration functions that sets marker for each breakpoint in the tree 
- */
-gboolean tree_foreach_set_marker(gpointer key, gpointer value, gpointer data)
-{
-	breakpoint *bp = (breakpoint*)value;
-	markers_add_breakpoint(bp);
-	return FALSE;
-}
-
-/*
- * GTree iteration functions that adds data to the list supplied in "data" parameter 
- */
-gboolean tree_foreach_add_to_list(gpointer key, gpointer value, gpointer data)
-{
-	GList **list = (GList**)data;
-	*list = g_list_append(*list, value);
-	return FALSE;
-}
-
-/*
  * get word at "position" in Scintilla document
  */
 GString* get_word_at_position(ScintillaObject *sci, int position)

Modified: trunk/geany-plugins/debugger/src/utils.h
===================================================================
--- trunk/geany-plugins/debugger/src/utils.h	2011-08-06 06:02:50 UTC (rev 2122)
+++ trunk/geany-plugins/debugger/src/utils.h	2011-08-06 10:15:27 UTC (rev 2123)
@@ -23,6 +23,4 @@
 int						get_char_width(GtkWidget *widget);
 int						get_header_string_width(gchar *header, int minchars, int char_width);
 GtkTreeViewColumn*		create_column(gchar *name, GtkCellRenderer *renderer, gboolean expandable, gint minwidth, gchar *arg, int value);
-gboolean 				tree_foreach_set_marker(gpointer key, gpointer value, gpointer data);
 GString*				get_word_at_position(ScintillaObject *sci, int position);
-gboolean				tree_foreach_add_to_list(gpointer key, gpointer value, gpointer data);


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Plugins-Commits mailing list