dynamiC  0.1
dynamic_list.c
Go to the documentation of this file.
1 
15 #include "dynamic.h"
16 
17 #define LST_CONT(X) X->data.list->container
18 #define LST_SPACE(X) X->data.list->space
19 
20 
38 {
39  dyn_free(dyn);
40 
41  dyn_list *list = (dyn_list*) malloc(sizeof(dyn_list));
42 
43  if (list) {
44 
45  list->container = (dyn_c*) malloc(len * sizeof(dyn_c));
46 
47  if (list->container) {
48  list->space = len;
49  list->length = 0;
50 
51  // Initialize all elements in list with NONE
52  while (len--)
53  DYN_INIT(&list->container[len]);
54 
55  dyn->type = LIST;
56  dyn->data.list = list;
57  return DYN_TRUE;
58  }
59  free(list);
60  }
61  return DYN_FALSE;
62 }
63 
67 void dyn_list_free (dyn_c* dyn)
68 {
69  dyn_ushort len = DYN_LIST_LEN(dyn);
70 
71  // free all elements within the allocated container element
72  dyn_c *ptr = dyn->data.list->container;
73  while (len--) {
74  dyn_free(ptr++);
75  }
76 
77  free(dyn->data.list->container);
78  free(dyn->data.list);
79 }
80 
92 {
93  dyn_list *ptr = list->data.list;
94 
95  dyn_c* new_list = (dyn_c*) realloc(ptr->container, size * sizeof(dyn_c));
96 
97  if (new_list) {
98  ptr->container = new_list;
99 
100  if (ptr->space < size) {
101  dyn_ushort i = ptr->length;
102  for(; i<size; ++i)
103  DYN_INIT(&ptr->container[i]);
104  }
105 
106  ptr->space = size;
107  return DYN_TRUE;
108  }
109 
110  return DYN_FALSE;
111 }
112 
124 dyn_c* dyn_list_push (dyn_c* list, const dyn_c* element)
125 {
126  dyn_list *ptr = list->data.list;
127 
128  if (ptr->length == ptr->space)
129  if (!dyn_list_resize(list, ptr->space + LIST_DEFAULT))
130  return NULL;
131 
132  dyn_copy(element, &ptr->container[ ptr->length++ ]);
133 
134  return &ptr->container[ ptr->length-1 ];
135 }
136 
147 {
148  dyn_list *ptr = list->data.list;
149  if (ptr->length == ptr->space)
150  if (!dyn_list_resize(list, ptr->space + LIST_DEFAULT))
151  return NULL;
152 
153  return &ptr->container[ ptr->length++ ];
154 }
155 
173 {
174  dyn_list *ptr = list->data.list;
175  if (ptr->length > i) {
176  for(; i<ptr->length-1; ++i) {
177  dyn_move(&ptr->container[i+1], &ptr->container[i]);
178  }
179  dyn_list_popi(list, 1);
180  }
181  return DYN_TRUE;
182 }
183 
200 {
201  dyn_ushort n = DYN_LIST_LEN(list);
202  if (n >= i) {
203  dyn_list_push_none(list);
204 
205  dyn_c *ptr = list->data.list->container;
206 
207  ++n;
208  while(--n > i)
209  dyn_move(&ptr[n-1], &ptr[n]);
210 
211  dyn_move(element, &ptr[i]);
212  }
213  return DYN_TRUE;
214 }
215 
226 {
227  dyn_list *ptr = list->data.list;
228 
229  dyn_move(&ptr->container[--ptr->length], element);
230 
231  if (ptr->space - ptr->length > LIST_DEFAULT)
232  if (!dyn_list_resize(list, ptr->space - LIST_DEFAULT))
233  return DYN_FALSE;
234 
235  return DYN_TRUE;
236 }
237 
243 {
244  while(i--)
245  dyn_free(&list->data.list->container[ --list->data.list->length ]);
246 
247  return DYN_TRUE;
248 }
249 
264 trilean dyn_list_get (const dyn_c* list, dyn_c* element, const dyn_short i)
265 {
266  dyn_free(element);
267 
268  dyn_c* ptr = dyn_list_get_ref(list, i);
269 
270  if (ptr) {
271  return dyn_copy(ptr, element);
272  }
273 
274  return DYN_FALSE;
275 }
276 
290 {
291  dyn_list *ptr = list->data.list;
292  if (i >= 0 && i<= ptr->length)
293  return &ptr->container[i];
294  else if (i < 0 && -i <= ptr->length)
295  return &ptr->container[ ptr->length+i ];
296  return NULL;
297 }
298 
309 {
310  dyn_ushort len = DYN_LIST_LEN(list);
311 
312  if (dyn_set_list_len(copy, len)) {
313  list = list->data.list->container;
314  while (len--) {
315  if (!dyn_list_push(copy, list++)) {
316  dyn_free(copy);
317  return DYN_FALSE;
318  }
319  }
320  return DYN_TRUE;
321  }
322  return DYN_FALSE;
323 }
324 
334 {
335  dyn_ushort size = DYN_LIST_LEN(list)+1;
336  dyn_ushort len = 2 + size;
337 
338  while (--size)
339  len += dyn_string_len(DYN_LIST_GET_REF(list, size-1));
340 
341  return len;
342 }
343 
352 {
353  dyn_strcat(str, "[");
354  dyn_ushort len = DYN_LIST_LEN(list);
355 
356  if (len == 0) {
357  dyn_strcat(str, "]");
358  return;
359  }
360 
361  dyn_ushort i;
362  for (i=0; i<len; i++) {
363  dyn_string_add(DYN_LIST_GET_REF(list, i), str);
364  dyn_strcat(str, ",");
365  }
366  str[dyn_strlen(str)-1] = ']';
367 }
represents boolean false
Definition: dynamic_types.h:23
represents boolean true
Definition: dynamic_types.h:24
dyn_list * list
pointer to dynamic list
dyn_ushort dyn_strlen(dyn_const_str str)
Returns the length of an string.
dyn_list * list
pointer to dynamic list
Definition: dynamic_types.h:62
trilean dyn_list_remove(dyn_c *list, dyn_ushort i)
Delete the ith element from a list.
Definition: dynamic_list.c:172
trilean dyn_list_insert(dyn_c *list, dyn_c *element, const dyn_ushort i)
Insert a new element at the ith position into a list.
Definition: dynamic_list.c:199
#define DYN_LIST_LEN(dyn)
Return list length.
Definition: dynamic.h:123
dyn_c * container
pointer to an array of dynamic elements
dyn_int i
basic integer
Definition: dynamic_types.h:59
trilean dyn_copy(const dyn_c *dyn, dyn_c *copy)
Deep copy dynamic element.
Dynamic data types as part of the SelectScript-VM implementation.
dyn_ushort space
elements available
trilean dyn_list_popi(dyn_c *list, dyn_short i)
Pop i elements from the end of a list.
Definition: dynamic_list.c:242
#define DYN_INIT(dyn)
Mandatory initialization for dynamic elements (NONE)
Definition: dynamic.h:38
#define DYN_LIST_GET_REF(dyn, i)
Return the reference to the ith element within a dynamic list.
Definition: dynamic.h:125
dyn_c * dyn_list_push_none(dyn_c *list)
Push NONE element to the end of a list.
Definition: dynamic_list.c:146
trilean dyn_list_get(const dyn_c *list, dyn_c *element, const dyn_short i)
Copy the ith element of a list to param element.
Definition: dynamic_list.c:264
void * ptr
pointer to function
Definition: dynamic_types.h:57
list of type dyn_list
Definition: dynamic_types.h:67
dyn_ushort length
elements in use
Definition: dynamic_types.h:56
int16_t dyn_short
16bit signed integer
Definition: dynamic_types.h:46
uint16_t dyn_ushort
16bit unsigned integer
Definition: dynamic_types.h:43
void dyn_string_add(const dyn_c *dyn, dyn_str string)
Add string representation of dynamic element to string.
dyn_ushort length
elements in use
dyn_str str
pointer to character-array
Definition: dynamic_types.h:61
void dyn_move(dyn_c *from, dyn_c *to)
Move dynamic element to new reference, from is of type NONE afterwards.
dyn_c * dyn_list_get_ref(const dyn_c *list, const dyn_short i)
Return a reference to the ith element within list, negative values are allowed.
Definition: dynamic_list.c:289
dyn_ushort dyn_string_len(const dyn_c *dyn)
Calculate length of string representation of dynamic element.
trilean dyn_list_pop(dyn_c *list, dyn_c *element)
Pop the last element from the list and move it to param element.
Definition: dynamic_list.c:225
Basic container for lists.
dyn_c * dyn_list_push(dyn_c *list, const dyn_c *element)
Push new element to the end of a list.
Definition: dynamic_list.c:124
void dyn_strcat(dyn_str destination, dyn_const_str source)
Concatenate strings.
trilean
basic return type for truth values
Definition: dynamic_types.h:22
trilean dyn_list_copy(const dyn_c *list, dyn_c *copy)
Make a deep copy of the entire list.
Definition: dynamic_list.c:308
void dyn_list_string_add(const dyn_c *list, dyn_str str)
Add string representation of a list to str.
Definition: dynamic_list.c:351
void dyn_free(dyn_c *dyn)
free allocated memory
Definition: dynamic.c:30
void dyn_list_free(dyn_c *dyn)
Free the allocated memory of the entire list and set it to NONE.
Definition: dynamic_list.c:67
trilean dyn_list_resize(dyn_c *list, dyn_ushort size)
Change the maximal space of a list.
Definition: dynamic_list.c:91
char * dyn_str
Standard dynamic C string.
Definition: dynamic_types.h:36
char type
type definition
dyn_ushort dyn_list_string_len(const dyn_c *list)
Return the length of the string representation of a list.
Definition: dynamic_list.c:333
trilean dyn_set_list_len(dyn_c *dyn, dyn_ushort len)
Set dynamic element to list with maximal length.
Definition: dynamic_list.c:37
Basic container for dynamic data types.
Definition: dynamic_types.h:98