69 const char* buffer = NULL;
75 while(isspace(*buffer)) {
79 when_true(!isdigit(*buffer) && *buffer !=
'+' && *buffer !=
'-', exit);
90 const char* buffer = NULL;
94 intermediate.
data.i64 = 0;
101 intermediate.
data.i64 = strtoll(buffer, &endptr, 0);
103 when_true((errno == ERANGE && (intermediate.
data.i64 == LLONG_MIN ||
104 intermediate.
data.i64 == LLONG_MAX)) ||
105 (errno != 0 && intermediate.
data.i64 == 0), exit);
106 when_true(endptr == buffer || *endptr !=
'\0', exit);
118 const char* buffer = NULL;
122 intermediate.
data.ui64 = 0;
129 intermediate.
data.ui64 = llabs(strtoll(buffer, &endptr, 0));
131 when_true((errno == ERANGE && (intermediate.
data.ui64 == 0 ||
132 intermediate.
data.ui64 == ULLONG_MAX)) ||
133 (errno != 0 && intermediate.
data.ui64 == 0), exit);
134 when_true(endptr == buffer || *endptr !=
'\0', exit);
145 const char* buffer = NULL;
153 dest->
data.d = strtod(buffer, &endptr);
155 if(((errno == ERANGE) && (dest->
data.d == 0)) ||
156 (( errno != 0) && ( dest->
data.d == 0)) ||
157 (endptr == buffer) ||
171 const char* buffer = NULL;
179 dest->
data.f = strtof(buffer, &endptr);
181 if(((errno == ERANGE) && (dest->
data.f == 0)) ||
182 (( errno != 0) && ( dest->
data.f == 0)) ||
183 (endptr == buffer) ||
197 char* lower_src = NULL;
200 const char true_values[4][10] = {
"true",
"yes",
"1",
"on" };
201 const char false_values[4][10] = {
"false",
"no",
"0",
"off" };
205 src_len = strlen(src->
data.s) + 1;
206 lower_src = (
char*) calloc(1, src_len);
209 for(
int i = 0; i < src_len; i++) {
210 if(isspace(*(src->
data.s + i))) {
214 lower_src[src_pos] = tolower(*(src->
data.s + i));
218 for(
int index = 0; index < 4; index++) {
219 if(strcmp(lower_src, true_values[index]) == 0) {
223 }
else if(strcmp(lower_src, false_values[index]) == 0) {
224 dest->
data.b =
false;
245 if(*(src->
data.s) != 0) {
266 char* element = NULL;
272 length = strlen(src->
data.s) + 1;
273 temp = (
char*) calloc(1, length);
275 memcpy(temp, src->
data.s, length);
277 element = strtok(temp,
",");
296 length = strlen(
data) + 1;
297 var->
data.s = (
char*) calloc(1, length);
306 element = strtok(NULL,
",");
326 if(src->
data.s != NULL) {
327 int length = strlen(src->
data.s) + 1;
328 dest->
data.s = (
char*) calloc(1, length);
330 memcpy(dest->
data.s, src->
data.s, length);
353 const char* str_src = src->
data.s;
359 src_len = strlen(str_src);
366 for(
int i = 0; i < src_len; i++) {
367 if(isspace(*(src->
data.s + i)) == 0) {
374 switch(str_src[src_pos]) {
453 if(convfn[dest->
type_id] != NULL) {
454 retval = convfn[dest->
type_id](dest, src);
464 *result = strcmp(lval->
data.s == NULL ?
"" : lval->
data.s,
465 rval->
data.s == NULL ?
"" : rval->
data.s);
474 .convert_from = NULL,
482 .hit = { .ait = NULL, .key = NULL, .next = NULL },
491 .convert_from = NULL,
499 .hit = { .ait = NULL, .key = NULL, .next = NULL },
508 .convert_from = NULL,
516 .hit = { .ait = NULL, .key = NULL, .next = NULL },
536 length = strlen(val) + 1;
537 var->
data.s = (
char*) calloc(1, length);
539 memcpy(
var->
data.s, val, length);
592 retval = variant.
data.s != NULL ? variant.
data.s : strdup(
"");
593 variant.
data.s = NULL;
601 const char* retval = NULL;
713 const char*
const val) {
730 const char*
const val) {
747 const char*
const val) {
#define when_failed(x, l)
#define cstring_t
Convenience macro.
int PRIVATE amxc_var_default_convert_to_null(amxc_var_t *const dest, const amxc_var_t *const src)
uint32_t PRIVATE amxc_var_add_type(amxc_var_type_t *const type, const uint32_t index)
int PRIVATE amxc_var_remove_type(amxc_var_type_t *const type)
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.
void amxc_htable_clean(amxc_htable_t *const htable, amxc_htable_it_delete_t func)
Removes all items from the hash table.
amxc_string_split_status_t amxc_string_csv_to_var(const amxc_string_t *const string, amxc_var_t *var, const char **reason)
Split a string in individual parts assuming that the string contains comma separated values.
amxc_string_split_status_t amxc_string_ssv_to_var(const amxc_string_t *const string, amxc_var_t *var, const char **reason)
Split a string in individual parts assuming that the string contains space separated values.
int amxc_string_push_buffer(amxc_string_t *const string, char *buffer, size_t length)
Sets the string buffer.
int amxc_string_init(amxc_string_t *const string, const size_t length)
Initializes a string.
void amxc_string_clean(amxc_string_t *const string)
Frees the string buffer and reset length attributes.
char * amxc_string_take_buffer(amxc_string_t *const string)
Takes the string buffer.
int amxc_ts_parse(amxc_ts_t *tsp, const char *str, size_t len)
Transforms the given string in to unix epoch time.
int amxc_var_push_ssv_string_t(amxc_var_t *const var, char *val)
Pushes a value in a variant.
amxc_var_t * amxc_var_add_new_key_csv_string_t(amxc_var_t *const var, const char *key, const char *const val)
Conversion helper function.
int amxc_var_set_cstring_t(amxc_var_t *const var, const char *const val)
Setter helper function.
amxc_var_t * amxc_var_add_new_key_ssv_string_t(amxc_var_t *const var, const char *key, const char *const val)
Conversion helper function.
amxc_var_t * amxc_var_add_new_key_cstring_t(amxc_var_t *const var, const char *key, const char *const val)
Conversion helper function.
cstring_t amxc_var_take_cstring_t(amxc_var_t *const var)
Takes a value from a variant.
amxc_var_t * amxc_var_add_new_cstring_t(amxc_var_t *const var, const char *const val)
Conversion helper function.
void variant_htable_it_free(const char *key, amxc_htable_it_t *it)
Helper functions, can be used as delete function for htable.
int amxc_var_push_csv_string_t(amxc_var_t *const var, char *val)
Pushes a value in a variant.
int amxc_var_set_ssv_string_t(amxc_var_t *const var, const char *const val)
Setter helper function.
amxc_var_t * amxc_var_add_new_csv_string_t(amxc_var_t *const var, const char *const val)
Conversion helper function.
const cstring_t amxc_var_get_const_cstring_t(const amxc_var_t *const var)
Conversion helper function.
cstring_t amxc_var_get_cstring_t(const amxc_var_t *const var)
Conversion helper function.
int amxc_var_set_csv_string_t(amxc_var_t *const var, const char *const val)
Setter helper function.
int amxc_var_push_cstring_t(amxc_var_t *const var, char *val)
Pushes a value in a variant.
amxc_var_t * amxc_var_add_new_ssv_string_t(amxc_var_t *const var, const char *const val)
Conversion helper function.
#define AMXC_VAR_ID_UINT32
Unsigned 32 bit integer variant id.
#define AMXC_VAR_ID_CUSTOM_BASE
Base variant id for custom variants.
#define AMXC_VAR_NAME_CSV_STRING
Provides a name for variant id AMXC_VAR_ID_CSV_STRING.
#define AMXC_VAR_ID_NULL
Null variant type id (aka void)
#define AMXC_VAR_ID_CSTRING
C-string variant id (aka char *), null terminated string.
#define AMXC_VAR_NAME_CSTRING
Provides a name for variant id AMXC_VAR_ID_CSTRING.
#define AMXC_VAR_ID_UINT64
Unsigned 64 bit integer variant id.
#define AMXC_VAR_ID_DOUBLE
Double variant id.
#define AMXC_VAR_NAME_SSV_STRING
Provides a name for variant id AMXC_VAR_ID_SSV_STRING.
#define AMXC_VAR_ID_SSV_STRING
Space Separated Values string variant id.
#define AMXC_VAR_ID_BOOL
Boolean variant id.
#define AMXC_VAR_ID_INT32
Signed 32 bit integer variant id.
#define AMXC_VAR_ID_TIMESTAMP
Ambiorix timestamp variant id.
#define AMXC_VAR_ID_CSV_STRING
Comma Separated Values string variant id.
#define AMXC_VAR_ID_LIST
Ambiorix Linked List variant id.
#define AMXC_VAR_ID_HTABLE
Ambiorix Hash Table variant id.
#define AMXC_VAR_ID_INT64
Signed 64 bit integer variant id.
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.
int amxc_var_new(amxc_var_t **var)
Allocates a variant and initializes it to the null variant type.
int amxc_var_init(amxc_var_t *const var)
Initializes a variant.
amxc_var_t * amxc_var_add_new(amxc_var_t *const var)
Adds a new variant to a composite variant.
void amxc_var_clean(amxc_var_t *const var)
Clean-up and reset variant.
void amxc_var_delete(amxc_var_t **var)
Frees the previously allocated variant.
amxc_var_t * amxc_var_add_new_key(amxc_var_t *const var, const char *key)
Adds a new variant with a key to a composite variant.
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.
A variant type structure.
The variant struct definition.
static amxc_var_type_t amxc_variant_char
static DESTRUCTOR void amxc_var_char_cleanup(void)
static CONSTRUCTOR void amxc_var_char_init(void)
static int variant_char_to_htable(amxc_var_t *const dest, const amxc_var_t *const src)
static int variant_char_to_unsigned_int(amxc_var_t *const dest, const amxc_var_t *const src)
static int variant_char_to_list(amxc_var_t *const dest, const amxc_var_t *const src)
static amxc_var_type_t amxc_variant_ssv_char
static int variant_char_compare(const amxc_var_t *const lval, const amxc_var_t *const rval, int *const result)
static void variant_char_delete(amxc_var_t *const var)
static int variant_char_move(amxc_var_t *const dest, amxc_var_t *const src)
static int variant_char_to_bool(amxc_var_t *const dest, const amxc_var_t *const src)
static int amxc_var_set_data(amxc_var_t *const var, const char *const val)
static int variant_char_to_double(amxc_var_t *const dest, const amxc_var_t *const src)
static int variant_char_to_signed_int(amxc_var_t *const dest, const amxc_var_t *const src)
static int variant_char_to_ts(amxc_var_t *const dest, const amxc_var_t *const src)
static const char * variant_char_validate_number(const amxc_var_t *const src, int *retval)
static int variant_char_auto_convert(amxc_var_t *const dest, const amxc_var_t *const src)
static int variant_char_convert_to(amxc_var_t *const dest, const amxc_var_t *const src)
static amxc_var_type_t amxc_variant_csv_char
static int variant_char_copy(amxc_var_t *const dest, const amxc_var_t *const src)
static int variant_char_to_float(amxc_var_t *const dest, const amxc_var_t *const src)