default 3 лет назад
Родитель
Сommit
d79591c277
3 измененных файлов с 48 добавлено и 32 удалено
  1. 43 10
      xs.h
  2. 1 18
      xs_json.h
  3. 4 4
      xs_socket.h

+ 43 - 10
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 */

+ 1 - 18
xs_json.h

@@ -91,24 +91,7 @@ d_char *_xs_json_dumps(d_char *s, char *data, int level, int indent)
         break;
 
     case XSTYPE_NUMBER:
-        {
-            char tmp[32];
-            snprintf(tmp, sizeof(tmp), "%.15f", xs_number_get(data));
-
-            /* strip useless zeros */
-            if (strchr(tmp, '.') != NULL) {
-                char *ptr;
-
-                for (ptr = tmp + strlen(tmp) - 1; *ptr == '0'; ptr--);
-
-                if (*ptr != '.')
-                    ptr++;
-
-                *ptr = '\0';
-            }
-
-            s = xs_str_cat(s, tmp);
-        }
+        s = xs_str_cat(s, xs_number_str(data));
         break;
 
     case XSTYPE_LIST:

+ 4 - 4
xs_socket.h

@@ -4,7 +4,7 @@
 
 #define _XS_SOCKET_H
 
-int xs_socket_timeout(int s, float rto, float sto);
+int xs_socket_timeout(int s, double rto, double sto);
 int xs_socket_server(char *addr, int port);
 FILE *xs_socket_accept(int rs);
 
@@ -16,7 +16,7 @@ FILE *xs_socket_accept(int rs);
 #include <netinet/in.h>
 
 
-int xs_socket_timeout(int s, float rto, float sto)
+int xs_socket_timeout(int s, double rto, double sto)
 /* sets the socket timeout in seconds */
 {
     struct timeval tv;
@@ -24,14 +24,14 @@ int xs_socket_timeout(int s, float rto, float sto)
 
     if (rto > 0.0) {
         tv.tv_sec  = (int)rto;
-        tv.tv_usec = (int)((rto - (float)(int)rto) * 1000000.0);
+        tv.tv_usec = (int)((rto - (double)(int)rto) * 1000000.0);
 
         ret = setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv));
     }
 
     if (sto > 0.0) {
         tv.tv_sec  = (int)sto;
-        tv.tv_usec = (int)((sto - (float)(int)sto) * 1000000.0);
+        tv.tv_usec = (int)((sto - (double)(int)sto) * 1000000.0);
 
         ret = setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(tv));
     }