diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/xplist.c | 46 | 
1 files changed, 32 insertions, 14 deletions
| diff --git a/src/xplist.c b/src/xplist.c index 1ee0138..09c1a11 100644 --- a/src/xplist.c +++ b/src/xplist.c @@ -29,7 +29,7 @@  #include <time.h>  #include <inttypes.h> -#include <locale.h> +#include <math.h>  #include <libxml/xmlIO.h>  #include <libxml/parser.h> @@ -147,6 +147,36 @@ static struct node_t* new_uint_node(uint64_t value)      return node_create(NULL, data);  } +static void dtostr(char *buf, size_t bufsize, double realval) +{ +    double f = realval; +    double ip = 0.0; +    int64_t v; +    size_t len; +    size_t p; + +    f = modf(f, &ip); +    len = snprintf(buf, bufsize, "%s%"PRIi64, ((f < 0) && (ip >= 0)) ? "-" : "", (int64_t)ip); +    if (len >= bufsize) { +        return; +    } + +    if (f < 0) { +        f *= -1; +    } +    f += 0.0000004; + +    p = len; +    buf[p++] = '.'; + +    while (p < bufsize && (p <= len+6)) { +        f = modf(f*10, &ip); +        v = (int)ip; +        buf[p++] = (v + 0x30); +    } +    buf[p] = '\0'; +} +  static void node_to_xml(node_t* node, void *xml_struct)  {      struct xml_node *xstruct = NULL; @@ -194,7 +224,7 @@ static void node_to_xml(node_t* node, void *xml_struct)      case PLIST_REAL:          tag = XPLIST_REAL;          val = (char*)malloc(64); -        (void)snprintf(val, 64, "%f", node_data->realval); +        dtostr(val, 64, node_data->realval);          break;      case PLIST_STRING: @@ -529,14 +559,6 @@ PLIST_API void plist_to_xml(plist_t plist, char **plist_xml, uint32_t * length)      root_node = xmlDocGetRootElement(plist_doc);      root.xml = root_node; -    char *current_locale = setlocale(LC_NUMERIC, NULL); -    char *saved_locale = NULL; -    if (current_locale) { -        saved_locale = strdup(current_locale); -    } -    if (saved_locale) { -        setlocale(LC_NUMERIC, "POSIX"); -    }      node_to_xml(plist, &root);      xmlChar* tmp = NULL; @@ -552,10 +574,6 @@ PLIST_API void plist_to_xml(plist_t plist, char **plist_xml, uint32_t * length)      }      xmlFreeDoc(plist_doc); -    if (saved_locale) { -        setlocale(LC_NUMERIC, saved_locale); -        free(saved_locale); -    }      /* free memory from parser initialization */      xmlCleanupCharEncodingHandlers(); | 
