1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
#include "imap4d.h"
int
fstreecmp(Avl *va, Avl *vb)
{
int i;
Fstree *a, *b;
a = (Fstree*)va;
b = (Fstree*)vb;
i = a->m->id - b->m->id;
if(i > 0)
i = 1;
if(i < 0)
i = -1;
return i;
}
Msg*
fstreefind(Box *mb, int id)
{
Msg m0;
Fstree t, *p;
memset(&t, 0, sizeof t);
m0.id = id;
t.m = &m0;
if(p = (Fstree*)avllookup(mb->fstree, &t))
return p->m;
return nil;
}
void
fstreeadd(Box *mb, Msg *m)
{
Avl *old;
Fstree *p;
assert(m->id > 0);
p = ezmalloc(sizeof *p);
p->m = m;
old = avlinsert(mb->fstree, p);
assert(old == 0);
}
void
fstreedelete(Box *mb, Msg *m)
{
Fstree t, *p;
memset(&t, 0, sizeof t);
t.m = m;
assert(m->id > 0);
p = (Fstree*)avldelete(mb->fstree, &t);
if(p == nil)
_assert("fstree delete fails");
free(p);
}
|