X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=strutil.c;h=0438c5ecc03cf74516c1be3bda1f8876ed419758;hb=ecaa89af0e01f9c3f585e82eb849bf616bff22cf;hp=f4e4825935d487034cac863af8994acd741cf43a;hpb=580f309948b1540a32cb1fd787ae3599c68cae4b;p=libsigrok.git diff --git a/strutil.c b/strutil.c index f4e48259..0438c5ec 100644 --- a/strutil.c +++ b/strutil.c @@ -169,6 +169,49 @@ SR_PRIV int sr_atof(const char *str, float *ret) return SR_OK; } +/** + * @private + * + * Convert a string representation of a numeric value to a float. The + * conversion is strict and will fail if the complete string does not represent + * a valid float. The function sets errno according to the details of the + * failure. This version ignores the locale. + * + * @param str The string representation to convert. + * @param ret Pointer to float where the result of the conversion will be stored. + * + * @return SR_OK if conversion is successful, otherwise SR_ERR. + * + * @since 0.3.0 + */ +SR_PRIV int sr_atof_ascii(const char *str, float *ret) +{ + double tmp; + char *endptr = NULL; + + errno = 0; + tmp = g_ascii_strtod(str, &endptr); + + if (!endptr || *endptr || errno) { + if (!errno) + errno = EINVAL; + return SR_ERR; + } + + /* FIXME This fails unexpectedly. Some other method to safel downcast + * needs to be found. Checking against FLT_MAX doesn't work as well. */ + /* + if ((float) tmp != tmp) { + errno = ERANGE; + sr_dbg("ERANGEEEE %e != %e", (float) tmp, tmp); + return SR_ERR; + } + */ + + *ret = (float) tmp; + return SR_OK; +} + /** * Convert a numeric value value to its "natural" string representation * in SI units.