X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=strutil.c;h=f8644d72946feb578f5858265f1e017f9dfa529c;hb=1ef513807124f5c3f3706896fa943e9adf10ef30;hp=6cb13a6ac3aa22fb1830dc635d170cc12628c986;hpb=b07b42f319488d821d23c3310133872df70987c5;p=libsigrok.git diff --git a/strutil.c b/strutil.c index 6cb13a6a..f8644d72 100644 --- a/strutil.c +++ b/strutil.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "libsigrok.h" #include "libsigrok-internal.h" @@ -47,6 +48,126 @@ * @{ */ +/** + * 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_PRIV 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_PRIV 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_PRIV 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_PRIV 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. @@ -230,7 +351,8 @@ SR_API char **sr_parse_triggerstring(const struct sr_dev_inst *sdi, return NULL; } - if (sdi->driver->config_list(SR_CONF_TRIGGER_TYPE, &gvar, sdi) != SR_OK) { + if (sdi->driver->config_list(SR_CONF_TRIGGER_TYPE, + &gvar, sdi, NULL) != SR_OK) { sr_err("%s: Device doesn't support any triggers.", __func__); return NULL; }