diff options
author | Yorhel <git@yorhel.nl> | 2012-03-23 16:22:52 +0100 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2012-03-23 16:33:43 +0100 |
commit | d15a1bab95b48ae101d15256c5cd355f514afc05 (patch) | |
tree | 95149936072ec3a1a4439e75835e7dd9d60c080f | |
parent | dc8e82571240aa04be8717346b2ac72c59a0c567 (diff) |
Added functions to read out integer / number values from elements
In a dynamically typed fashion.
Still totally untested.
-rw-r--r-- | tanja.c | 62 | ||||
-rw-r--r-- | tanja.h | 4 |
2 files changed, 66 insertions, 0 deletions
@@ -213,6 +213,68 @@ tn_el tn_el_copy(tn_el el) { } +int tn_el_intval(tn_el el, int64_t *val) { + switch(el.type) { + case TN_VT_INT: + if(val) + *val = el.v.i; + return 1; + case TN_VT_NUM: + if(el.v.n > INT64_MAX || el.v.n < INT64_MIN) + return 0; + if(val) + *val = el.v.n; + return 1; + case TN_VT_STR:; + char *e = NULL; + int64_t v = strtoll(el.v.s, &e, 10); + if(!e || e == el.v.s || *e) + return 0; + if(val) + *val = v; + return 1; + } + return 0; +} + + +int64_t tn_el_int(tn_el el) { + int64_t r = 0; + tn_el_intval(el, &r); + return r; +} + + +int tn_el_numval(tn_el el, double *val) { + switch(el.type) { + case TN_VT_INT: + if(val) + *val = el.v.i; + return 1; + case TN_VT_NUM: + if(val) + *val = el.v.n; + return 1; + case TN_VT_STR:; + double v; + int l; + if(sscanf(el.v.s, "%lf%n", &v, &l) < 1 || l != (int)strlen(el.v.s)) + return 0; + if(val) + *val = v; + return 1; + } + return 0; +} + + +int64_t tn_el_num(tn_el el) { + double r = 0; + tn_el_numval(el, &r); + return r; +} + + tn_el tn_array_new(char *lst, ...) { tn_el a; a.count = a.size = strlen(lst); @@ -96,6 +96,10 @@ typedef void (*tn_link_ready_cb)(tn_link *); void tn_el_free(tn_el); tn_el tn_el_new(char, ...); tn_el tn_el_copy(tn_el); +int tn_el_intval(tn_el, int64_t *); +int64_t tn_el_int(tn_el); +int tn_el_numval(tn_el, double *); +int64_t tn_el_num(tn_el); tn_el tn_array_new(char *, ...); void tn_array_append(tn_el *, char *, ...); tn_el tn_map_new(char *, ...); |