changeset 50:2901c594eaef

And last commit applied to parray too
author David Demelier <markand@malikania.fr>
date Fri, 07 Oct 2011 16:58:58 +0200
parents c7c6e601b154
children 82bbd3b869e3
files parray.c parray.h
diffstat 2 files changed, 44 insertions(+), 38 deletions(-) [+]
line wrap: on
line diff
--- a/parray.c	Fri Oct 07 16:47:55 2011 +0200
+++ b/parray.c	Fri Oct 07 16:58:58 2011 +0200
@@ -27,7 +27,7 @@
 static int	parray_grow(struct parray *);
 
 struct parray *
-parray_new(void *data, int bsize, int type)
+parray_new(enum parray_type type, int length)
 {
 	struct parray *arr;
 
@@ -37,7 +37,7 @@
 	memset(arr, 0, sizeof (struct parray));
 
 	arr->type	= type;
-	arr->bsize	= (bsize == 0) ? PARRAY_DEFAULT_BSIZE : bsize;
+	arr->bsize	= (length == 0) ? PARRAY_DEFAULT_BSIZE : length;
 	arr->size	= LENGTH(arr->bsize);
 
 	if ((arr->datas = calloc(arr->bsize, sizeof (void *))) == NULL) {
@@ -45,9 +45,6 @@
 		return NULL;
 	}
 
-	if (data)
-		arr->datas[0] = data;
-
 	return arr;
 }
 
--- a/parray.h	Fri Oct 07 16:47:55 2011 +0200
+++ b/parray.h	Fri Oct 07 16:58:58 2011 +0200
@@ -21,53 +21,62 @@
 
 #define PARRAY_DEFAULT_BSIZE	128
 
-#define PARRAY_FIXED	0x00
-#define PARRAY_AUTO	0x01
+enum parray_type {
+	PARRAY_FIXED	= 0,
+	PARRAY_AUTO	= 1
+};
 
 struct parray {
-	void	**datas;	/* array of data */
-	int	length;		/* number of element inside */
-	int	type;		/* array's flags (default FIXED) */
-	size_t	size;		/* current buffer size (allocated memory) */
-	int	bsize;		/* block size (used when growing array) */
-
-	/* Private, do not modify */
-	int	_i;	/* only for PARRAY_FOREACH(_R) */
+	enum parray_type type;		/* array type (default FIXED) */
+	void		**datas;	/* array of data */
+	int		length;		/* number of element inside */
+	size_t		size;		/* current buffer size (allocated memory) */
+	int		bsize;		/* block size (used when growing array) */
+	int		i;		/* only for PARRAY_FOREACH(_R) */
 };
 
-struct parray	*parray_new(void *, int, int);
-#define parray_new_auto()	parray_new(NULL, 0, PARRAY_AUTO)
-#define parray_new_fixed(max)	parray_new(NULL, max, PARRAY_FIXED)
+typedef void (*parray_map_fn)(void *, void *);
+typedef int (*parray_cmp_fn)(void *, void *);
 
-int	parray_push(struct parray *, void *);
-int	parray_insert(struct parray *, void *, int);
-int	parray_append(struct parray *, void *);
-void	parray_pop(struct parray *);
-void	parray_unqueue(struct parray *);
-void	parray_remove(struct parray *, int);
-void	parray_unref(struct parray *, const void *);
-int	parray_iswap(struct parray *, int, int);
-int	parray_pswap(struct parray *, const void *, const void *);
-void	parray_map(const struct parray *, void (*fn)(void *, void *), void *);
-void	*parray_find(const struct parray *, int (*fn)(void *, void *), int *, void *);
-void	parray_clear(struct parray *);
-void	parray_free(struct parray *);
+struct parray	*parray_new(enum parray_type, int);
+int		parray_push(struct parray *, void *);
+int		parray_insert(struct parray *, void *, int);
+int		parray_append(struct parray *, void *);
+void		parray_pop(struct parray *);
+void		parray_unqueue(struct parray *);
+void		parray_remove(struct parray *, int);
+void		parray_unref(struct parray *, const void *);
+int		parray_iswap(struct parray *, int, int);
+int		parray_pswap(struct parray *, const void *, const void *);
+void		parray_map(const struct parray *, parray_map_fn, void *);
+void		*parray_find(const struct parray *, parray_cmp_fn, int *, void *);
+void		parray_clear(struct parray *);
+void		parray_free(struct parray *);
 
 #define PARRAY_HEAD(a)								\
 	a->datas[0]
 #define PARRAY_TAIL(a)								\
-	a->datas[a->length - 1]
+	a->datas[(a->length == 0) ? 0 : a->length - 1]
+
+#if 0
 #define PARRAY_INDEX(a, i)							\
-	a->datas[(i < 0 || a->length == 0) ? 0 :				\
-	    (i >= a->length) ? a->length - 1 : i]
+	a->datas[(i < 0 || a->length == 0) ? 0		/* < 0 head */		\
+	    : (i >= a->length) ? a->length - 1		/* > l tail */		\
+	    : i]					/* correct */
+#endif
+
+#define PARRAY_INDEX(a, i)							\
+	((i < 0 || a->length == 0) ? PARRAY_HEAD(a)	/* < 0 head */		\
+	    : (i >= a->length) ? PARRAY_TAIL(a)		/* > l tail */		\
+	    : a->datas[i])				/* correct */
 
 #define PARRAY_FOREACH_R(a, var)						\
-	for ((a)->_i = (a)->length - 1, var = PARRAY_INDEX((a), (a)->_i);	\
-	    (a)->_i >= 0; --(a)->_i, var = PARRAY_INDEX((a), (a)->_i))
+	for ((a)->i = (a)->length - 1, var = PARRAY_INDEX((a), (a)->i);	\
+	    (a)->i >= 0; --(a)->i, var = PARRAY_INDEX((a), (a)->i))
 
 #define PARRAY_FOREACH(a, var)							\
-	for ((a)->_i = 0, var = PARRAY_INDEX((a), (a)->_i);			\
-	    (a)->_i < (a)->length; ++(a)->_i, var = PARRAY_INDEX((a), (a)->_i))
+	for ((a)->i = 0, var = PARRAY_INDEX((a), (a)->i);			\
+	    (a)->i < (a)->length; ++(a)->i, var = PARRAY_INDEX((a), (a)->i))
 
 #define PARRAY_FLUSH(a)								\
 do {										\