26 #include "libsigrok-internal.h"
29 #define LOG_PREFIX "strutil"
61 SR_PRIV int sr_atol(
const char *str,
long *ret)
67 tmp = strtol(str, &endptr, 0);
69 if (!endptr || *endptr || errno) {
94 SR_PRIV int sr_atoi(
const char *str,
int *ret)
98 if (sr_atol(str, &tmp) !=
SR_OK)
101 if ((
int) tmp != tmp) {
125 SR_PRIV int sr_atod(
const char *str,
double *ret)
131 tmp = strtof(str, &endptr);
133 if (!endptr || *endptr || errno) {
158 SR_PRIV int sr_atof(
const char *str,
float *ret)
162 if (sr_atod(str, &tmp) !=
SR_OK)
165 if ((
float) tmp != tmp) {
189 SR_PRIV int sr_atof_ascii(
const char *str,
float *ret)
195 tmp = g_ascii_strtod(str, &endptr);
197 if (!endptr || *endptr || errno) {
237 uint64_t quot, divisor[] = {
241 const char *p, prefix[] =
"\0kMGTPE";
242 char fmt[16], fract[20] =
"", *f;
247 for (i = 0; (quot = x / divisor[i]) >= 1000; i++);
250 sprintf(fmt,
".%%0%d"PRIu64, i * 3);
251 f = fract + sprintf(fract, fmt, x % divisor[i]) - 1;
253 while (f >= fract && strchr(
"0.", *f))
259 return g_strdup_printf(
"%" PRIu64
"%s %.1s%s", quot, fract, p, unit);
301 if (!(o = g_try_malloc0(30 + 1))) {
302 sr_err(
"%s: o malloc failed", __func__);
306 if (frequency >=
SR_GHZ(1))
307 r = snprintf(o, 30,
"%" PRIu64
" ns", frequency / 1000000000);
308 else if (frequency >=
SR_MHZ(1))
309 r = snprintf(o, 30,
"%" PRIu64
" us", frequency / 1000000);
310 else if (frequency >=
SR_KHZ(1))
311 r = snprintf(o, 30,
"%" PRIu64
" ms", frequency / 1000);
313 r = snprintf(o, 30,
"%" PRIu64
" s", frequency);
345 if (!(o = g_try_malloc0(30 + 1))) {
346 sr_err(
"%s: o malloc failed", __func__);
351 r = snprintf(o, 30,
"%" PRIu64
"mV", v_p);
353 r = snprintf(o, 30,
"%" PRIu64
"V", v_p);
355 r = snprintf(o, 30,
"%gV", (
float)v_p / (
float)v_q);
392 const char *triggerstring)
397 int max_channels, channelnum, i;
398 char **tokens, **triggerlist, *
trigger, *tc;
399 const char *trigger_types;
402 max_channels = g_slist_length(sdi->
channels);
405 if (!(triggerlist = g_try_malloc0(max_channels *
sizeof(
char *)))) {
406 sr_err(
"%s: triggerlist malloc failed", __func__);
411 &gvar, sdi, NULL) !=
SR_OK) {
412 sr_err(
"%s: Device doesn't support any triggers.", __func__);
415 trigger_types = g_variant_get_string(gvar, NULL);
417 tokens = g_strsplit(triggerstring,
",", max_channels);
418 for (i = 0; tokens[i]; i++) {
420 for (l = sdi->
channels; l; l = l->next) {
423 && !strncmp(ch->
name, tokens[i],
425 channelnum = ch->
index;
430 if (channelnum < 0 || channelnum >= max_channels) {
431 sr_err(
"Invalid channel.");
436 if ((trigger = strchr(tokens[i],
'='))) {
437 for (tc = ++trigger; *tc; tc++) {
438 if (strchr(trigger_types, *tc) == NULL) {
439 sr_err(
"Unsupported trigger "
446 triggerlist[channelnum] = g_strdup(trigger);
450 g_variant_unref(gvar);
453 for (i = 0; i < max_channels; i++)
454 g_free(triggerlist[i]);
481 int multiplier, done;
485 *size = strtoull(sizestring, &s, 10);
489 while (s && *s && multiplier == 0 && !done) {
494 frac_part = g_ascii_strtod(s, &s);
514 if (multiplier > 0) {
516 *size += frac_part * multiplier;
520 if (*s && strcasecmp(s,
"Hz"))
553 time_msec = strtoull(timestring, &s, 10);
554 if (time_msec == 0 && s == timestring)
562 else if (!strcmp(s,
"ms"))
577 if (!g_ascii_strncasecmp(boolstr,
"true", 4) ||
578 !g_ascii_strncasecmp(boolstr,
"yes", 3) ||
579 !g_ascii_strncasecmp(boolstr,
"on", 2) ||
580 !g_ascii_strncasecmp(boolstr,
"1", 1))
591 *p = strtoull(periodstr, &s, 10);
592 if (*p == 0 && s == periodstr)
599 if (!strcmp(s,
"fs"))
600 *q = 1000000000000000ULL;
601 else if (!strcmp(s,
"ps"))
602 *q = 1000000000000ULL;
603 else if (!strcmp(s,
"ns"))
605 else if (!strcmp(s,
"us"))
607 else if (!strcmp(s,
"ms"))
609 else if (!strcmp(s,
"s"))
624 *p = strtoull(voltstr, &s, 10);
625 if (*p == 0 && s == voltstr)
632 if (!strcasecmp(s,
"mv"))
634 else if (!strcasecmp(s,
"v"))