changeset 48:cdae3689f1b6

Update of array and cosmetic in ARRAY_ macros
author David Demelier <markand@malikania.fr>
date Fri, 07 Oct 2011 16:46:31 +0200
parents fea13579acbe
children c7c6e601b154
files array.c array.h
diffstat 2 files changed, 40 insertions(+), 42 deletions(-) [+]
line wrap: on
line diff
--- a/array.c	Fri Oct 07 16:10:33 2011 +0200
+++ b/array.c	Fri Oct 07 16:46:31 2011 +0200
@@ -27,7 +27,7 @@
 static int	array_grow(struct array *);
 
 struct array *
-array_new(const void *data, size_t unit, int bsize, int type)
+array_new(enum array_type type, size_t unit, int length)
 {
 	struct array *arr;
 
@@ -35,9 +35,8 @@
 		return NULL;
 
 	memset(arr, 0, sizeof (struct array));
-
 	arr->type	= type;
-	arr->bsize	= (bsize == 0) ? ARRAY_DEFAULT_BSIZE : bsize;
+	arr->bsize	= (length == 0) ? ARRAY_DEFAULT_BSIZE : length;
 	arr->unit	= unit;
 	arr->size	= OFFSET(arr->bsize);
 
@@ -46,9 +45,6 @@
 		return NULL;
 	}
 
-	if (data)
-		memcpy(arr->data, data, arr->unit);
-
 	return arr;
 }
 
@@ -171,6 +167,8 @@
 int
 array_iswap(struct array *arr, int i1, int i2)
 {
+	void *tmp;
+
 	/* Out of bounds */
 	if (i1 >= arr->length || i1 < 0 || i2 >= arr->length || i2 < 0)
 		return -1;
@@ -180,19 +178,21 @@
 	 * function.
 	 */
 
-	if (arr->_tmp == NULL && (arr->_tmp = malloc(arr->unit)) == NULL)
+	if ((tmp = malloc(arr->unit)) == NULL)
 		return -1;
 
-	memcpy((char *) arr->_tmp, (char *) arr->data + OFFSET(i1), arr->unit);
+	memcpy((char *) tmp, (char *) arr->data + OFFSET(i1), arr->unit);
 	memcpy((char *) arr->data + OFFSET(i1), (char *) arr->data + OFFSET(i2),
 	    arr->unit);
-	memcpy((char *) arr->data + OFFSET(i2), (char *) arr->_tmp, arr->unit);
+	memcpy((char *) arr->data + OFFSET(i2), (char *) tmp, arr->unit);
 
 	/*
-	 * Clear bytes for safety.
+	 * Clear bytes for safety you probably don't want a password or
+	 * secure data to be left somewhere in the memory.
 	 */
 
-	memset(arr->_tmp, 0, arr->unit);
+	memset(tmp, 0, arr->unit);
+	free(tmp);
 
 	return 0;
 }
@@ -285,8 +285,6 @@
 
 	if (arr->data)
 		free(arr->data);
-	if (arr->_tmp)
-		free(arr->_tmp);
 
 	free(arr);
 }
--- a/array.h	Fri Oct 07 16:10:33 2011 +0200
+++ b/array.h	Fri Oct 07 16:46:31 2011 +0200
@@ -21,8 +21,10 @@
 
 #define ARRAY_DEFAULT_BSIZE	128
 
-#define ARRAY_FIXED	0x00
-#define ARRAY_AUTO	0x01
+enum array_type {
+	ARRAY_FIXED	= 0,
+	ARRAY_AUTO	= 1
+};
 
 struct array {
 	void	*data;	/* array of data */
@@ -31,44 +33,42 @@
 	size_t	size;	/* current buffer size (allocated memory) */
 	size_t	unit;	/* unit size (sizeof the object) */
 	int	bsize;	/* block size (used when growing array) */
-
-	/* Private, do not modify */
-	void	*_tmp;	/* only used for array_swap() */
-	int	_i;	/* only for ARRAY_FOREACH(_R) */
+	int	i;	/* only for ARRAY_FOREACH(_R) */
 };
 
-struct array	*array_new(const void *, size_t, int, int);
-#define array_new_auto(size)		array_new(NULL, size, 0, ARRAY_AUTO)
-#define array_new_fixed(size, max)	array_new(NULL, size, max, ARRAY_FIXED)
+typedef void (*array_map_fn)(void *, void *);
+typedef int (*array_cmp_fn)(void *, void *);
 
-int	array_push(struct array *, const void *);
-int	array_insert(struct array *, const void *, int);
-int	array_append(struct array *, const void *);
-void	array_pop(struct array *);
-void	array_unqueue(struct array *);
-void	array_remove(struct array *, int);
-void	array_unref(struct array *, const void *);
-int	array_iswap(struct array *, int, int);
-int	array_pswap(struct array *, const void *, const void *);
-void	array_map(const struct array *, void (*fn)(void *, void *), void *);
-void	*array_find(const struct array *, int (*fn)(void *, void *), int *, void *);
-void	array_clear(struct array *);
-void	array_free(struct array *);
+struct array	*array_new(enum array_type, size_t, int);
+int		array_push(struct array *, const void *);
+int		array_insert(struct array *, const void *, int);
+int		array_append(struct array *, const void *);
+void		array_pop(struct array *);
+void		array_unqueue(struct array *);
+void		array_remove(struct array *, int);
+void		array_unref(struct array *, const void *);
+int		array_iswap(struct array *, int, int);
+int		array_pswap(struct array *, const void *, const void *);
+void		array_map(const struct array *, array_map_fn, void *);
+void		*array_find(const struct array *, array_cmp_fn, int *, void *);
+void		array_clear(struct array *);
+void		array_free(struct array *);
 
 #define ARRAY_HEAD(a)								\
 	a->data
 #define ARRAY_TAIL(a)								\
-	(void *) ((char *) a->data + (a->unit * (a->length - 1)))
+	(void *) ((char *) a->data +						\
+	    (a->unit * ((a->length == 0) ? 0 : (a->length - 1))))
+
 #define ARRAY_INDEX(a, i)							\
-	(void *) ((char *) a->data + (a->unit *					\
-	    ((i >= a->length) ? (a->length -1) : i)))
+	(void *) (i < 0 || a->length == 0) ? ARRAY_HEAD(a)	/* < 0 head */	\
+	    : (i >= a->length) ? ARRAY_TAIL(a)			/* > l tail */	\
+	    : ((char *) a->data + (a->unit * i))		/* correct */
 
 #define ARRAY_FOREACH(a, var)							\
-	for (a->_i = 0, var = a->data; a->_i < a->length; ++a->_i, ++var)
+	for (a->i = 0, var = a->data; a->i < a->length; ++a->i, ++var)
 
 #define ARRAY_FOREACH_R(a, var)							\
-	for (a->_i = 0,								\
-	    var = (void *) ((char *) a->data + a->unit * (a->length - 1));	\
-	    a->_i < a->length; ++a->_i, --var)	
+	for (a->i = 0, var = ARRAY_TAIL(a); a->i < a->length; ++a->i, --var)
 
 #endif /* _ARRAY_H_ */