Module Name: othersrc
Committed By: dholland
Date: Mon Mar 4 07:27:54 UTC 2013
Modified Files:
othersrc/usr.bin/dholland-make2: array.c array.h
Log Message:
add a couple more array ops we look likely to use a lot
To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 othersrc/usr.bin/dholland-make2/array.c
cvs rdiff -u -r1.3 -r1.4 othersrc/usr.bin/dholland-make2/array.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: othersrc/usr.bin/dholland-make2/array.c
diff -u othersrc/usr.bin/dholland-make2/array.c:1.1 othersrc/usr.bin/dholland-make2/array.c:1.2
--- othersrc/usr.bin/dholland-make2/array.c:1.1 Mon Mar 4 05:47:15 2013
+++ othersrc/usr.bin/dholland-make2/array.c Mon Mar 4 07:27:54 2013
@@ -71,6 +71,32 @@ array_cleanup(struct array *a)
}
int
+array_contains(struct array *a, void *val)
+{
+ unsigned i;
+
+ for (i=0; i<a->num; i++) {
+ if (a->v[i] == val) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+unsigned
+array_find(struct array *a, void *val)
+{
+ unsigned i;
+
+ for (i=0; i<a->num; i++) {
+ if (a->v[i] == val) {
+ return i;
+ }
+ }
+ return ARRAY_NOTFOUND;
+}
+
+int
array_setsize(struct array *a, unsigned num)
{
unsigned newmax;
@@ -122,3 +148,14 @@ array_remove(struct array *a, unsigned i
memmove(a->v + index_, a->v + index_+1, movers*sizeof(*a->v));
a->num--;
}
+
+void
+array_removeval(struct array *a, void *val)
+{
+ unsigned ix;
+
+ ix = array_find(a, val);
+ if (ix != ARRAY_NOTFOUND) {
+ array_remove(a, ix);
+ }
+}
Index: othersrc/usr.bin/dholland-make2/array.h
diff -u othersrc/usr.bin/dholland-make2/array.h:1.3 othersrc/usr.bin/dholland-make2/array.h:1.4
--- othersrc/usr.bin/dholland-make2/array.h:1.3 Mon Mar 4 06:48:03 2013
+++ othersrc/usr.bin/dholland-make2/array.h Mon Mar 4 07:27:54 2013
@@ -58,10 +58,16 @@ void array_cleanup(struct array *);
ARRAYINLINE unsigned array_num(const struct array *);
ARRAYINLINE void *array_get(const struct array *, unsigned index_);
ARRAYINLINE void array_set(const struct array *, unsigned index_, void *val);
+int array_contains(struct array *, void *val);
+unsigned array_find(struct array *, void *val);
int array_setsize(struct array *, unsigned num);
ARRAYINLINE int array_add(struct array *, void *val, unsigned *index_ret);
int array_insert(struct array *a, unsigned index_);
void array_remove(struct array *a, unsigned index_);
+void array_removeval(struct array *a, void *val);
+
+/* failure return for array_find() */
+#define ARRAY_NOTFOUND ((unsigned)-1)
////////////////////////////////////////////////////////////
// inlining for base operations
@@ -173,10 +179,13 @@ array_add(struct array *a, void *val, un
INLINE unsigned ARRAY##_num(const struct ARRAY *a); \
INLINE T *ARRAY##_get(const struct ARRAY *a, unsigned index_); \
INLINE void ARRAY##_set(struct ARRAY *a, unsigned index_, T *val); \
+ INLINE int ARRAY##_contains(struct ARRAY *a, T *val); \
+ INLINE unsigned ARRAY##_find(struct ARRAY *a, T *val); \
INLINE int ARRAY##_setsize(struct ARRAY *a, unsigned num); \
INLINE int ARRAY##_add(struct ARRAY *a, T *val, unsigned *index_ret); \
INLINE int ARRAY##_insert(struct ARRAY *a, unsigned index_); \
- INLINE void ARRAY##_remove(struct ARRAY *a, unsigned index_)
+ INLINE void ARRAY##_remove(struct ARRAY *a, unsigned index_); \
+ INLINE void ARRAY##_removeval(struct ARRAY *a, T *val)
#define DEFARRAY_BYTYPE(ARRAY, T, INLINE) \
@@ -231,6 +240,18 @@ array_add(struct array *a, void *val, un
} \
\
INLINE int \
+ ARRAY##_contains(struct ARRAY *a, T *val) \
+ { \
+ return array_contains(&a->arr, val); \
+ } \
+ \
+ INLINE unsigned \
+ ARRAY##_find(struct ARRAY *a, T *val) \
+ { \
+ return array_find(&a->arr, val); \
+ } \
+ \
+ INLINE int \
ARRAY##_setsize(struct ARRAY *a, unsigned num) \
{ \
return array_setsize(&a->arr, num); \
@@ -252,6 +273,12 @@ array_add(struct array *a, void *val, un
ARRAY##_remove(struct ARRAY *a, unsigned index_) \
{ \
return array_remove(&a->arr, index_); \
+ } \
+ \
+ INLINE void \
+ ARRAY##_removeval(struct ARRAY *a, T *val) \
+ { \
+ return array_removeval(&a->arr, val); \
}
#define DECLARRAY(T, INLINE) DECLARRAY_BYTYPE(T##array, struct T, INLINE)