changeset 58:669f2734557d

Use gcc/clang attributes when possible
author David Demelier <markand@malikania.fr>
date Wed, 09 Nov 2011 18:36:04 +0100
parents 311eaa9d004c
children 8a8db17c02a4
files array.h
diffstat 1 files changed, 23 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/array.h	Wed Nov 09 18:35:35 2011 +0100
+++ b/array.h	Wed Nov 09 18:36:04 2011 +0100
@@ -19,6 +19,15 @@
 #ifndef _ARRAY_H_
 #define _ARRAY_H_
 
+/* Add some nonnull attributes for gcc/clang */
+#ifdef __GNUC__
+#define __at_malloc		__attribute__ ((malloc))
+#define __at_nonnull(...)	__attribute__ ((nonnull (__VA_ARGS__)))
+#else
+#define __at_malloc
+#define __at_nonnull(...)
+#endif
+
 #define ARRAY_DEFAULT_BSIZE	128
 
 enum array_type {
@@ -39,20 +48,20 @@
 typedef void (*array_map_fn)(void *, void *);
 typedef int (*array_cmp_fn)(void *, void *);
 
-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 *);
+struct array	*array_new(enum array_type, size_t, int) __at_malloc;
+int		array_push(struct array *, const void *) __at_nonnull(1, 2);
+int		array_insert(struct array *, const void *, int) __at_nonnull(1, 2);
+int		array_append(struct array *, const void *) __at_nonnull(1, 2);
+void		array_pop(struct array *) __at_nonnull(1);
+void		array_unqueue(struct array *) __at_nonnull(1);
+void		array_remove(struct array *, int) __at_nonnull(1);
+void		array_unref(struct array *, const void *) __at_nonnull(1);
+int		array_iswap(struct array *, int, int) __at_nonnull(1);
+int		array_pswap(struct array *, const void *, const void *) __at_nonnull(1);
+void		array_map(const struct array *, array_map_fn, void *) __at_nonnull(1, 2);
+void		*array_find(const struct array *, array_cmp_fn, int *, void *) __at_nonnull(1, 2);
+void		array_clear(struct array *) __at_nonnull(1);
+void		array_free(struct array *) __at_nonnull(1);
 
 #define ARRAY_HEAD(a)								\
 	(a->data)
@@ -71,5 +80,4 @@
 #define ARRAY_FOREACH(a, var)							\
 	for ((a)->i = 0, var = (a)->data; (a)->i < (a)->length; ++(a)->i, ++var)
 
-
 #endif /* _ARRAY_H_ */