dynamiC  0.1
dynamic_dict.c
Go to the documentation of this file.
1 
15 #include "dynamic.h"
16 
26 {
27  dyn_free(dyn);
28 
29  dyn_dict *dict = (dyn_dict*) malloc(sizeof(dyn_dict));
30 
31  if (dict) {
32  DYN_INIT(&dict->value);
33  if (dyn_set_list_len(&dict->value, length)) {
34  dict->key = (dyn_str*) malloc(length * sizeof(dyn_str*));
35  if (dict->key) {
36  dyn_ushort i;
37  for (i=0; i<length; ++i)
38  dict->key[i] = NULL;
39 
40  dyn->type = DICT;
41  dyn->data.dict = dict;
42  return DYN_TRUE;
43  }
44  dyn_free(&dict->value);
45  }
46  free(dict);
47  }
48 
49  return DYN_FALSE;
50 }
51 
66 {
67  dyn_dict* ptr = dict->data.dict;
69  dyn_ushort i = dyn_dict_has_key(dict, key);
70  if (i--)
71  goto GOTO__CHANGE; //return dyn_dict_change(dyn, i-1, value);
72 
73  if (DYN_DICT_LENGTH(ptr) == space) {
74  dyn_dict_resize(dict, space + DICT_DEFAULT);
75  /*if (dyn_list_resize(&dyn->data.dict->value, space)) {
76  dyn->data.dict->key = (dyn_str*) realloc(dyn->data.dict->key, space * sizeof(dyn_str*));
77  if (dyn->data.dict->key) {
78  for (i=space - DICT_DEFAULT; i<space; ++i)
79  dyn->data.dict->key[i] = NULL;
80  }
81  }*/
82  }
83 
84  i = DYN_DICT_LENGTH(ptr);
85  ptr->key[i] = (dyn_str) malloc(dyn_strlen(key)+1);
86  if (ptr->key[i]) {
87  dyn_strcpy(ptr->key[i], key);
88  DYN_DICT_LENGTH(ptr)++;
89 
90 GOTO__CHANGE:
91  dyn_dict_change(dict, i, value);
92  return dyn_dict_get_i_ref(dict, i);
93  }
94 
95  return NULL;
96 }
97 
109 {
110  dyn_dict* ptr = dict->data.dict;
111 
113 
114  if (size > space)
115  if (dyn_list_resize(&ptr->value, size)) {
116  ptr->key = (dyn_str*) realloc(ptr->key, size * sizeof(dyn_str*));
117  if (ptr->key) {
118  for (; space<size; ++space)
119  ptr->key[space] = NULL;
120  return DYN_TRUE;
121  }
122  }
123 
124  return DYN_FALSE;
125 }
126 
127 
129 {
130  return dyn_copy(value, DYN_LIST_GET_REF(&dict->data.dict->value, i));
131 }
132 
146 {
147  dyn_char** s_key = dict->data.dict->key;
148  dyn_ushort length = DYN_DICT_LENGTH(dict->data.dict);
149  dyn_ushort i;
150  for (i=0; i<length; ++i, ++s_key) {
151  if (!dyn_strcmp(*s_key, key))
152  return i+1;
153  }
154 
155  return 0;
156 }
157 
169 {
170  return dyn_list_get_ref(&dict->data.dict->value, i);
171 }
172 
184 {
185  return dict->data.dict->key[i];
186 }
187 
200 {
201  dyn_dict* ptr = dict->data.dict;
202  dyn_ushort i = dyn_dict_has_key(dict, key);
203 
204  if(i) {
205  free(ptr->key[--i]);
206  ptr->key[i] = NULL;
207  dyn_free(DYN_DICT_GET_I_REF(dict, i));
208  ptr->value.data.list->length--;
209 
210  // if not last element
211  if (i != ptr->value.data.list->length && ptr->value.data.list->length) {
212  ptr->key[i] = ptr->key[ptr->value.data.list->length];
213  ptr->key[ptr->value.data.list->length] = NULL;
214  dyn_move(DYN_DICT_GET_I_REF(dict, ptr->value.data.list->length),
215  DYN_DICT_GET_I_REF(dict, i));
216  }
217 
218  return DYN_TRUE;
219  }
220 
221  return DYN_FALSE;
222 }
223 
230 {
231  dyn_dict* ptr = dict->data.dict;
232 
234  while (i--) {
235  free(ptr->key[i]);
236  ptr->key[i] = NULL;
237  dyn_free(DYN_DICT_GET_I_REF(dict, i));
238  }
239  ptr->value.data.list->length = 0;
240 }
241 
246 {
247  dyn_dict_empty(dict);
248  dyn_free(&dict->data.dict->value);
249  free(dict->data.dict->key);
250  free(dict->data.dict);
251 }
252 
265 {
266  dyn_ushort pos = dyn_dict_has_key(dict, key);
267 
268  if (pos)
269  return DYN_DICT_GET_I_REF(dict, --pos);
270 
271  return NULL;
272 }
273 
275 {
276  dyn_dict* ptr = dict->data.dict;
278 
279  if (dyn_set_dict(copy, length)) {
280  dyn_ushort i;
281  for (i=0; i<length; ++i) {
282  if(!dyn_dict_insert(copy, ptr->key[i],
283  DYN_DICT_GET_I_REF(dict, i))) {
284  dyn_free(copy);
285  return DYN_FALSE;
286  }
287  }
288  }
289  return DYN_TRUE;
290 }
291 
292 
294 {
295  dyn_dict* ptr = dict->data.dict;
296  dyn_ushort len = DYN_DICT_LENGTH(ptr);
297  if (len) {
298  dyn_ushort i = len;
299  while (i--) {
300  len += dyn_strlen(ptr->key[i]);
301  len += dyn_string_len(DYN_DICT_GET_I_REF(dict, i));
302  len += 2; // comma and colon
303  }
304  }
305  len += 2;
306 
307  return len;
308 }
309 
310 
311 void dyn_dict_string_add (const dyn_c* dict, dyn_str string)
312 {
313  dyn_strcat(string, "{");
314 
315  if ( dyn_length(dict) ) {
316  dyn_ushort length = dict->data.dict->value.data.list->length;
317  dyn_ushort i;
318  for (i=0; i<length; ++i) {
319  dyn_strcat(string, DYN_DICT_GET_I_KEY(dict, i));
320  dyn_strcat(string, ":");
321  dyn_string_add(DYN_DICT_GET_I_REF(dict, i), string);
322  dyn_strcat(string, ",");
323  }
324  string[dyn_strlen(string)-1] = '}';
325  }
326  else
327  dyn_strcat(string, "}");
328 }
represents boolean false
Definition: dynamic_types.h:23
const char * dyn_const_str
Standard dynamic C const string.
Definition: dynamic_types.h:39
represents boolean true
Definition: dynamic_types.h:24
dyn_list * list
pointer to dynamic list
trilean dyn_dict_remove(dyn_c *dict, dyn_const_str key)
Remove key-value pair from dictionary.
Definition: dynamic_dict.c:199
dictionary of type dyn_dict
Definition: dynamic_types.h:69
dyn_ushort dyn_strlen(dyn_const_str str)
Returns the length of an string.
void dyn_strcpy(dyn_str destination, dyn_const_str source)
Copy string.
dyn_c * dyn_dict_insert(dyn_c *dict, dyn_const_str key, dyn_c *value)
Insert a new key-value pair into the dictionary.
Definition: dynamic_dict.c:65
dyn_c value
dynamic element of type dyn_list
Definition: dynamic_types.h:57
trilean dyn_dict_change(dyn_c *dict, const dyn_ushort i, const dyn_c *value)
Replace the ith element in a dictionary with a new value.
Definition: dynamic_dict.c:128
dyn_c * dyn_dict_get(const dyn_c *dict, dyn_const_str key)
Get the reference to value stored at key.
Definition: dynamic_dict.c:264
void dyn_dict_string_add(const dyn_c *dict, dyn_str string)
Add the dict-string representation to string.
Definition: dynamic_dict.c:311
dyn_str dyn_dict_get_i_key(const dyn_c *dict, const dyn_ushort i)
Get the reference to ith key in dict.
Definition: dynamic_dict.c:183
void dyn_dict_empty(dyn_c *dict)
todo
Definition: dynamic_dict.c:229
dyn_ushort dyn_dict_has_key(const dyn_c *dict, dyn_const_str key)
Check if dict has key and return its position - 1 (returns 0 if not found)
Definition: dynamic_dict.c:145
dyn_dict * dict
pointer to dynamic dictionary
Definition: dynamic_types.h:63
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.
#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_ushort space
elements available
Definition: dynamic_types.h:57
dyn_c * dyn_dict_get_i_ref(const dyn_c *dict, const dyn_ushort i)
Get the reference to ith value in dict.
Definition: dynamic_dict.c:168
void * ptr
pointer to function
Definition: dynamic_types.h:57
dyn_ushort dyn_dict_string_len(const dyn_c *dict)
Calculate the required string length.
Definition: dynamic_dict.c:293
#define DYN_DICT_GET_I_REF(dyn, i)
Return a reference to the ith element stored within a dictionary.
Definition: dynamic.h:191
#define DYN_DICT_GET_I_KEY(dyn, i)
Return a reference to the ith key stored within a dictionary.
Definition: dynamic.h:194
dyn_ushort length
elements in use
Definition: dynamic_types.h:56
char dyn_char
Basic 8bit signed integer.
Definition: dynamic_types.h:30
Basic container for dictionaries.
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
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.
dyn_dict * dict
pointer to dynamic dictionary
dyn_c value
dynamic element of type dyn_list
dyn_str * key
array to C strings used as identifiers
Definition: dynamic_types.h:56
trilean dyn_dict_copy(const dyn_c *dict, dyn_c *copy)
Copy the entire dict.
Definition: dynamic_dict.c:274
void dyn_strcat(dyn_str destination, dyn_const_str source)
Concatenate strings.
dyn_str * key
array to C strings used as identifiers
trilean
basic return type for truth values
Definition: dynamic_types.h:22
trilean dyn_dict_resize(dyn_c *dict, dyn_ushort size)
Set the available space for elements.
Definition: dynamic_dict.c:108
#define DYN_DICT_SPACE(dyn)
Return the maximal usable number of elements of a dictionary.
Definition: dynamic.h:196
dyn_char dyn_strcmp(dyn_const_str a, dyn_const_str b)
Compares the string a to the string b.
dyn_ushort dyn_length(const dyn_c *dyn)
Reterns the length of an element.
void dyn_dict_free(dyn_c *dict)
Free all allocated memory.
Definition: dynamic_dict.c:245
#define DYN_DICT_LENGTH(dyn)
Return the number of elements stored within a dictionary.
Definition: dynamic.h:198
trilean dyn_set_dict(dyn_c *dyn, dyn_ushort length)
Set dyn to a dictionary with a max. length of elements.
Definition: dynamic_dict.c:25
void dyn_free(dyn_c *dyn)
free allocated memory
Definition: dynamic.c:30
trilean dyn_list_resize(dyn_c *list, const 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
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