summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2012-03-23 16:22:52 +0100
committerYorhel <git@yorhel.nl>2012-03-23 16:33:43 +0100
commitd15a1bab95b48ae101d15256c5cd355f514afc05 (patch)
tree95149936072ec3a1a4439e75835e7dd9d60c080f
parentdc8e82571240aa04be8717346b2ac72c59a0c567 (diff)
Added functions to read out integer / number values from elements
In a dynamically typed fashion. Still totally untested.
-rw-r--r--tanja.c62
-rw-r--r--tanja.h4
2 files changed, 66 insertions, 0 deletions
diff --git a/tanja.c b/tanja.c
index 0712c8e..8b804a7 100644
--- a/tanja.c
+++ b/tanja.c
@@ -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);
diff --git a/tanja.h b/tanja.h
index 781c119..2f7581b 100644
--- a/tanja.h
+++ b/tanja.h
@@ -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 *, ...);