Signed-off-by: Vegard Nossum <vegard.nos...@gmail.com>
---
 Makefile               |    1 +
 include/lib/array.h    |    4 +++
 lib/array.c            |   50 ++++++++++++++++++++++++++++++++++++++++++++++++
 test/arch-x86/Makefile |    1 +
 4 files changed, 56 insertions(+), 0 deletions(-)
 create mode 100644 lib/array.c

diff --git a/Makefile b/Makefile
index 68a89e9..55ef9ba 100644
--- a/Makefile
+++ b/Makefile
@@ -129,6 +129,7 @@ VM_OBJS = \
        vm/zalloc.o
 
 LIB_OBJS = \
+       lib/array.o             \
        lib/bitset.o            \
        lib/buffer.o            \
        lib/guard-page.o        \
diff --git a/include/lib/array.h b/include/lib/array.h
index cff85c1..12b6968 100644
--- a/include/lib/array.h
+++ b/include/lib/array.h
@@ -87,4 +87,8 @@ static inline void array_qsort(struct array *a,
        qsort(a->ptr, a->size, sizeof(void *), cmp);
 }
 
+/* Remove duplicate elements from the array. NOTE: The array must already
+ * be sorted! */
+void array_unique(struct array *a, int (*cmp)(const void *, const void *));
+
 #endif
diff --git a/lib/array.c b/lib/array.c
new file mode 100644
index 0000000..256257f
--- /dev/null
+++ b/lib/array.c
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2009  Vegard Nossum
+ *
+ * This file is released under the GPL version 2 with the following
+ * clarification and special exception:
+ *
+ *     Linking this library statically or dynamically with other modules is
+ *     making a combined work based on this library. Thus, the terms and
+ *     conditions of the GNU General Public License cover the whole
+ *     combination.
+ *
+ *     As a special exception, the copyright holders of this library give you
+ *     permission to link this library with independent modules to produce an
+ *     executable, regardless of the license terms of these independent
+ *     modules, and to copy and distribute the resulting executable under terms
+ *     of your choice, provided that you also meet, for each linked independent
+ *     module, the terms and conditions of the license of that module. An
+ *     independent module is a module which is not derived from or based on
+ *     this library. If you modify this library, you may extend this exception
+ *     to your version of the library, but you are not obligated to do so. If
+ *     you do not wish to do so, delete this exception statement from your
+ *     version.
+ *
+ * Please refer to the file LICENSE for details.
+ */
+
+#include "lib/array.h"
+
+void array_unique(struct array *a, int (*cmp)(const void *, const void *))
+{
+       unsigned int n = a->size;
+       if (!n)
+               return;
+
+       void **ptr = a->ptr;
+       unsigned int target = 0;
+
+       for (unsigned int i = target + 1; i < n; ++i) {
+               assert(i > target);
+
+               /* If they're equal, we skip it. */
+               if (!cmp(&ptr[target], &ptr[i]))
+                       continue;
+
+               ptr[++target] = ptr[i];
+       }
+
+       /* Update the size */
+       a->size = target + 1;
+}
diff --git a/test/arch-x86/Makefile b/test/arch-x86/Makefile
index 5ea3cb2..83a2988 100644
--- a/test/arch-x86/Makefile
+++ b/test/arch-x86/Makefile
@@ -52,6 +52,7 @@ TOPLEVEL_OBJS := \
        jit/tree-node.o \
        jit/tree-printer.o \
        jit/vtable.o \
+       lib/array.o \
        lib/buffer.o \
        lib/guard-page.o \
        lib/hash-map.o \
-- 
1.6.0.4


------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Jatovm-devel mailing list
Jatovm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jatovm-devel

Reply via email to