X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=ucw%2Fxtypes-basic.c;h=26d7cb1f54b191ac64cdbcd2014573d83ed09a73;hb=31d89271a3de3dd2899726d1059cd04261300064;hp=2792cd19109dd32aca0f785d81d0d4d2ba663908;hpb=9689a6aa2bb0815ab95ea679d0d298acc4c5cd5b;p=libucw.git diff --git a/ucw/xtypes-basic.c b/ucw/xtypes-basic.c index 2792cd19..26d7cb1f 100644 --- a/ucw/xtypes-basic.c +++ b/ucw/xtypes-basic.c @@ -13,8 +13,8 @@ #include #include #include -#include #include +#include #define XTYPE_NUM_FORMAT(_type, _fmt, _typename) static const char *xt_##_typename##_format(void *src, u32 fmt UNUSED, struct mempool *pool) \ {\ @@ -48,20 +48,24 @@ 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, "%.15lg", *(double *)src); - case XTYPE_FMT_PRETTY: - return mp_printf(pool, "%.2lf", *(double *)src); - case XTYPE_FMT_DEFAULT: - default: - return mp_printf(pool, "%.6lg", *(double *)src); - } + double val = *((double *)src); + + if (fmt & XT_DOUBLE_FMT_PREC_FLAG) + { + uint prec = fmt & ~XT_DOUBLE_FMT_PREC_FLAG; + return mp_printf(pool, "%.*lf", prec, val); + } + + switch(fmt) + { + case XTYPE_FMT_RAW: + return mp_printf(pool, "%.15lg", val); + case XTYPE_FMT_PRETTY: + return mp_printf(pool, "%.2lf", val); + case XTYPE_FMT_DEFAULT: + default: + return mp_printf(pool, "%.6lg", val); + } } static const char *xt_double_parse(const char *str, void *dest, struct mempool *pool UNUSED) @@ -69,11 +73,11 @@ static const char *xt_double_parse(const char *str, void *dest, struct mempool * char *endptr = NULL; errno = 0; double result = strtod(str, &endptr); - if(*endptr != 0 || endptr == str) return "Could not parse floating point number."; - if(errno == ERANGE) return "Could not parse floating point number."; + if (*endptr != 0 || endptr == str || + errno == ERANGE) + return "Could not parse floating point number."; *((double *) dest) = result; - return NULL; } @@ -81,12 +85,10 @@ static const char * xt_double_fmt_parse(const char *str, u32 *dest, struct mempo { uint precision = 0; const char *tmp_err = str_to_uint(&precision, str, NULL, 0); - if(tmp_err) { - return mp_printf(pool, "An error occured while parsing precision: %s.", tmp_err); - } - - *dest = XTYPE_FMT_DBL_FIXED_PREC(precision); + if (tmp_err) + return mp_printf(pool, "Could not parse floating point number precision: %s", tmp_err); + *dest = XT_DOUBLE_FMT_PREC(precision); return NULL; } @@ -100,45 +102,34 @@ const struct xtype xt_double = { /* bool */ -static const char *xt_bool_format(void *src, u32 fmt UNUSED, struct mempool *pool) +static const char *xt_bool_format(void *src, u32 fmt UNUSED, struct mempool *pool UNUSED) { - switch(fmt) { + bool val = *((bool *)src); + switch (fmt) + { case XTYPE_FMT_PRETTY: - return mp_printf(pool, "%s", *((bool *)src) ? "true" : "false"); + return val ? "true" : "false"; case XTYPE_FMT_DEFAULT: case XTYPE_FMT_RAW: - return mp_printf(pool, "%s", *((bool *)src) ? "1" : "0"); default: - die("Unsupported output type."); - } + return val ? "1" : "0"; + } } static const char *xt_bool_parse(const char *str, void *dest, struct mempool *pool UNUSED) { - if(!str) return "Cannot parse bool: string is NULL."; - - if(str[1] == 0) { - if(str[0] == '0') { + if (!strcmp(str, "0") || !strcmp(str, "false") || !strcmp(str, "no")) + { *((bool *)dest) = false; return NULL; } - if(str[0] == '1') { + else if (!strcmp(str, "1") || !strcmp(str, "true") || !strcmp(str, "yes")) + { *((bool *)dest) = true; return NULL; } - } - - if(strcasecmp(str, "false") == 0) { - *((bool *)dest) = false; - return NULL; - } - - if(strcasecmp(str, "true") == 0) { - *((bool *)dest) = true; - return NULL; - } - return "Could not parse bool."; + return "Could not parse a boolean value."; } XTYPE_NUM_STRUCT(bool, bool) @@ -150,9 +141,9 @@ static const char *xt_str_format(void *src, u32 fmt UNUSED, struct mempool *pool return mp_strdup(pool, *((const char **) src)); } -static const char *xt_str_parse(const char *str, void *dest, struct mempool *pool UNUSED) +static const char *xt_str_parse(const char *str, void *dest, struct mempool *pool) { - *((const char **) dest) = str; + *((const char **) dest) = mp_strdup(pool, str); return NULL; }