summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xs.h53
-rw-r--r--xs_json.h19
-rw-r--r--xs_socket.h8
3 files changed, 48 insertions, 32 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);
78d_char *xs_dict_del(d_char *dict, const char *key); 78d_char *xs_dict_del(d_char *dict, const char *key);
79d_char *xs_dict_set(d_char *dict, const char *key, const char *data); 79d_char *xs_dict_set(d_char *dict, const char *key, const char *data);
80d_char *xs_val_new(xstype t); 80d_char *xs_val_new(xstype t);
81d_char *xs_number_new(float f); 81d_char *xs_number_new(double f);
82float xs_number_get(char *v); 82double xs_number_get(char *v);
83char *xs_number_str(char *v);
83 84
84extern int _xs_debug; 85extern int _xs_debug;
85 86
@@ -176,7 +177,7 @@ int xs_size(const char *data)
176 break; 177 break;
177 178
178 case XSTYPE_NUMBER: 179 case XSTYPE_NUMBER:
179 len = sizeof(float) + 1; 180 len = 1 + xs_size(data + 1);
180 181
181 break; 182 break;
182 183
@@ -699,30 +700,62 @@ d_char *xs_val_new(xstype t)
699} 700}
700 701
701 702
702d_char *xs_number_new(float f) 703/** numbers */
704
705d_char *xs_number_new(double f)
703/* adds a new number value */ 706/* adds a new number value */
704{ 707{
705 d_char *v = xs_realloc(NULL, _xs_blk_size(1 + sizeof(float))); 708 d_char *v;
709 char tmp[64];
710
711 snprintf(tmp, sizeof(tmp), "%.15lf", f);
712
713 /* strip useless zeros */
714 if (strchr(tmp, '.') != NULL) {
715 char *ptr;
716
717 for (ptr = tmp + strlen(tmp) - 1; *ptr == '0'; ptr--);
718
719 if (*ptr != '.')
720 ptr++;
721
722 *ptr = '\0';
723 }
724
725 /* alloc for the marker and the full string */
726 v = xs_realloc(NULL, _xs_blk_size(1 + xs_size(tmp)));
706 727
707 v[0] = XSTYPE_NUMBER; 728 v[0] = XSTYPE_NUMBER;
708 memcpy(&v[1], &f, sizeof(float)); 729 memcpy(&v[1], tmp, xs_size(tmp));
709 730
710 return v; 731 return v;
711} 732}
712 733
713 734
714float xs_number_get(char *v) 735double xs_number_get(char *v)
715/* gets the number as a float */ 736/* gets the number as a double */
716{ 737{
717 float f = 0.0; 738 double f = 0.0;
718 739
719 if (v[0] == XSTYPE_NUMBER) 740 if (v[0] == XSTYPE_NUMBER)
720 memcpy(&f, &v[1], sizeof(float)); 741 f = atof(&v[1]);
721 742
722 return f; 743 return f;
723} 744}
724 745
725 746
747char *xs_number_str(char *v)
748/* gets the number as a string */
749{
750 char *p = NULL;
751
752 if (v[0] == XSTYPE_NUMBER)
753 p = &v[1];
754
755 return p;
756}
757
758
726#endif /* XS_IMPLEMENTATION */ 759#endif /* XS_IMPLEMENTATION */
727 760
728#endif /* _XS_H */ 761#endif /* _XS_H */
diff --git a/xs_json.h b/xs_json.h
index 871dfcf..13c3ebb 100644
--- a/xs_json.h
+++ b/xs_json.h
@@ -91,24 +91,7 @@ d_char *_xs_json_dumps(d_char *s, char *data, int level, int indent)
91 break; 91 break;
92 92
93 case XSTYPE_NUMBER: 93 case XSTYPE_NUMBER:
94 { 94 s = xs_str_cat(s, xs_number_str(data));
95 char tmp[32];
96 snprintf(tmp, sizeof(tmp), "%.15f", xs_number_get(data));
97
98 /* strip useless zeros */
99 if (strchr(tmp, '.') != NULL) {
100 char *ptr;
101
102 for (ptr = tmp + strlen(tmp) - 1; *ptr == '0'; ptr--);
103
104 if (*ptr != '.')
105 ptr++;
106
107 *ptr = '\0';
108 }
109
110 s = xs_str_cat(s, tmp);
111 }
112 break; 95 break;
113 96
114 case XSTYPE_LIST: 97 case XSTYPE_LIST:
diff --git a/xs_socket.h b/xs_socket.h
index e4a18ec..a3fe6a4 100644
--- a/xs_socket.h
+++ b/xs_socket.h
@@ -4,7 +4,7 @@
4 4
5#define _XS_SOCKET_H 5#define _XS_SOCKET_H
6 6
7int xs_socket_timeout(int s, float rto, float sto); 7int xs_socket_timeout(int s, double rto, double sto);
8int xs_socket_server(char *addr, int port); 8int xs_socket_server(char *addr, int port);
9FILE *xs_socket_accept(int rs); 9FILE *xs_socket_accept(int rs);
10 10
@@ -16,7 +16,7 @@ FILE *xs_socket_accept(int rs);
16#include <netinet/in.h> 16#include <netinet/in.h>
17 17
18 18
19int xs_socket_timeout(int s, float rto, float sto) 19int xs_socket_timeout(int s, double rto, double sto)
20/* sets the socket timeout in seconds */ 20/* sets the socket timeout in seconds */
21{ 21{
22 struct timeval tv; 22 struct timeval tv;
@@ -24,14 +24,14 @@ int xs_socket_timeout(int s, float rto, float sto)
24 24
25 if (rto > 0.0) { 25 if (rto > 0.0) {
26 tv.tv_sec = (int)rto; 26 tv.tv_sec = (int)rto;
27 tv.tv_usec = (int)((rto - (float)(int)rto) * 1000000.0); 27 tv.tv_usec = (int)((rto - (double)(int)rto) * 1000000.0);
28 28
29 ret = setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv)); 29 ret = setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv));
30 } 30 }
31 31
32 if (sto > 0.0) { 32 if (sto > 0.0) {
33 tv.tv_sec = (int)sto; 33 tv.tv_sec = (int)sto;
34 tv.tv_usec = (int)((sto - (float)(int)sto) * 1000000.0); 34 tv.tv_usec = (int)((sto - (double)(int)sto) * 1000000.0);
35 35
36 ret = setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(tv)); 36 ret = setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(tv));
37 } 37 }