1 /* radare - LGPL - Copyright 2010-2013 - pancake */
2 // XXX. this is dupped inside the r_flist.h for optimizations
3 
r_flist_iterator(void ** x)4 int r_flist_iterator(void **x) {
5 	return *x!=0;
6 }
r_flist_next(void ** x)7 void** r_flist_next(void **x) {
8 	return x;
9 }
r_flist_get(void ** x)10 void** r_flist_get(void **x) {
11 	return *(x++);
12 }
13 // XXX: forced free?? We need RFlist struct here
14 #include <r_types.h>
15 //#include <r_flist.h>
16 // NOTE: reimplemnetation of r_flist in C (if no R_API defined)
17 
18 #if 1
19 #define r_flist_t void**
20 #define RFList void**
21 #define r_flist_rewind(it) for (; (it)!=*(it); (it)--) {} (it)++
22 #define r_flist_next(it) *(it)!=0
23 #define r_flist_get(it) *((it)++)
24 #define r_flist_iterator(x) x
25 #define r_flist_unref(x) x
26 #endif
27 
r_flist_new(int n)28 R_API void **r_flist_new(int n) {
29 	void **it;
30 	if (!(it = (void **)calloc (n + 2, sizeof (void*)))) {
31 		return NULL;
32 	}
33 	*it = it;
34 	memset (++it, 0, (n + 1) * sizeof (void*));
35 	return it;
36 }
37 
38 // XXX. this is wrong :?
r_flist_resize(void ** it,int n)39 R_API void **r_flist_resize(void **it, int n) {
40 	r_flist_rewind (it);
41 	it--;
42 	it = realloc (it, ((n+2) * sizeof (void*)));
43 	*it = it;
44 	return it+1;
45 }
46 
r_flist_prev(void ** it)47 R_API void **r_flist_prev(void **it) {
48 	void **p = it--;
49 	return (it==*it)?p:it;
50 }
51 
r_flist_set(void ** it,int idx,void * data)52 R_API void r_flist_set(void **it, int idx, void *data) {
53 	r_flist_rewind (it);
54 	it[idx] = data;
55 }
56 
r_flist_delete(void ** it,int idx)57 R_API void r_flist_delete(void **it, int idx) {
58 	r_flist_rewind (it);
59 	free (it[idx]);
60 	it[idx] = NULL;
61 	for (it += idx; *it; it++) {
62 		*it = *(it + 1);
63 	}
64 }
65 
66 #define r_flist_foreach(it, pos) \
67 	r_flist_rewind(it); \
68 	while (r_flist_next (it) && ((pos) = r_flist_get (it)))
69 
r_flist_free(void ** it)70 R_API void r_flist_free(void **it) {
71 	void *pos;
72 	r_flist_foreach (it, pos) {
73 		free (pos);
74 	}
75 	r_flist_rewind (it);
76 	free (--it);
77 }
78 
r_flist_length(void ** it)79 R_API int r_flist_length (void **it) {
80 	void *pos;
81 	int len = 0;
82 	r_flist_foreach (it, pos) {
83 		len++;
84 	}
85 	return len;
86 }
87