shithub: snippets

Download patch

ref: d347f48f5ee550b901d0cdba4779f2ebd11b0c73
parent: 4b95f4f4f1f3caae8e09e16f9bcd4af303a33a8b
author: kemal <[email protected]>
date: Fri Jul 2 14:45:08 EDT 2021

qp.[ch]: add qpdel

--- a/qp.c
+++ b/qp.c
@@ -108,6 +108,51 @@
 }
 
 Trie *
+qpdel(Trie *t, char *k, int len, char **pk, void **pv)
+{
+	Trie *p, *twigs;
+	Tbitmap b;
+	uint s, m;
+
+	if(t == nil)
+		return nil;
+	assert(k != nil && pk != nil && pv != nil);
+	if(len < 1)
+		len = strlen(k);
+	assert(len > 0);
+
+	for(b = 0, p = nil; isbranch(t); p = t, t = twig(t, twigoff(t, b))){
+		b = twigbit(t, k, len);
+		if(!hastwig(t, b))
+			return t;
+	}
+	
+	if(strncmp(k, t->leaf.k, len) != 0)
+		return t;
+	*pk = t->leaf.k;
+	*pv = t->leaf.v;
+
+	if(p == nil){
+		free(t);
+		return nil;
+	}
+	t = p;
+
+	twigoffmax(s, m, t, b);
+	if(m == 2){
+		twigs = t->branch.twigs;
+		*t = *twig(t, !s);
+		free(twigs);
+		return t;
+	}
+	memmove(t->branch.twigs+s, t->branch.twigs+s+1, sizeof(*t)*(m-s-1));
+	t->branch.x &= ~(u64int)b;
+
+	t->branch.twigs = realloc(t->branch.twigs, sizeof(*t)*(m-1));
+	return t;
+}
+
+Trie *
 qpset(Trie *t, char *k, int len, void *v)
 {
 	Trie *t0, t1, t2;
--- a/qp.h
+++ b/qp.h
@@ -3,4 +3,5 @@
 
 int qpget(Trie *t, char *k, int len, char **pk, void **pv);
 int qpnext(Trie *t, char **pk, int *plen, void **pv);
+Trie *qpdel(Trie *t, char *k, int len, char **pk, void **pv);
 Trie *qpset(Trie *t, char *k, int len, void *v);