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