diff options
| -rw-r--r-- | xs.h | 53 | ||||
| -rw-r--r-- | xs_json.h | 19 | ||||
| -rw-r--r-- | xs_socket.h | 8 |
3 files changed, 48 insertions, 32 deletions
| @@ -78,8 +78,9 @@ char *xs_dict_get(char *dict, const char *key); | |||
| 78 | d_char *xs_dict_del(d_char *dict, const char *key); | 78 | d_char *xs_dict_del(d_char *dict, const char *key); |
| 79 | d_char *xs_dict_set(d_char *dict, const char *key, const char *data); | 79 | d_char *xs_dict_set(d_char *dict, const char *key, const char *data); |
| 80 | d_char *xs_val_new(xstype t); | 80 | d_char *xs_val_new(xstype t); |
| 81 | d_char *xs_number_new(float f); | 81 | d_char *xs_number_new(double f); |
| 82 | float xs_number_get(char *v); | 82 | double xs_number_get(char *v); |
| 83 | char *xs_number_str(char *v); | ||
| 83 | 84 | ||
| 84 | extern int _xs_debug; | 85 | extern 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 | ||
| 702 | d_char *xs_number_new(float f) | 703 | /** numbers */ |
| 704 | |||
| 705 | d_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 | ||
| 714 | float xs_number_get(char *v) | 735 | double 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 | ||
| 747 | char *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 */ |
| @@ -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 | ||
| 7 | int xs_socket_timeout(int s, float rto, float sto); | 7 | int xs_socket_timeout(int s, double rto, double sto); |
| 8 | int xs_socket_server(char *addr, int port); | 8 | int xs_socket_server(char *addr, int port); |
| 9 | FILE *xs_socket_accept(int rs); | 9 | FILE *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 | ||
| 19 | int xs_socket_timeout(int s, float rto, float sto) | 19 | int 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 | } |