From 516407dc178a18459655c3bf8494c63d50d7ac92 Mon Sep 17 00:00:00 2001
From: "7u83@mail.ru" <7u83@mail.ru@noemail.net>
Date: Sun, 19 Apr 2015 14:44:48 +0000
Subject: [PATCH] MAVL.
FossilOrigin-Name: f26f99b639c39fb5f83a6c49ed681366c54b1abbf9f7ce3b713a7c5be29c073f
---
src/capwap/mavl_del_all.c | 36 ++++++++++++++++++++
src/capwap/mavliter_next.c | 69 ++++++++++++++++++++++++++++++++++++++
src/capwap/mavliter_seek.c | 66 ++++++++++++++++++++++++++++++++++++
3 files changed, 171 insertions(+)
create mode 100644 src/capwap/mavl_del_all.c
create mode 100644 src/capwap/mavliter_next.c
create mode 100644 src/capwap/mavliter_seek.c
diff --git a/src/capwap/mavl_del_all.c b/src/capwap/mavl_del_all.c
new file mode 100644
index 00000000..79b55bac
--- /dev/null
+++ b/src/capwap/mavl_del_all.c
@@ -0,0 +1,36 @@
+/*
+ This file is part of libcapwap.
+
+ libcapwap is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libcapwap is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Foobar. If not, see .
+
+*/
+
+#include "mavl.h"
+
+static void mavl_del_all0(struct mavl *t ,struct mavlnode * n)
+{
+ if (!n)
+ return;
+ mavl_del_all0(t,n->left);
+ mavl_del_all0(t,n->right);
+ mavlnode_destroy(t,n);
+}
+
+void mavl_del_all(struct mavl *t)
+{
+ mavl_del_all0(t,t->root);
+ t->root=0;
+}
+
+
diff --git a/src/capwap/mavliter_next.c b/src/capwap/mavliter_next.c
new file mode 100644
index 00000000..30960ca9
--- /dev/null
+++ b/src/capwap/mavliter_next.c
@@ -0,0 +1,69 @@
+/*
+ This file is part of libcapwap.
+
+ libcapwap is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libcapwap is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Foobar. If not, see .
+
+*/
+
+/**
+ *@file
+ *@brief Implementation of mavliter_next
+ */
+
+#include "mavl.h"
+
+/**
+ * Get the next element within an AVL Tree.
+ * @param i pointer to AVL Iterator
+ * @return the element or NULL if there is no next elemeent.
+ */
+void * mavliter_next(mavliter_t *i)
+{
+
+ while ( i->stack_ptr) {
+ i->stack_ptr--;
+ i->cur=i->stack[i->stack_ptr];
+
+ if (!i->cur)
+ continue;
+
+ if ((i->stack_ptr)&1) {
+ return i->cur->data;
+ }
+ break;
+
+ }
+
+
+ if (!i->cur){
+ return NULL;
+ }
+
+ while(i->cur->left) {
+ /* push right branch */
+ i->stack[i->stack_ptr++]=i->cur->right;
+
+ /* push node */
+ i->stack[i->stack_ptr++]=i->cur;
+
+ i->cur=i->cur->left;
+
+ }
+
+ i->stack[i->stack_ptr++]=i->cur->right;
+
+ return i->cur->data;
+}
+
+
diff --git a/src/capwap/mavliter_seek.c b/src/capwap/mavliter_seek.c
new file mode 100644
index 00000000..61a64a0e
--- /dev/null
+++ b/src/capwap/mavliter_seek.c
@@ -0,0 +1,66 @@
+/*
+ This file is part of libcapwap.
+
+ libcapwap is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ libcapwap is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Foobar. If not, see .
+
+*/
+
+/**
+ *@file
+ *@brief Implementation of mavliter_seek
+ */
+
+
+#include "mavl.h"
+
+/**
+ * Set an AVL Iterator to a specific position.
+ * @param i AVL Iterator
+ * @param d element to search for
+ * @return element found or NULL if not found
+ */
+void * mavliter_seek(mavliter_t *i,void *d)
+{
+ if (!i->root)
+ return NULL;
+
+ i->cur=i->root;
+ i->stack_ptr=0;
+
+ int rc;
+ while(i->cur) {
+
+ rc = i->cmp(d,i->cur->data);
+ if (rc==0){
+ i->stack[i->stack_ptr++]=i->cur->right;
+ i->stack[i->stack_ptr++]=i->cur;
+ return mavliter_next(i);
+ }
+
+ if (rc<0) {
+ i->stack[i->stack_ptr++]=i->cur->right;
+ i->stack[i->stack_ptr++]=i->cur;
+
+ i->cur=i->cur->left;
+
+ }
+ if (rc>0) {
+
+ i->cur=i->cur->right;
+ }
+ }
+ return NULL;
+}
+
+