diff options
Diffstat (limited to 'src/plist.c')
-rw-r--r-- | src/plist.c | 33 |
1 files changed, 11 insertions, 22 deletions
diff --git a/src/plist.c b/src/plist.c index ef1d7a2..af64ed1 100644 --- a/src/plist.c +++ b/src/plist.c @@ -27,6 +27,7 @@ #include "plist.h" #include <stdlib.h> #include <stdio.h> +#include <math.h> #include <node.h> #include <node_iterator.h> @@ -214,9 +215,8 @@ PLIST_API plist_t plist_new_date(int32_t sec, int32_t usec) { plist_data_t data = plist_new_plist_data(); data->type = PLIST_DATE; - data->timeval.tv_sec = sec; - data->timeval.tv_usec = usec; - data->length = sizeof(struct timeval); + data->realval = (double)sec + (double)usec / 1000000; + data->length = sizeof(double); return plist_new_node(data); } @@ -567,6 +567,7 @@ static void plist_get_type_and_value(plist_t node, plist_type * type, void *valu *((uint64_t *) value) = data->intval; break; case PLIST_REAL: + case PLIST_DATE: *((double *) value) = data->realval; break; case PLIST_KEY: @@ -577,11 +578,6 @@ static void plist_get_type_and_value(plist_t node, plist_type * type, void *valu *((uint8_t **) value) = (uint8_t *) malloc(*length * sizeof(uint8_t)); memcpy(*((uint8_t **) value), data->buff, *length * sizeof(uint8_t)); break; - case PLIST_DATE: - //exception : here we use memory on the stack since it is just a temporary buffer - ((struct timeval*) value)->tv_sec = data->timeval.tv_sec; - ((struct timeval*) value)->tv_usec = data->timeval.tv_usec; - break; case PLIST_ARRAY: case PLIST_DICT: default: @@ -670,12 +666,12 @@ PLIST_API void plist_get_date_val(plist_t node, int32_t * sec, int32_t * usec) { plist_type type = plist_get_node_type(node); uint64_t length = 0; - struct timeval val = { 0, 0 }; + double val = 0; if (PLIST_DATE == type) plist_get_type_and_value(node, &type, (void *) &val, &length); - assert(length == sizeof(struct timeval)); - *sec = val.tv_sec; - *usec = val.tv_usec; + assert(length == sizeof(double)); + *sec = (int32_t)val; + *usec = (int32_t)fabs((val - (int64_t)val) * 1000000); } int plist_data_compare(const void *a, const void *b) @@ -700,6 +696,7 @@ int plist_data_compare(const void *a, const void *b) case PLIST_BOOLEAN: case PLIST_UINT: case PLIST_REAL: + case PLIST_DATE: case PLIST_UID: if (val_a->length != val_b->length) return FALSE; @@ -730,11 +727,6 @@ int plist_data_compare(const void *a, const void *b) else return FALSE; break; - case PLIST_DATE: - if (!memcmp(&(val_a->timeval), &(val_b->timeval), sizeof(struct timeval))) - return TRUE; - else - return FALSE; default: break; } @@ -782,6 +774,7 @@ static void plist_set_element_val(plist_t node, plist_type type, const void *val data->intval = *((uint64_t *) value); break; case PLIST_REAL: + case PLIST_DATE: data->realval = *((double *) value); break; case PLIST_KEY: @@ -792,10 +785,6 @@ static void plist_set_element_val(plist_t node, plist_type type, const void *val data->buff = (uint8_t *) malloc(length); memcpy(data->buff, value, length); break; - case PLIST_DATE: - data->timeval.tv_sec = ((struct timeval*) value)->tv_sec; - data->timeval.tv_usec = ((struct timeval*) value)->tv_usec; - break; case PLIST_ARRAY: case PLIST_DICT: default: @@ -840,7 +829,7 @@ PLIST_API void plist_set_data_val(plist_t node, const char *val, uint64_t length PLIST_API void plist_set_date_val(plist_t node, int32_t sec, int32_t usec) { - struct timeval val = { sec, usec }; + double val = (double)sec + (double)usec / 1000000; plist_set_element_val(node, PLIST_DATE, &val, sizeof(struct timeval)); } |