Parcourir la source

* Stdarg's curious updates

svn: 901
Bryan Drewery il y a 22 ans
Parent
commit
bcfe349d79
2 fichiers modifiés avec 13 ajouts et 12 suppressions
  1. 12 11
      src/tclhash.c
  2. 1 1
      src/tclhash.h

+ 12 - 11
src/tclhash.c

@@ -155,7 +155,7 @@ bind_table_t *bind_table_lookup_or_fake(const char *name)
 
 
 /* Look up a bind entry based on either function name or id. */
-bind_entry_t *bind_entry_lookup(bind_table_t *table, int id, const char *mask, const char *function_name)
+static bind_entry_t *bind_entry_lookup(bind_table_t *table, int id, const char *mask, const char *function_name, Function callback)
 {
 	bind_entry_t *entry = NULL;
 	int hit;
@@ -170,17 +170,18 @@ bind_entry_t *bind_entry_lookup(bind_table_t *table, int id, const char *mask, c
 			if (entry->mask && !strcmp(entry->mask, mask)) hit++;
 			else if (!entry->mask) hit++;
 			if (entry->function_name && !strcmp(entry->function_name, function_name)) hit++;
-			if (hit == 2) break;
+			if (entry->callback == callback || !callback) hit++;
+			if (hit == 3) break;
 		}
 	}
 	return(entry);
 }
 
-int bind_entry_del(bind_table_t *table, int id, const char *mask, const char *function_name, void *cdata)
+int bind_entry_del(bind_table_t *table, int id, const char *mask, const char *function_name, Function callback)
 {
 	bind_entry_t *entry = NULL;
 
-	entry = bind_entry_lookup(table, id, mask, function_name);
+	entry = bind_entry_lookup(table, id, mask, function_name, callback);
 	if (!entry) return(-1);
 
 
@@ -209,7 +210,7 @@ int bind_entry_modify(bind_table_t *table, int id, const char *mask, const char
 {
 	bind_entry_t *entry = NULL;
 
-	entry = bind_entry_lookup(table, id, mask, function_name);
+	entry = bind_entry_lookup(table, id, mask, function_name, NULL);
 	if (!entry) return(-1);
 
 	/* Modify it. */
@@ -241,7 +242,7 @@ int bind_entry_overwrite(bind_table_t *table, int id, const char *mask, const ch
 {
 	bind_entry_t *entry = NULL;
 
-	entry = bind_entry_lookup(table, id, mask, function_name);
+	entry = bind_entry_lookup(table, id, mask, function_name, NULL);
 	if (!entry) return(-1);
 
 	entry->callback = callback;
@@ -253,7 +254,7 @@ int bind_entry_add(bind_table_t *table, const char *flags, const char *mask, con
 {
 	bind_entry_t *entry = NULL, *old_entry = NULL;
 
-	old_entry = bind_entry_lookup(table, -1, mask, function_name);
+	old_entry = bind_entry_lookup(table, -1, mask, function_name, NULL);
 
 	if (old_entry) {
 		if (table->flags & BIND_STACKABLE) {
@@ -348,7 +349,7 @@ int check_bind(bind_table_t *table, const char *match, struct flag_record *flags
 	void *args[11] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL };
 	bind_entry_t *entry = NULL, *next = NULL, *winner = NULL;
 	int i, cmp, retval;
-	int tie = 0, matchlen = 0, masklen = 0;
+	int tie = 0, matchlen = 0;
 	va_list ap;
 
 	Assert(table);
@@ -390,10 +391,10 @@ int check_bind(bind_table_t *table, const char *match, struct flag_record *flags
 		}
 		else if (table->match_type & MATCH_PARTIAL) {
 			cmp = 1;
-			masklen = strlen(entry->mask);
-			if (!egg_strncasecmp(match, entry->mask, masklen < matchlen ? masklen : matchlen)) {
+			if (!egg_strncasecmp(match, entry->mask, matchlen)) {
 				winner = entry;
-				if (masklen == matchlen) {
+				/* Is it an exact match? */
+				if (!entry->mask[matchlen]) {
 					tie = 1;
 					break;
 				}

+ 1 - 1
src/tclhash.h

@@ -72,7 +72,7 @@ void bind_table_del(bind_table_t *table);
 bind_table_t *bind_table_lookup(const char *name);
 bind_table_t *bind_table_lookup_or_fake(const char *name);
 int bind_entry_add(bind_table_t *table, const char *flags, const char *mask, const char *function_name, int bind_flags, Function callback, void *client_data);
-int bind_entry_del(bind_table_t *table, int id, const char *mask, const char *function_name, void *cdata);
+int bind_entry_del(bind_table_t *table, int id, const char *mask, const char *function_name, Function callback);
 int bind_entry_modify(bind_table_t *table, int id, const char *mask, const char *function_name, const char *newflags, const char *newmask);
 int bind_entry_overwrite(bind_table_t *table, int id, const char *mask, const char *function_name, Function callback, void *client_data);
 void add_builtins(const char *table_name, cmd_t *cmds);