summaryrefslogtreecommitdiff
path: root/xs.h
diff options
context:
space:
mode:
Diffstat (limited to 'xs.h')
-rw-r--r--xs.h53
1 files changed, 43 insertions, 10 deletions
diff --git a/xs.h b/xs.h
index 0537c33..89f2ca9 100644
--- a/xs.h
+++ b/xs.h
@@ -78,8 +78,9 @@ char *xs_dict_get(char *dict, const char *key);
d_char *xs_dict_del(d_char *dict, const char *key);
d_char *xs_dict_set(d_char *dict, const char *key, const char *data);
d_char *xs_val_new(xstype t);
-d_char *xs_number_new(float f);
-float xs_number_get(char *v);
+d_char *xs_number_new(double f);
+double xs_number_get(char *v);
+char *xs_number_str(char *v);
extern int _xs_debug;
@@ -176,7 +177,7 @@ int xs_size(const char *data)
break;
case XSTYPE_NUMBER:
- len = sizeof(float) + 1;
+ len = 1 + xs_size(data + 1);
break;
@@ -699,30 +700,62 @@ d_char *xs_val_new(xstype t)
}
-d_char *xs_number_new(float f)
+/** numbers */
+
+d_char *xs_number_new(double f)
/* adds a new number value */
{
- d_char *v = xs_realloc(NULL, _xs_blk_size(1 + sizeof(float)));
+ d_char *v;
+ char tmp[64];
+
+ snprintf(tmp, sizeof(tmp), "%.15lf", f);
+
+ /* strip useless zeros */
+ if (strchr(tmp, '.') != NULL) {
+ char *ptr;
+
+ for (ptr = tmp + strlen(tmp) - 1; *ptr == '0'; ptr--);
+
+ if (*ptr != '.')
+ ptr++;
+
+ *ptr = '\0';
+ }
+
+ /* alloc for the marker and the full string */
+ v = xs_realloc(NULL, _xs_blk_size(1 + xs_size(tmp)));
v[0] = XSTYPE_NUMBER;
- memcpy(&v[1], &f, sizeof(float));
+ memcpy(&v[1], tmp, xs_size(tmp));
return v;
}
-float xs_number_get(char *v)
-/* gets the number as a float */
+double xs_number_get(char *v)
+/* gets the number as a double */
{
- float f = 0.0;
+ double f = 0.0;
if (v[0] == XSTYPE_NUMBER)
- memcpy(&f, &v[1], sizeof(float));
+ f = atof(&v[1]);
return f;
}
+char *xs_number_str(char *v)
+/* gets the number as a string */
+{
+ char *p = NULL;
+
+ if (v[0] == XSTYPE_NUMBER)
+ p = &v[1];
+
+ return p;
+}
+
+
#endif /* XS_IMPLEMENTATION */
#endif /* _XS_H */