%% options copyright owner = Dirk Krause copyright year = 2014 license = bsd %% header /** @file dk3madsi.h Convert string to double value. */ #include #include #if DK3_HAVE_SYS_TYPES_H #include #endif #if DK3_HAVE_STDINT #include #endif #if DK3_HAVE_INTTYPES_H #include #endif #if DK3_HAVE_LIMITS_H #include #endif #if DK3_HAVE_MATH_H #include #endif #if DK3_HAVE_FLOAT_H #include #endif #ifdef __cplusplus extern "C" { #endif /** Retrieve double value from string. @param rp Result variable pointer. @param src Text to convert. @param ec Pointer to error code variable, may be NULL. @return 1 on success, 0 on error. On error the error code variable is set to DK3_ERROR_INVALID_ARGS (one of the pointers rp or src is NULL) or DK3_ERROR_SYNTAX (text does not contain a double value). */ int dk3ma_d_from_string(double *rp, dkChar const *src, int *ec); /** Retrieve double value from string. @param rp Result variable pointer. @param src Text to convert. @param ec Pointer to error code variable, may be NULL. @return 1 on success, 0 on error. On error the error code variable is set to DK3_ERROR_INVALID_ARGS (one of the pointers rp or src is NULL) or DK3_ERROR_SYNTAX (text does not contain a double value). */ int dk3ma_d_from_c8_string(double *rp, char const *src, int *ec); #ifdef __cplusplus } #endif %% module #include "dk3ma.h" #if DK3_HAVE_STDLIB_H #include #endif #if DK3_HAVE_UNISTD_H #include #endif #if DK3_HAVE_STRING_H #include #endif #if DK3_HAVE_ERRNO_H #include #endif $!trace-include int dk3ma_d_from_c8_string(double *rp, char const *src, int *ec) { #if DK3_HAVE_STRTOD char *endptr = NULL; double val; int back = 0; $? "+ dk3ma_d_from_string \"%s\"", TR_STR(src) if ((NULL != rp) && (NULL != src)) { errno = 0; val = strtod(src, &endptr); if (endptr) { if ('\0' == *endptr) { back = 1; } else { if (endptr != src) { back = 1; } if (NULL != ec) { *ec = DK3_ERROR_SYNTAX; } } } else { back = 1; } if (0 != back) { if (ERANGE == errno) { if ((HUGE_VAL == val) || (-HUGE_VAL == val) || (0.0 == val)) { back = 0; if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; } } } } *rp = val; } else { if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; } } $? "- dk3ma_d_from_string %lg %d", val, back return back; #else double val; int back = 0; $? "+ dk3ma_d_from_string \"%s\"", TR_STR(src) if ((NULL != rp) && (NULL != src)) { if (1 == sscanf(src, "%lf", &val)) { *rp = val; back = 1; } else { if (NULL != ec) { *ec = DK3_ERROR_SYNTAX; } } } else { if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; } } $? "- dk3ma_d_from_string %lg %d", val, back return back; #endif } int dk3ma_d_from_string(double *rp, dkChar const *src, int *ec) { #if DK3_CHAR_SIZE > 1 #if DK3_HAVE_WCSTOD dkChar *endptr = NULL; double val; int back = 0; $? "+ dk3ma_d_from_string \"%s\"", TR_STR(src) if ((NULL != rp) && (NULL != src)) { errno = 0; val = strtod(src, &endptr); if (endptr) { if ('\0' == *endptr) { back = 1; } else { if (endptr != src) { back = 1; } if (NULL != ec) { *ec = DK3_ERROR_SYNTAX; } } } else { back = 1; } if (0 != back) { if (ERANGE == errno) { if ((HUGE_VAL == val) || (-HUGE_VAL == val) || (0.0 == val)) { back = 0; if (NULL != ec) { *ec = DK3_ERROR_MATH_OVERFLOW; } } } } *rp = val; } else { if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; } } $? "- dk3ma_d_from_string %lg %d", val, back return back; #else double val = 0.0; int back = 0; $? "+ dk3ma_d_from_string \"%s\"", TR_STR(src) if ((NULL != rp) && (NULL != src)) { if (1 == swscanf(src, dkT("%lf"), &val)) { *rp = val; back = 1; } else { if (NULL != ec) { *ec = DK3_ERROR_SYNTAX; } } } else { if (NULL != ec) { *ec = DK3_ERROR_INVALID_ARGS; } } $? "- dk3ma_d_from_string %lg %d", val, back return back; #endif #else return (dk3ma_d_from_c8_string(rp, src, ec)); #endif }