]> sigrok.org Git - libsigrok.git/commitdiff
strutil: Add helper functions: string to number.
authorpoljar (Damir Jelić) <redacted>
Fri, 1 Nov 2013 17:40:06 +0000 (18:40 +0100)
committerUwe Hermann <redacted>
Tue, 3 Dec 2013 14:10:00 +0000 (15:10 +0100)
This patch adds helper functions for converting a string to different number
formats (double, long, float, int).

These functions are exposed in the public API.

proto.h
strutil.c

diff --git a/proto.h b/proto.h
index 7ec6ae4f16905cdcfeb5fd25b1939d7ff32231d8..5b516eca113c69904b89ab57894e876363af6583 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -141,6 +141,10 @@ SR_API uint64_t sr_parse_timestring(const char *timestring);
 SR_API gboolean sr_parse_boolstring(const char *boolstring);
 SR_API int sr_parse_period(const char *periodstr, uint64_t *p, uint64_t *q);
 SR_API int sr_parse_voltage(const char *voltstr, uint64_t *p, uint64_t *q);
+SR_API int sr_atol(const char *str, long *ret);
+SR_API int sr_atoi(const char *str, int *ret);
+SR_API int sr_atod(const char *str, double *ret);
+SR_API int sr_atof(const char *str, float *ret);
 
 /*--- version.c -------------------------------------------------------------*/
 
index f6cdb73b73f81836477378ee3baea38979c4282c..6c6538446eb84e4090beb05dcf2402c77908ac42 100644 (file)
--- a/strutil.c
+++ b/strutil.c
@@ -21,6 +21,7 @@
 #include <stdint.h>
 #include <stdlib.h>
 #include <string.h>
+#include <errno.h>
 #include "libsigrok.h"
 #include "libsigrok-internal.h"
 
  * @{
  */
 
+/**
+ * Convert a string representation of a numeric value to a long integer. The
+ * conversion is strict and will fail if the complete string does not represent
+ * a valid long integer. The function sets errno according to the details of the
+ * failure.
+ *
+ * @param str The string representation to convert.
+ * @param ret Pointer to long where the result of the conversion will be stored.
+ *
+ * @return SR_OK if conversion is successful, otherwise SR_ERR.
+ *
+ * @since 0.3.0
+ */
+SR_API int sr_atol(const char *str, long *ret)
+{
+       long tmp;
+       char *endptr = NULL;
+
+       errno = 0;
+       tmp = strtol(str, &endptr, 0);
+
+       if (!endptr || *endptr || errno) {
+               if (!errno)
+                       errno = EINVAL;
+               return SR_ERR;
+       }
+
+       *ret = tmp;
+       return SR_OK;
+}
+
+/**
+ * Convert a string representation of a numeric value to an integer. The
+ * conversion is strict and will fail if the complete string does not represent
+ * a valid integer. The function sets errno according to the details of the
+ * failure.
+ *
+ * @param str The string representation to convert.
+ * @param ret Pointer to int where the result of the conversion will be stored.
+ *
+ * @return SR_OK if conversion is successful, otherwise SR_ERR.
+ *
+ * @since 0.3.0
+ */
+SR_API int sr_atoi(const char *str, int *ret)
+{
+       long tmp;
+
+       if (sr_atol(str, &tmp) != SR_OK)
+               return SR_ERR;
+
+       if ((int) tmp != tmp) {
+               errno = ERANGE;
+               return SR_ERR;
+       }
+
+       *ret = (int) tmp;
+       return SR_OK;
+}
+
+/**
+ * Convert a string representation of a numeric value to a double. The
+ * conversion is strict and will fail if the complete string does not represent
+ * a valid double. The function sets errno according to the details of the
+ * failure.
+ *
+ * @param str The string representation to convert.
+ * @param ret Pointer to double where the result of the conversion will be stored.
+ *
+ * @return SR_OK if conversion is successful, otherwise SR_ERR.
+ *
+ * @since 0.3.0
+ */
+SR_API int sr_atod(const char *str, double *ret)
+{
+       double tmp;
+       char *endptr = NULL;
+
+       errno = 0;
+       tmp = strtof(str, &endptr);
+
+       if (!endptr || *endptr || errno) {
+               if (!errno)
+                       errno = EINVAL;
+               return SR_ERR;
+       }
+
+       *ret = tmp;
+       return SR_OK;
+}
+
+/**
+ * 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.
+ *
+ * @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_API int sr_atof(const char *str, float *ret)
+{
+       double tmp;
+
+       if (sr_atod(str, &tmp) != SR_OK)
+               return SR_ERR;
+
+       if ((float) tmp != tmp) {
+               errno = ERANGE;
+               return SR_ERR;
+       }
+
+       *ret = (float) tmp;
+       return SR_OK;
+}
+
 /**
  * Convert a numeric value value to its "natural" string representation
  * in SI units.