summaryrefslogtreecommitdiff
path: root/lib/libcurses/base/tries.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libcurses/base/tries.c')
-rw-r--r--lib/libcurses/base/tries.c44
1 files changed, 38 insertions, 6 deletions
diff --git a/lib/libcurses/base/tries.c b/lib/libcurses/base/tries.c
index 522bc6542bd..245446b3599 100644
--- a/lib/libcurses/base/tries.c
+++ b/lib/libcurses/base/tries.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tries.c,v 1.1 1999/01/18 19:10:07 millert Exp $ */
+/* $OpenBSD: tries.c,v 1.2 1999/02/24 06:31:08 millert Exp $ */
/****************************************************************************
* Copyright (c) 1998 Free Software Foundation, Inc. *
@@ -41,25 +41,28 @@
#include <curses.priv.h>
-MODULE_ID("$From: tries.c,v 1.8 1998/11/07 22:54:48 tom Exp $")
+MODULE_ID("$From: tries.c,v 1.10 1999/02/19 11:52:11 tom Exp $")
/*
* Expand a keycode into the string that it corresponds to, returning null if
* no match was found, otherwise allocating a string of the result.
*/
-char *_nc_expand_try(struct tries *tree, unsigned short code, size_t len)
+char *_nc_expand_try(struct tries *tree, unsigned short code, int *count, size_t len)
{
struct tries *ptr = tree;
char *result = 0;
if (code != 0) {
while (ptr != 0) {
- if ((result = _nc_expand_try(ptr->child, code, len + 1)) != 0) {
+ if ((result = _nc_expand_try(ptr->child, code, count, len + 1)) != 0) {
break;
}
if (ptr->value == code) {
- result = typeCalloc(char, len+2);
- break;
+ *count -= 1;
+ if (*count == -1) {
+ result = typeCalloc(char, len+2);
+ break;
+ }
}
ptr = ptr->sibling;
}
@@ -103,3 +106,32 @@ int _nc_remove_key(struct tries **tree, unsigned short code)
}
return FALSE;
}
+
+/*
+ * Remove a string from the specified tree, freeing the unused nodes. Returns
+ * true if the string was found/removed.
+ */
+int _nc_remove_string(struct tries **tree, char *string)
+{
+ if (string == 0 || *string == 0)
+ return FALSE;
+
+ while (*tree != 0) {
+ if (_nc_remove_string(&(*tree)->child, string+1)) {
+ return TRUE;
+ }
+ if ((unsigned char)(*tree)->ch == (unsigned char)*string) {
+ if((*tree)->child) {
+ /* don't cut the whole sub-tree */
+ (*tree)->value = 0;
+ } else {
+ struct tries *to_free = *tree;
+ *tree = (*tree)->sibling;
+ free(to_free);
+ }
+ return TRUE;
+ }
+ tree = &(*tree)->sibling;
+ }
+ return FALSE;
+}