SF.net SVN: geany: [1146] trunk

ntrel at users.sourceforge.net ntrel at xxxxx
Tue Dec 26 15:43:51 UTC 2006


Revision: 1146
          http://svn.sourceforge.net/geany/?rev=1146&view=rev
Author:   ntrel
Date:     2006-12-26 07:43:50 -0800 (Tue, 26 Dec 2006)

Log Message:
-----------
Fix missed matches in tm_tags_find().

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/tagmanager/include/tm_tag.h
    trunk/tagmanager/tm_tag.c

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-12-24 12:32:52 UTC (rev 1145)
+++ trunk/ChangeLog	2006-12-26 15:43:50 UTC (rev 1146)
@@ -1,3 +1,9 @@
+2006-12-26  Nick Treleaven  <nick.treleaven at btinternet.com>
+
+ * tagmanager/tm_tag.c, tagmanager/include/tm_tag.h:
+   Fix missed matches in tm_tags_find().
+
+
 2006-12-24  Nick Treleaven  <nick.treleaven at btinternet.com>
 
  * src/utils.c, src/sci_cb.c:

Modified: trunk/tagmanager/include/tm_tag.h
===================================================================
--- trunk/tagmanager/include/tm_tag.h	2006-12-24 12:32:52 UTC (rev 1145)
+++ trunk/tagmanager/include/tm_tag.h	2006-12-26 15:43:50 UTC (rev 1146)
@@ -281,7 +281,8 @@
  \param name Name of the tag to locate.
  \param partial If TRUE, matches the first part of the name instead of doing exact match.
 */
-TMTag **tm_tags_find(GPtrArray *sorted_tags_array, const char *name, gboolean partial, int * tagCount);
+TMTag **tm_tags_find(const GPtrArray *sorted_tags_array, const char *name,
+		gboolean partial, int * tagCount);
 
 /*!
  Completely frees an array of tags.

Modified: trunk/tagmanager/tm_tag.c
===================================================================
--- trunk/tagmanager/tm_tag.c	2006-12-24 12:32:52 UTC (rev 1145)
+++ trunk/tagmanager/tm_tag.c	2006-12-26 15:43:50 UTC (rev 1146)
@@ -562,7 +562,8 @@
 	}
 }
 
-TMTag **tm_tags_find(GPtrArray *sorted_tags_array, const char *name, gboolean partial, int * tagCount)
+TMTag **tm_tags_find(const GPtrArray *sorted_tags_array, const char *name,
+		gboolean partial, int * tagCount)
 {
 	static TMTag *tag = NULL;
 	TMTag **result;
@@ -578,15 +579,30 @@
 	s_partial = partial;
 	result = (TMTag **) bsearch(&tag, sorted_tags_array->pdata, sorted_tags_array->len
 	  , sizeof(gpointer), tm_tag_compare);
+	// there can be matches on both sides of result
 	if (result)
 	{
-		for (; result >= (TMTag **) sorted_tags_array->pdata; -- result) {
+		TMTag **last = (TMTag **) &sorted_tags_array->pdata[sorted_tags_array->len - 1];
+		TMTag **adv;
+
+		// First look for any matches after result
+		adv = result;
+		adv++;
+		for (; *adv && adv <= last; ++ adv)
+		{
+			if (0 != tm_tag_compare(&tag, adv))
+				break;
+			++tagMatches;
+		}
+		// Now look for matches from result and below
+		for (; result >= (TMTag **) sorted_tags_array->pdata; -- result)
+		{
 			if (0 != tm_tag_compare(&tag, (TMTag **) result))
 				break;
 			++tagMatches;
 		}
 		*tagCount=tagMatches;
-		++ result;
+		++ result;	// correct address for the last successful match
 	}
 	s_partial = FALSE;
 	return (TMTag **) result;


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