[geany/geany] be131b: Extend dedup() and merge() to unref the duplicate tag when needed

Jiří Techet git-noreply at xxxxx
Thu Oct 30 21:08:17 UTC 2014


Branch:      refs/heads/master
Author:      Jiří Techet <techet at gmail.com>
Committer:   Jiří Techet <techet at gmail.com>
Date:        Thu, 30 Oct 2014 21:08:17 UTC
Commit:      be131b00f9822309089c61a053125378bdefa005
             https://github.com/geany/geany/commit/be131b00f9822309089c61a053125378bdefa005

Log Message:
-----------
Extend dedup() and  merge() to unref the duplicate tag when needed


Modified Paths:
--------------
    src/editor.c
    src/symbols.c
    tagmanager/src/tm_tag.c
    tagmanager/src/tm_tag.h
    tagmanager/src/tm_workspace.c

Modified: src/editor.c
2 lines changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -1873,7 +1873,7 @@ static gchar *find_calltip(const gchar *word, GeanyFiletype *ft)
 		TMTagAttrType sort_attr[] = {tm_tag_attr_name_t, tm_tag_attr_scope_t,
 			tm_tag_attr_arglist_t, 0};
 
-		tm_tags_sort((GPtrArray *) tags, sort_attr, TRUE);
+		tm_tags_sort((GPtrArray *) tags, sort_attr, TRUE, FALSE);
 	}
 
 	/* if the current word has changed since last time, start with the first tag match */


Modified: src/symbols.c
2 lines changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -365,7 +365,7 @@ GString *symbols_get_macro_list(gint lang)
 		return NULL;
 	}
 
-	tm_tags_sort(ftags, NULL, FALSE);
+	tm_tags_sort(ftags, NULL, FALSE, FALSE);
 	for (j = 0; j < ftags->len; j++)
 	{
 		if (j > 0)


Modified: tagmanager/src/tm_tag.c
21 lines changed, 15 insertions(+), 6 deletions(-)
===================================================================
@@ -761,7 +761,7 @@ gboolean tm_tags_prune(GPtrArray *tags_array)
  on the same criteria.
  @return TRUE on success, FALSE on failure
 */
-gboolean tm_tags_dedup(GPtrArray *tags_array, TMTagAttrType *sort_attributes)
+gboolean tm_tags_dedup(GPtrArray *tags_array, TMTagAttrType *sort_attributes, gboolean unref_duplicates)
 {
 	TMSortOptions sort_options;
 	guint i;
@@ -774,6 +774,8 @@ gboolean tm_tags_dedup(GPtrArray *tags_array, TMTagAttrType *sort_attributes)
 	{
 		if (0 == tm_tag_compare(&(tags_array->pdata[i - 1]), &(tags_array->pdata[i]), &sort_options))
 		{
+			if (unref_duplicates)
+				tm_tag_unref(tags_array->pdata[i-1]);
 			tags_array->pdata[i-1] = NULL;
 		}
 	}
@@ -789,7 +791,8 @@ gboolean tm_tags_dedup(GPtrArray *tags_array, TMTagAttrType *sort_attributes)
  @param dedup Whether to deduplicate the sorted array
  @return TRUE on success, FALSE on failure
 */
-gboolean tm_tags_sort(GPtrArray *tags_array, TMTagAttrType *sort_attributes, gboolean dedup)
+gboolean tm_tags_sort(GPtrArray *tags_array, TMTagAttrType *sort_attributes, 
+	gboolean dedup, gboolean unref_duplicates)
 {
 	TMSortOptions sort_options;
 	
@@ -799,7 +802,7 @@ gboolean tm_tags_sort(GPtrArray *tags_array, TMTagAttrType *sort_attributes, gbo
 	sort_options.partial = FALSE;
 	g_ptr_array_sort_with_data(tags_array, tm_tag_compare, &sort_options);
 	if (dedup)
-		tm_tags_dedup(tags_array, sort_attributes);
+		tm_tags_dedup(tags_array, sort_attributes, unref_duplicates);
 	return TRUE;
 }
 
@@ -821,7 +824,8 @@ void tm_tags_remove_file_tags(TMSourceFile *source_file, GPtrArray *tags_array)
  * The merge complexity depends mostly on the size of the small array
  * and is almost independent of the size of the big array.
  * In addition, get rid of the duplicates (if both big_array and small_array are duplicate-free). */
-static GPtrArray *merge(GPtrArray *big_array, GPtrArray *small_array, TMSortOptions *sort_options) {
+static GPtrArray *merge(GPtrArray *big_array, GPtrArray *small_array, 
+	TMSortOptions *sort_options, gboolean unref_duplicates) {
 	guint i1 = 0;  /* index to big_array */
 	guint i2 = 0;  /* index to small_array */
 	guint initial_step;
@@ -898,7 +902,11 @@ static GPtrArray *merge(GPtrArray *big_array, GPtrArray *small_array, TMSortOpti
 				/* value from small_array gets merged - reset the step size */
 				step = initial_step;
 				if (cmpval == 0)
+				{
 					i1++;  /* remove the duplicate, keep just the newly merged value */
+					if (unref_duplicates)
+						tm_tag_unref(val1);
+				}
 			}
 		}
 	}
@@ -918,14 +926,15 @@ static GPtrArray *merge(GPtrArray *big_array, GPtrArray *small_array, TMSortOpti
 	return res_array;
 }
 
-GPtrArray *tm_tags_merge(GPtrArray *big_array, GPtrArray *small_array, TMTagAttrType *sort_attributes)
+GPtrArray *tm_tags_merge(GPtrArray *big_array, GPtrArray *small_array, 
+	TMTagAttrType *sort_attributes, gboolean unref_duplicates)
 {
 	GPtrArray *res_array;
 	TMSortOptions sort_options;
 	
 	sort_options.sort_attrs = sort_attributes;
 	sort_options.partial = FALSE;
-	res_array = merge(big_array, small_array, &sort_options);
+	res_array = merge(big_array, small_array, &sort_options, unref_duplicates);
 	return res_array;
 }
 


Modified: tagmanager/src/tm_tag.h
8 lines changed, 5 insertions(+), 3 deletions(-)
===================================================================
@@ -163,15 +163,17 @@ gboolean tm_tag_write(TMTag *tag, FILE *file, guint attrs);
 
 void tm_tags_remove_file_tags(TMSourceFile *source_file, GPtrArray *tags_array);
 
-GPtrArray *tm_tags_merge(GPtrArray *big_array, GPtrArray *small_array, TMTagAttrType *sort_attributes);
+GPtrArray *tm_tags_merge(GPtrArray *big_array, GPtrArray *small_array, 
+	TMTagAttrType *sort_attributes, gboolean unref_duplicates);
 
-gboolean tm_tags_sort(GPtrArray *tags_array, TMTagAttrType *sort_attributes, gboolean dedup);
+gboolean tm_tags_sort(GPtrArray *tags_array, TMTagAttrType *sort_attributes, 
+	gboolean dedup, gboolean unref_duplicates);
 
 GPtrArray *tm_tags_extract(GPtrArray *tags_array, guint tag_types);
 
 gboolean tm_tags_prune(GPtrArray *tags_array);
 
-gboolean tm_tags_dedup(GPtrArray *tags_array, TMTagAttrType *sort_attributes);
+gboolean tm_tags_dedup(GPtrArray *tags_array, TMTagAttrType *sort_attributes, gboolean unref_duplicates);
 
 TMTag **tm_tags_find(const GPtrArray *tags_array, const char *name,
 		gboolean partial, gboolean tags_array_sorted, int * tagCount);


Modified: tagmanager/src/tm_workspace.c
18 lines changed, 9 insertions(+), 9 deletions(-)
===================================================================
@@ -177,11 +177,11 @@ gboolean tm_workspace_load_global_tags(const char *tags_file, gint mode)
 		g_ptr_array_add(file_tags, tag);
 	fclose(fp);
 	
-	tm_tags_sort(file_tags, global_tags_sort_attrs, TRUE);
+	tm_tags_sort(file_tags, global_tags_sort_attrs, TRUE, TRUE);
 
 	/* reorder the whole array, because tm_tags_find expects a sorted array */
 	new_tags = tm_tags_merge(theWorkspace->global_tags, 
-		file_tags, global_tags_sort_attrs);
+		file_tags, global_tags_sort_attrs, TRUE);
 	g_ptr_array_free(theWorkspace->global_tags, TRUE);
 	g_ptr_array_free(file_tags, TRUE);
 	theWorkspace->global_tags = new_tags;
@@ -443,7 +443,7 @@ gboolean tm_workspace_create_global_tags(const char *pre_process, const char **i
 		tm_source_file_free(source_file);
 		return FALSE;
 	}
-	if (FALSE == tm_tags_sort(tags_array, global_tags_sort_attrs, TRUE))
+	if (FALSE == tm_tags_sort(tags_array, global_tags_sort_attrs, TRUE, FALSE))
 	{
 		tm_source_file_free(source_file);
 		return FALSE;
@@ -505,7 +505,7 @@ void tm_workspace_update(void)
 #ifdef TM_DEBUG
 	g_message("Total: %d tags", theWorkspace->tags_array->len);
 #endif
-	tm_tags_sort(theWorkspace->tags_array, sort_attrs, TRUE);
+	tm_tags_sort(theWorkspace->tags_array, sort_attrs, TRUE, FALSE);
 }
 
 static void tm_workspace_merge_file_tags(TMSourceFile *source_file)
@@ -514,7 +514,7 @@ static void tm_workspace_merge_file_tags(TMSourceFile *source_file)
 		tm_tag_attr_scope_t, tm_tag_attr_type_t, tm_tag_attr_arglist_t, 0};
 
 	GPtrArray *new_tags = tm_tags_merge(theWorkspace->tags_array, 
-		source_file->tags_array, sort_attrs);
+		source_file->tags_array, sort_attrs, FALSE);
 	/* tags owned by TMSourceFile - free just the pointer array */
 	g_ptr_array_free(theWorkspace->tags_array, TRUE);
 	theWorkspace->tags_array = new_tags;
@@ -542,7 +542,7 @@ void tm_workspace_update_source_file(TMSourceFile *source_file, gboolean update_
 		tm_tags_remove_file_tags(source_file, theWorkspace->tags_array);
 	}
 	tm_source_file_parse(source_file);
-	tm_tags_sort(source_file->tags_array, NULL, FALSE);
+	tm_tags_sort(source_file->tags_array, NULL, FALSE, TRUE);
 	if (update_workspace)
 	{
 #ifdef TM_DEBUG
@@ -589,7 +589,7 @@ void tm_workspace_update_source_file_buffer(TMSourceFile *source_file, guchar* t
 		tm_tags_remove_file_tags(source_file, theWorkspace->tags_array);
 	}
 	tm_source_file_buffer_parse (source_file, text_buf, buf_size);
-	tm_tags_sort(source_file->tags_array, NULL, FALSE);
+	tm_tags_sort(source_file->tags_array, NULL, FALSE, TRUE);
 	if (update_workspace)
 	{
 #ifdef TM_DEBUG
@@ -693,7 +693,7 @@ const GPtrArray *tm_workspace_find(const char *name, int type, TMTagAttrType *at
 	}
 
 	if (attrs)
-		tm_tags_sort(tags, attrs, TRUE);
+		tm_tags_sort(tags, attrs, TRUE, FALSE);
 	return tags;
 }
 
@@ -777,7 +777,7 @@ tm_workspace_find_scoped (const char *name, const char *scope, gint type,
 							  name, scope, type, partial, lang, FALSE);
 	}
 	if (attrs)
-		tm_tags_sort (tags, attrs, TRUE);
+		tm_tags_sort (tags, attrs, TRUE, FALSE);
 	return tags;
 }
 



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Commits mailing list