X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=strutil.c;h=f8644d72946feb578f5858265f1e017f9dfa529c;hb=c1e45c6511eb4e9023095fc364913db85a092651;hp=f6cdb73b73f81836477378ee3baea38979c4282c;hpb=8f996b89481670219c7576e2c68b128a0a2ce026;p=libsigrok.git diff --git a/strutil.c b/strutil.c index f6cdb73b..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.