]> sigrok.org Git - libsigrok.git/commitdiff
strutil: Add function to parse floating point numbers while ignoring the locale.
authorpoljar (Damir Jelić) <redacted>
Thu, 16 Jan 2014 14:28:48 +0000 (15:28 +0100)
committerBert Vermeulen <redacted>
Thu, 16 Jan 2014 15:27:35 +0000 (16:27 +0100)
Most of the supported gear uses the ANSI C locale for communication, and if the
client sets up an incompatible locale parsing would fail.

This function ignores the client's locale and parses floating point numbers
using the ANSI C locale. This function should be always used when parsing
floating point numbers coming from the instrument.

libsigrok-internal.h
strutil.c

index ba00d9e4d00c3eec9cc38abb7676f9769ad7ee37..df9bc0aa239563729bfcfb7290aacba15bd098de 100644 (file)
@@ -273,6 +273,7 @@ SR_PRIV int sr_atol(const char *str, long *ret);
 SR_PRIV int sr_atoi(const char *str, int *ret);
 SR_PRIV int sr_atod(const char *str, double *ret);
 SR_PRIV int sr_atof(const char *str, float *ret);
+SR_PRIV int sr_atof_ascii(const char *str, float *ret);
 
 /*--- hardware/common/serial.c ----------------------------------------------*/
 
index f4e4825935d487034cac863af8994acd741cf43a..0438c5ecc03cf74516c1be3bda1f8876ed419758 100644 (file)
--- 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.