<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">[PATCH] Alias STree

Add an STree node to the cmdalias struct. Implement an alias find function and
use it to replace to instances of list walking.

diff -urN a/NQ/cmd.c head/NQ/cmd.c
--- a/NQ/cmd.c	2006-02-19 18:30:25.000000000 +1030
+++ head/NQ/cmd.c	2006-02-19 17:17:57.000000000 +1030
@@ -38,10 +38,13 @@
     struct cmdalias_s *next;
     char name[MAX_ALIAS_NAME];
     char *value;
+    struct stree_node stree;
 } cmdalias_t;
 
-cmdalias_t *cmd_alias;
+#define cmdalias_entry(ptr) container_of(ptr, struct cmdalias_s, stree)
+static DECLARE_STREE_ROOT(cmdalias_tree);
 
+cmdalias_t *cmd_alias;
 qboolean cmd_wait;
 
 //=============================================================================
@@ -335,6 +338,19 @@
     return out;
 }
 
+static struct cmdalias_s *
+Cmd_Alias_Find(const char *name)
+{
+    struct cmdalias_s *ret = NULL;
+    struct stree_node *n;
+
+    n = STree_Find(&amp;cmdalias_tree, name);
+    if (n)
+	ret = cmdalias_entry(n);
+
+    return ret;
+}
+
 void
 Cmd_Alias_f(void)
 {
@@ -355,19 +371,19 @@
 	Con_Printf("Alias name is too long\n");
 	return;
     }
+
     // if the alias already exists, reuse it
-    for (a = cmd_alias; a; a = a-&gt;next) {
-	if (!strcmp(s, a-&gt;name)) {
-	    Z_Free(a-&gt;value);
-	    break;
-	}
-    }
+    a = Cmd_Alias_Find(s);
+    if (a)
+	Z_Free(a-&gt;value);
 
     if (!a) {
 	a = Z_Malloc(sizeof(cmdalias_t));
 	a-&gt;next = cmd_alias;
 	cmd_alias = a;
 	strcpy(a-&gt;name, s);
+	a-&gt;stree.string = a-&gt;name;
+	STree_Insert(&amp;cmdalias_tree, &amp;a-&gt;stree);
 	insert_alias_completion(a-&gt;name);
     }
 
@@ -652,11 +668,10 @@
     }
 
 // check alias
-    for (a = cmd_alias; a; a = a-&gt;next) {
-	if (!strcasecmp(cmd_argv[0], a-&gt;name)) {
-	    Cbuf_InsertText(a-&gt;value);
-	    return;
-	}
+    a = Cmd_Alias_Find(cmd_argv[0]);
+    if (a) {
+	Cbuf_InsertText(a-&gt;value);
+	return;
     }
 
 // check cvars
diff -urN a/QW/common/cmd.c head/QW/common/cmd.c
--- a/QW/common/cmd.c	2006-02-19 12:33:24.000000000 +1030
+++ head/QW/common/cmd.c	2006-02-19 18:36:34.000000000 +1030
@@ -40,10 +40,13 @@
     struct cmdalias_s *next;
     char name[MAX_ALIAS_NAME];
     char *value;
+    struct stree_node stree;
 } cmdalias_t;
 
-cmdalias_t *cmd_alias;
+#define cmdalias_entry(ptr) container_of(ptr, struct cmdalias_s, stree)
+static DECLARE_STREE_ROOT(cmdalias_tree);
 
+cmdalias_t *cmd_alias;
 qboolean cmd_wait;
 
 cvar_t cl_warncmd = { "cl_warncmd", "0" };
@@ -345,6 +348,19 @@
     return out;
 }
 
+static struct cmdalias_s *
+Cmd_Alias_Find(const char *name)
+{
+    struct cmdalias_s *ret = NULL;
+    struct stree_node *n;
+
+    n = STree_Find(&amp;cmdalias_tree, name);
+    if (n)
+	ret = cmdalias_entry(n);
+
+    return ret;
+}
+
 void
 Cmd_Alias_f(void)
 {
@@ -365,19 +381,19 @@
 	Con_Printf("Alias name is too long\n");
 	return;
     }
+
     // if the alias already exists, reuse it
-    for (a = cmd_alias; a; a = a-&gt;next) {
-	if (!strcmp(s, a-&gt;name)) {
-	    Z_Free(a-&gt;value);
-	    break;
-	}
-    }
+    a = Cmd_Alias_Find(s);
+    if (a)
+	Z_Free(a-&gt;value);
 
     if (!a) {
 	a = Z_Malloc(sizeof(cmdalias_t));
 	a-&gt;next = cmd_alias;
 	cmd_alias = a;
 	strcpy(a-&gt;name, s);
+	a-&gt;stree.string = a-&gt;name;
+	STree_Insert(&amp;cmdalias_tree, &amp;a-&gt;stree);
 	insert_alias_completion(a-&gt;name);
     }
 
@@ -691,11 +707,10 @@
     }
 
 // check alias
-    for (a = cmd_alias; a; a = a-&gt;next) {
-	if (!strcasecmp(cmd_argv[0], a-&gt;name)) {
-	    Cbuf_InsertText(a-&gt;value);
-	    return;
-	}
+    a = Cmd_Alias_Find(cmd_argv[0]);
+    if (a) {
+	Cbuf_InsertText(a-&gt;value);
+	return;
     }
 
 // check cvars
</pre></body></html>