*/
#include <config.h>
+#include <ctype.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <errno.h>
+#include <stdbool.h>
#include <libsigrok/libsigrok.h>
#include "libsigrok-internal.h"
errno = 0;
tmp = strtol(str, &endptr, 10);
+ while (endptr && isspace(*endptr))
+ endptr++;
+
if (!endptr || *endptr || errno) {
if (!errno)
errno = EINVAL;
errno = 0;
tmp = strtof(str, &endptr);
+ while (endptr && isspace(*endptr))
+ endptr++;
+
if (!endptr || *endptr || errno) {
if (!errno)
errno = EINVAL;
return SR_OK;
}
+/**
+ * @private
+ *
+ * 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. This version ignores the locale.
+ *
+ * @param str The string representation to convert.
+ * @param ret Pointer to double where the result of the conversion will be stored.
+ *
+ * @retval SR_OK Conversion successful.
+ * @retval SR_ERR Failure.
+ */
+SR_PRIV int sr_atod_ascii(const char *str, double *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;
+ }
+
+ *ret = tmp;
+ return SR_OK;
+}
+
/**
* @private
*
int64_t denominator = 1;
int32_t fractional_len = 0;
int32_t exponent = 0;
- int is_negative = 0;
+ bool is_negative = false;
errno = 0;
integral = g_ascii_strtoll(str, &endptr, 10);
return SR_ERR;
if (integral < 0 || str[0] == '-')
- is_negative = 1;
+ is_negative = true;
if (*endptr == '.') {
const char* start = endptr + 1;
*/
SR_API int sr_parse_sizestring(const char *sizestring, uint64_t *size)
{
- int multiplier, done;
+ uint64_t multiplier;
+ int done;
double frac_part;
char *s;
case 'G':
multiplier = SR_GHZ(1);
break;
+ case 't':
+ case 'T':
+ multiplier = SR_GHZ(1000);
+ break;
+ case 'p':
+ case 'P':
+ multiplier = SR_GHZ(1000 * 1000);
+ break;
+ case 'e':
+ case 'E':
+ multiplier = SR_GHZ(1000 * 1000 * 1000);
+ break;
default:
done = TRUE;
s--;
if (multiplier > 0) {
*size *= multiplier;
*size += frac_part * multiplier;
- } else
+ } else {
*size += frac_part;
+ }
if (s && *s && g_ascii_strcasecmp(s, "Hz"))
return SR_ERR;