]> mj.ucw.cz Git - libucw.git/commitdiff
xtypes: update of parsing/formatting of xt_double
authorRobert Kessl <kesslr@centrum.cz>
Fri, 18 Jul 2014 12:00:12 +0000 (14:00 +0200)
committerRobert Kessl <kesslr@centrum.cz>
Fri, 18 Jul 2014 12:00:12 +0000 (14:00 +0200)
ucw/xtypes-basic.c
ucw/xtypes.h

index 01247ebba59a74c0a23c4831e10f4f5389e7b245..5cd74adb26e39268dfb9467f473b04ba773e7fbd 100644 (file)
@@ -48,6 +48,11 @@ XTYPE_NUM_DEF(uintmax_t, "%ju", uintmax)
 
 static const char *xt_double_format(void *src, u32 fmt, struct mempool *pool)
 {
+  if(fmt & XTYPE_FMT_DBL_PREC) {
+    uint prec = fmt & ~XTYPE_FMT_DBL_PREC;
+    return mp_printf(pool, "%.*lf", prec, *(double *)src);
+  }
+
   switch(fmt) {
   case XTYPE_FMT_RAW:
     return mp_printf(pool, "%.10lf", *(double *)src);
@@ -62,10 +67,9 @@ static const char *xt_double_format(void *src, u32 fmt, struct mempool *pool)
 static const char *xt_double_parse(const char *str, void *dest, struct mempool *pool UNUSED)
 {
   char *endptr = NULL;
-  size_t sz = strlen(str);
   errno = 0;
   double result = strtod(str, &endptr);
-  if(endptr != str + sz) return "Could not parse double.";
+  if(*endptr != 0 || endptr == str) return "Could not parse double.";
   if(errno == ERANGE) return "Could not parse double: overflow happend during parsing.";
 
   *((double *) dest) = result;
index 380524e80d8ae72a64dbd19c8b0159dbf970bbc5..840713bea53505cb9ebe59e3966b47d4ca6c2e18 100644 (file)
@@ -98,4 +98,8 @@ extern const struct xtype xt_uintmax;
 extern const struct xtype xt_bool;
 extern const struct xtype xt_double;
 
+
+#define XTYPE_FMT_DBL_PREC 0x40000000
+#define XTYPE_FMT_DBL_FIXED_PREC(_prec) (_prec | XTYPE_FMT_DBL_PREC)
+
 #endif