libamxc  1.10.3
C Generic Data Containers
variant_list.c File Reference
#include <stdlib.h>
#include <string.h>
#include <amxc/amxc_string.h>
#include <amxc/amxc_string_join.h>
#include <amxc_variant_priv.h>

Go to the source code of this file.

Functions

static int variant_list_init (amxc_var_t *const var)
 
void variant_list_it_free (amxc_llist_it_t *it)
 Helper functions, can be used as delete function for linked lists. More...
 
static void variant_list_delete (amxc_var_t *var)
 
static int variant_list_copy_list (amxc_var_t *const dest, const amxc_llist_t *source_list)
 
static int variant_list_copy (amxc_var_t *const dest, const amxc_var_t *const src)
 
static int variant_list_move (amxc_var_t *const dest, amxc_var_t *const src)
 
static int variant_list_to_csv_string (amxc_var_t *const dest, const amxc_var_t *const src)
 
static int variant_list_to_ssv_string (amxc_var_t *const dest, const amxc_var_t *const src)
 
static int variant_list_to_number (amxc_var_t *const dest, const amxc_var_t *const src)
 
static int variant_list_to_bool (amxc_var_t *const dest, const amxc_var_t *const src)
 
static int variant_list_to_htable (amxc_var_t *const dest, const amxc_var_t *const src)
 
static int variant_list_convert_to (amxc_var_t *const dest, const amxc_var_t *const src)
 
static amxc_var_tvariant_list_get_index (const amxc_var_t *const src, const int64_t index, int flags)
 
static int variant_list_set_index (amxc_var_t *const dest, amxc_var_t *const src, const int64_t index, int flags)
 
static amxc_var_tvariant_list_get_key (const amxc_var_t *const src, const char *const key, int flags)
 
static int variant_list_set_key (amxc_var_t *const dest, amxc_var_t *const src, const char *const key, int flags)
 
static int variant_list_compare (const amxc_var_t *const lval, const amxc_var_t *const rval, int *const result)
 
static CONSTRUCTOR void amxc_var_list_init (void)
 
static DESTRUCTOR void amxc_var_list_cleanup (void)
 
amxc_llist_tamxc_var_get_amxc_llist_t (const amxc_var_t *const var)
 Conversion helper function. More...
 
const amxc_llist_tamxc_var_get_const_amxc_llist_t (const amxc_var_t *const var)
 Conversion helper function. More...
 
amxc_var_tamxc_var_add_new_amxc_llist_t (amxc_var_t *const var, const amxc_llist_t *list)
 Conversion helper function. More...
 
amxc_var_tamxc_var_add_new_key_amxc_llist_t (amxc_var_t *const var, const char *key, const amxc_llist_t *list)
 Conversion helper function. More...
 

Variables

static amxc_var_type_t amxc_variant_list
 

Function Documentation

◆ amxc_var_list_cleanup()

static DESTRUCTOR void amxc_var_list_cleanup ( void  )
static

Definition at line 381 of file variant_list.c.

381  {
383 }
int PRIVATE amxc_var_remove_type(amxc_var_type_t *const type)
static amxc_var_type_t amxc_variant_list
Definition: variant_list.c:360

◆ amxc_var_list_init()

static CONSTRUCTOR void amxc_var_list_init ( void  )
static

Definition at line 377 of file variant_list.c.

377  {
379 }
uint32_t PRIVATE amxc_var_add_type(amxc_var_type_t *const type, const uint32_t index)
#define AMXC_VAR_ID_LIST
Ambiorix Linked List variant id.
Definition: amxc_variant.h:206

◆ variant_list_compare()

static int variant_list_compare ( const amxc_var_t *const  lval,
const amxc_var_t *const  rval,
int *const  result 
)
static

Definition at line 335 of file variant_list.c.

337  {
338  int ret = 0;
340 
342  when_null_status(r_it, exit, *result = 1);
343 
346  result);
347  when_false((ret == 0) && (*result == 0), exit);
348 
349  r_it = amxc_llist_it_get_next(r_it);
350  }
351 
352  if(r_it != NULL) {
353  *result = -1;
354  }
355 
356 exit:
357  return ret;
358 }
#define when_false(x, l)
Definition: amxc_macros.h:138
#define when_null_status(x, l, c)
Definition: amxc_macros.h:150
AMXC_INLINE amxc_llist_it_t * amxc_llist_it_get_next(const amxc_llist_it_t *const reference)
Gets the next iterator in the list.
Definition: amxc_llist.h:824
#define amxc_llist_it_get_data(it, type, member)
Gets the data pointer from a linked list iterator.
Definition: amxc_llist.h:238
#define amxc_llist_iterate(it, list)
Loops over the list from head to tail.
Definition: amxc_llist.h:270
AMXC_INLINE amxc_llist_it_t * amxc_llist_get_first(const amxc_llist_t *const llist)
Gets the first item of the linked list.
Definition: amxc_llist.h:713
int amxc_var_compare(const amxc_var_t *const var1, const amxc_var_t *const var2, int *const result)
Compares two variants.
Definition: amxc_variant.c:397
#define amxc_var_constcast(type, var)
Takes the content from a variant.
Definition: amxc_variant.h:722
The linked list iterator structure.
Definition: amxc_llist.h:215
The linked list structure.
Definition: amxc_llist.h:228
The variant struct definition.
Definition: amxc_variant.h:861

◆ variant_list_convert_to()

static int variant_list_convert_to ( amxc_var_t *const  dest,
const amxc_var_t *const  src 
)
static

Definition at line 195 of file variant_list.c.

196  {
197  int retval = -1;
198 
215  NULL,
216  NULL,
220  };
221 
222  if(dest->type_id >= AMXC_VAR_ID_CUSTOM_BASE) {
223  goto exit;
224  }
225 
226  if(convfn[dest->type_id] != NULL) {
227  if(dest->type_id == AMXC_VAR_ID_ANY) {
229  }
230  retval = convfn[dest->type_id](dest, src);
231  }
232 
233 exit:
234  return retval;
235 }
int PRIVATE amxc_var_default_convert_to_null(amxc_var_t *const dest, const amxc_var_t *const src)
#define AMXC_VAR_ID_CUSTOM_BASE
Base variant id for custom variants.
Definition: amxc_variant.h:257
#define AMXC_VAR_ID_ANY
Special variant id, typically used in cast or conversion functions.
Definition: amxc_variant.h:247
int(* amxc_var_convert_fn_t)(amxc_var_t *const dest, const amxc_var_t *const src)
Variant type callback function prototype for dynamically converting one type to another.
int amxc_var_set_type(amxc_var_t *const var, const uint32_t type)
Change the variant data type.
Definition: amxc_variant.c:261
uint32_t type_id
Definition: amxc_variant.h:864
static int variant_list_copy(amxc_var_t *const dest, const amxc_var_t *const src)
Definition: variant_list.c:97
static int variant_list_to_ssv_string(amxc_var_t *const dest, const amxc_var_t *const src)
Definition: variant_list.c:122
static int variant_list_to_csv_string(amxc_var_t *const dest, const amxc_var_t *const src)
Definition: variant_list.c:110
static int variant_list_to_htable(amxc_var_t *const dest, const amxc_var_t *const src)
Definition: variant_list.c:154
static int variant_list_to_bool(amxc_var_t *const dest, const amxc_var_t *const src)
Definition: variant_list.c:147
static int variant_list_to_number(amxc_var_t *const dest, const amxc_var_t *const src)
Definition: variant_list.c:134

◆ variant_list_copy()

static int variant_list_copy ( amxc_var_t *const  dest,
const amxc_var_t *const  src 
)
static

Definition at line 97 of file variant_list.c.

98  {
99  const amxc_llist_t* list = &src->data.vl;
100  return variant_list_copy_list(dest, list);
101 }
void * data
Definition: amxc_variant.h:883
static int variant_list_copy_list(amxc_var_t *const dest, const amxc_llist_t *source_list)
Definition: variant_list.c:75

◆ variant_list_copy_list()

static int variant_list_copy_list ( amxc_var_t *const  dest,
const amxc_llist_t source_list 
)
static

Definition at line 75 of file variant_list.c.

76  {
77  int retval = -1;
78 
79  amxc_llist_for_each(it, source_list) {
80  amxc_var_t* var = NULL;
82  when_null(item, exit);
83  when_failed(amxc_var_new(&var), exit);
84  if(amxc_var_copy(var, item) != 0) {
86  goto exit;
87  }
88  amxc_llist_append(&dest->data.vl, &var->lit);
89  }
90 
91  retval = 0;
92 
93 exit:
94  return retval;
95 }
#define when_failed(x, l)
Definition: amxc_macros.h:142
#define when_null(x, l)
Definition: amxc_macros.h:126
#define amxc_var_from_llist_it(ll_it)
Get the variant pointer from an amxc linked list iterator.
Definition: amxc_variant.h:799
int amxc_llist_append(amxc_llist_t *const llist, amxc_llist_it_t *const it)
Adds an item to the end of the linked list.
Definition: amxc_llist.c:169
#define amxc_llist_for_each(it, list)
Loops over the list from head to tail.
Definition: amxc_llist.h:253
int amxc_var_new(amxc_var_t **var)
Allocates a variant and initializes it to the null variant type.
Definition: amxc_variant.c:194
int amxc_var_copy(amxc_var_t *const dest, const amxc_var_t *const src)
Copy the type and data from one variant (source) in another variant (destination).
Definition: amxc_variant.c:285
void amxc_var_delete(amxc_var_t **var)
Frees the previously allocated variant.
Definition: amxc_variant.c:207
amxc_llist_it_t lit
Definition: amxc_variant.h:862
static amxc_htable_it_t it[2000]
static amxc_var_t * var
Definition: test_issue_58.c:77

◆ variant_list_delete()

static void variant_list_delete ( amxc_var_t var)
static

Definition at line 71 of file variant_list.c.

71  {
73 }
void amxc_llist_clean(amxc_llist_t *const llist, amxc_llist_it_delete_t func)
Removes all items from the linked list.
Definition: amxc_llist.c:124
void variant_list_it_free(amxc_llist_it_t *it)
Helper functions, can be used as delete function for linked lists.
Definition: variant_list.c:66

◆ variant_list_get_index()

static amxc_var_t* variant_list_get_index ( const amxc_var_t *const  src,
const int64_t  index,
int  flags 
)
static

Definition at line 237 of file variant_list.c.

239  {
240  amxc_var_t* retval = NULL;
241  const amxc_llist_t* llist = &src->data.vl;
242  amxc_llist_it_t* lit = NULL;
243  amxc_var_t* src_var = NULL;
244 
245  when_true(index < 0, exit);
246  lit = amxc_llist_get_at(llist, index);
247  when_null(lit, exit);
248 
249  src_var = amxc_llist_it_get_data(lit, amxc_var_t, lit);
250  if((flags & AMXC_VAR_FLAG_COPY) == AMXC_VAR_FLAG_COPY) {
251  when_failed(amxc_var_new(&retval), exit);
252  when_failed(amxc_var_copy(retval, src_var), exit);
253  } else {
254  retval = src_var;
255  }
256 
257 exit:
258  return retval;
259 }
#define when_true(x, l)
Definition: amxc_macros.h:134
amxc_llist_it_t * amxc_llist_get_at(const amxc_llist_t *const llist, const unsigned int index)
Gets an item at a certain position of the linked list.
Definition: amxc_llist.c:222
#define AMXC_VAR_FLAG_COPY
Copy the variant, creates a new variant, leaves the source variant untouched.
Definition: amxc_variant.h:398
static amxc_llist_t * llist

◆ variant_list_get_key()

static amxc_var_t* variant_list_get_key ( const amxc_var_t *const  src,
const char *const  key,
int  flags 
)
static

Definition at line 309 of file variant_list.c.

311  {
312  char* endptr = NULL;
313  int64_t index = strtoll(key, &endptr, 0);
314  if(*endptr != 0) {
315  return NULL;
316  } else {
317  return variant_list_get_index(src, index, flags);
318  }
319 }
static amxc_var_t * variant_list_get_index(const amxc_var_t *const src, const int64_t index, int flags)
Definition: variant_list.c:237

◆ variant_list_init()

static int variant_list_init ( amxc_var_t *const  var)
static

Definition at line 62 of file variant_list.c.

62  {
63  return amxc_llist_init(&var->data.vl);
64 }
int amxc_llist_init(amxc_llist_t *const llist)
Initializes a linked list.
Definition: amxc_llist.c:111

◆ variant_list_move()

static int variant_list_move ( amxc_var_t *const  dest,
amxc_var_t *const  src 
)
static

Definition at line 103 of file variant_list.c.

104  {
105  amxc_llist_t* src_list = &src->data.vl;
106  amxc_llist_t* dst_list = &dest->data.vl;
107  return amxc_llist_move(dst_list, src_list);
108 }
int amxc_llist_move(amxc_llist_t *const dest, amxc_llist_t *const src)
Moves all items from one linked list to another linked list.
Definition: amxc_llist.c:135

◆ variant_list_set_index()

static int variant_list_set_index ( amxc_var_t *const  dest,
amxc_var_t *const  src,
const int64_t  index,
int  flags 
)
static

Definition at line 261 of file variant_list.c.

264  {
265  int retval = -1;
266  amxc_var_t* dest_var = NULL;
267  amxc_llist_t* llist = &dest->data.vl;
268  amxc_llist_it_t* current_lit = NULL;
269 
270  when_true(index > (int64_t) (amxc_llist_size(llist) + 1), exit);
271  current_lit = amxc_llist_get_at(llist, index);
272 
273  if((flags & AMXC_VAR_FLAG_COPY) == AMXC_VAR_FLAG_COPY) {
274  if(current_lit != NULL) {
275  if((flags & AMXC_VAR_FLAG_UPDATE) == AMXC_VAR_FLAG_UPDATE) {
276  dest_var = amxc_llist_it_get_data(current_lit, amxc_var_t, lit);
277  when_failed(amxc_var_copy(dest_var, src), exit);
278  } else {
279  when_failed(amxc_var_new(&dest_var), exit);
280  when_failed(amxc_var_copy(dest_var, src), exit);
281  when_failed(amxc_llist_it_insert_before(current_lit, &dest_var->lit), exit);
282  }
283  } else {
284  when_failed(amxc_var_new(&dest_var), exit);
285  when_failed(amxc_var_copy(dest_var, src), exit);
286  when_failed(amxc_llist_append(llist, &dest_var->lit), exit);
287  }
288  } else {
289  if(current_lit != NULL) {
290  if((flags & AMXC_VAR_FLAG_UPDATE) == AMXC_VAR_FLAG_UPDATE) {
291  when_failed(amxc_llist_it_insert_before(current_lit, &src->lit), exit);
293  } else {
294  when_failed(amxc_llist_it_insert_before(current_lit, &src->lit), exit);
295  }
296  } else {
297  when_failed(amxc_llist_append(llist, &src->lit), exit);
298  }
299  }
300  retval = 0;
301 
302 exit:
303  if((current_lit == NULL) && (retval != 0)) {
304  amxc_var_delete(&dest_var);
305  }
306  return retval;
307 }
int amxc_llist_it_insert_before(amxc_llist_it_t *const reference, amxc_llist_it_t *const it)
Inserts an iterator before a reference interator in the list.
void amxc_llist_it_clean(amxc_llist_it_t *const it, amxc_llist_it_delete_t func)
Removes the iterator from the list and frees allocated memory.
size_t amxc_llist_size(const amxc_llist_t *const llist)
Calculates the size of the linked list.
Definition: amxc_llist.c:151
#define AMXC_VAR_FLAG_UPDATE
Replaces the value of the variant, leaves the source variant untouched.
Definition: amxc_variant.h:404

◆ variant_list_set_key()

static int variant_list_set_key ( amxc_var_t *const  dest,
amxc_var_t *const  src,
const char *const  key,
int  flags 
)
static

Definition at line 321 of file variant_list.c.

324  {
325  char* endptr = NULL;
326  int64_t index = strtoll(key, &endptr, 0);
327 
328  if(*endptr != 0) {
329  return -1;
330  } else {
331  return variant_list_set_index(dest, src, index, flags);
332  }
333 }
static int variant_list_set_index(amxc_var_t *const dest, amxc_var_t *const src, const int64_t index, int flags)
Definition: variant_list.c:261

◆ variant_list_to_bool()

static int variant_list_to_bool ( amxc_var_t *const  dest,
const amxc_var_t *const  src 
)
static

Definition at line 147 of file variant_list.c.

148  {
149  dest->data.b = !amxc_llist_is_empty(&src->data.vl);
150 
151  return 0;
152 }
bool amxc_llist_is_empty(const amxc_llist_t *const llist)
Checks that the linked list is empty.
Definition: amxc_llist.c:165

◆ variant_list_to_csv_string()

static int variant_list_to_csv_string ( amxc_var_t *const  dest,
const amxc_var_t *const  src 
)
static

Definition at line 110 of file variant_list.c.

111  {
112  int retval = -1;
113  amxc_string_t string;
114  amxc_string_init(&string, 0);
115  retval = amxc_string_csv_join_var(&string, src);
116  free(dest->data.s);
117  dest->data.s = amxc_string_take_buffer(&string);
118  amxc_string_clean(&string);
119  return retval;
120 }
int amxc_string_csv_join_var(amxc_string_t *string, const amxc_var_t *const var)
Joins a variant containing a list of variants into a single string using ',' as separator.
int amxc_string_init(amxc_string_t *const string, const size_t length)
Initializes a string.
Definition: amxc_string.c:163
void amxc_string_clean(amxc_string_t *const string)
Frees the string buffer and reset length attributes.
Definition: amxc_string.c:189
char * amxc_string_take_buffer(amxc_string_t *const string)
Takes the string buffer.
Definition: amxc_string.c:356
The string structure.
Definition: amxc_string.h:103

◆ variant_list_to_htable()

static int variant_list_to_htable ( amxc_var_t *const  dest,
const amxc_var_t *const  src 
)
static

Definition at line 154 of file variant_list.c.

155  {
156  int retval = -1;
157  amxc_var_t index;
158  const amxc_llist_t* list = &src->data.vl;
159 
160  amxc_var_init(&index);
161  index.type_id = AMXC_VAR_ID_UINT64;
162  index.data.ui64 = 0;
163 
164  amxc_llist_for_each(it, list) {
165  amxc_var_t* copy = NULL;
167  char* key = amxc_var_dyncast(cstring_t, &index);
168  when_null(key, exit);
169 
170  if(amxc_var_new(&copy) != 0) {
171  free(key);
172  goto exit;
173  }
174  if(amxc_var_copy(copy, item) != 0) {
175  amxc_var_delete(&copy);
176  free(key);
177  goto exit;
178  }
179  if(amxc_htable_insert(&dest->data.vm, key, &copy->hit) != 0) {
180  amxc_var_delete(&copy);
181  free(key);
182  goto exit;
183  }
184  free(key);
185  index.data.ui64++;
186  }
187 
188  retval = 0;
189 
190 exit:
191  amxc_var_clean(&index);
192  return retval;
193 }
#define cstring_t
Convenience macro.
Definition: amxc_variant.h:584
int amxc_htable_insert(amxc_htable_t *const htable, const char *const key, amxc_htable_it_t *const it)
Inserts an item in the hash table.
Definition: amxc_htable.c:237
#define AMXC_VAR_ID_UINT64
Unsigned 64 bit integer variant id.
Definition: amxc_variant.h:182
#define amxc_var_dyncast(type, var)
Dynamic cast a variant to a certain type.
Definition: amxc_variant.h:678
int amxc_var_init(amxc_var_t *const var)
Initializes a variant.
Definition: amxc_variant.c:223
void amxc_var_clean(amxc_var_t *const var)
Clean-up and reset variant.
Definition: amxc_variant.c:237
amxc_htable_it_t hit
Definition: amxc_variant.h:863

◆ variant_list_to_number()

static int variant_list_to_number ( amxc_var_t *const  dest,
const amxc_var_t *const  src 
)
static

Definition at line 134 of file variant_list.c.

135  {
136  int retval = -1;
137 
138  amxc_var_t intermediate;
139  intermediate.type_id = AMXC_VAR_ID_UINT64;
140  intermediate.data.ui64 = amxc_llist_size(&src->data.vl);
141 
142  retval = amxc_var_convert(dest, &intermediate, dest->type_id);
143 
144  return retval;
145 }
int amxc_var_convert(amxc_var_t *const dest, const amxc_var_t *src, const uint32_t type_id)
Converts one variant (source) to another variant(destination) using the specified variant type id.
Definition: amxc_variant.c:333

◆ variant_list_to_ssv_string()

static int variant_list_to_ssv_string ( amxc_var_t *const  dest,
const amxc_var_t *const  src 
)
static

Definition at line 122 of file variant_list.c.

123  {
124  int retval = -1;
125  amxc_string_t string;
126  amxc_string_init(&string, 0);
127  retval = amxc_string_ssv_join_var(&string, src);
128  free(dest->data.s);
129  dest->data.s = amxc_string_take_buffer(&string);
130  amxc_string_clean(&string);
131  return retval;
132 }
int amxc_string_ssv_join_var(amxc_string_t *string, const amxc_var_t *const var)
Joins a variant containing a list of variants into a single string using ' ' as separator.

Variable Documentation

◆ amxc_variant_list

amxc_var_type_t amxc_variant_list
static
Initial value:
= {
.convert_from = NULL,
.convert_to = variant_list_convert_to,
.get_index = variant_list_get_index,
.set_index = variant_list_set_index,
.type_id = 0,
.hit = { .ait = NULL, .key = NULL, .next = NULL },
}
#define AMXC_VAR_NAME_LIST
Provides a name for variant id AMXC_VAR_ID_LIST.
Definition: amxc_variant.h:348
static int variant_list_init(amxc_var_t *const var)
Definition: variant_list.c:62
static int variant_list_compare(const amxc_var_t *const lval, const amxc_var_t *const rval, int *const result)
Definition: variant_list.c:335
static int variant_list_set_key(amxc_var_t *const dest, amxc_var_t *const src, const char *const key, int flags)
Definition: variant_list.c:321
static amxc_var_t * variant_list_get_key(const amxc_var_t *const src, const char *const key, int flags)
Definition: variant_list.c:309
static int variant_list_convert_to(amxc_var_t *const dest, const amxc_var_t *const src)
Definition: variant_list.c:195
static void variant_list_delete(amxc_var_t *var)
Definition: variant_list.c:71
static int variant_list_move(amxc_var_t *const dest, amxc_var_t *const src)
Definition: variant_list.c:103

Definition at line 360 of file variant_list.c.