From 40f5ddac0125b1a7c9b2625dda631f3c0ba24a4b Mon Sep 17 00:00:00 2001 From: Bert Vermeulen Date: Mon, 31 Jan 2011 22:29:40 +0100 Subject: [PATCH] move samplerate/period printers and parsers into libsigrok --- Makefile.am | 3 +- output/Makefile.am | 1 - sigrok-proto.h | 3 + output/common.c => strutil.c | 125 +++++++++++++++++++++++++++++++++++ 4 files changed, 130 insertions(+), 2 deletions(-) rename output/common.c => strutil.c (53%) diff --git a/Makefile.am b/Makefile.am index a7dbb232..a7de7a65 100644 --- a/Makefile.am +++ b/Makefile.am @@ -29,7 +29,8 @@ libsigrok_la_SOURCES = \ device.c \ session.c \ hwplugin.c \ - filter.c + filter.c \ + strutil.c libsigrok_la_LIBADD = \ $(LIBOBJS) \ diff --git a/output/Makefile.am b/output/Makefile.am index 0a00136f..510ecb79 100644 --- a/output/Makefile.am +++ b/output/Makefile.am @@ -30,7 +30,6 @@ libsigrokoutput_la_SOURCES = \ text/bits.c \ text/hex.c \ text/ascii.c \ - common.c \ output.c libsigrokoutput_la_CFLAGS = \ diff --git a/sigrok-proto.h b/sigrok-proto.h index bba85b20..12665fea 100644 --- a/sigrok-proto.h +++ b/sigrok-proto.h @@ -132,5 +132,8 @@ struct sr_output_format **sr_output_list(void); char *sr_samplerate_string(uint64_t samplerate); char *sr_period_string(uint64_t frequency); +char **sr_parse_triggerstring(struct sr_device *device, const char *triggerstring); +uint64_t sr_parse_sizestring(const char *sizestring); +uint64_t sr_parse_timestring(const char *timestring); #endif diff --git a/output/common.c b/strutil.c similarity index 53% rename from output/common.c rename to strutil.c index 77914956..b8eb0f8e 100644 --- a/output/common.c +++ b/strutil.c @@ -95,3 +95,128 @@ char *sr_period_string(uint64_t frequency) return o; } + +char **sr_parse_triggerstring(struct sr_device *device, const char *triggerstring) +{ + GSList *l; + struct probe *probe; + int max_probes, probenum, i; + char **tokens, **triggerlist, *trigger, *tc, *trigger_types; + gboolean error; + + max_probes = g_slist_length(device->probes); + error = FALSE; + triggerlist = g_malloc0(max_probes * sizeof(char *)); + tokens = g_strsplit(triggerstring, ",", max_probes); + trigger_types = device->plugin->get_device_info(0, SR_DI_TRIGGER_TYPES); + if (trigger_types == NULL) + return NULL; + + for (i = 0; tokens[i]; i++) { + if (tokens[i][0] < '0' || tokens[i][0] > '9') { + /* Named probe */ + probenum = 0; + for (l = device->probes; l; l = l->next) { + probe = (struct probe *)l->data; + if (probe->enabled + && !strncmp(probe->name, tokens[i], + strlen(probe->name))) { + probenum = probe->index; + break; + } + } + } else { + probenum = strtol(tokens[i], NULL, 10); + } + + if (probenum < 1 || probenum > max_probes) { + printf("Invalid probe.\n"); + error = TRUE; + break; + } + + if ((trigger = strchr(tokens[i], '='))) { + for (tc = ++trigger; *tc; tc++) { + if (strchr(trigger_types, *tc) == NULL) { + printf("Unsupported trigger type " + "'%c'\n", *tc); + error = TRUE; + break; + } + } + if (!error) + triggerlist[probenum - 1] = g_strdup(trigger); + } + } + g_strfreev(tokens); + + if (error) { + for (i = 0; i < max_probes; i++) + if (triggerlist[i]) + g_free(triggerlist[i]); + g_free(triggerlist); + triggerlist = NULL; + } + + return triggerlist; +} + +uint64_t sr_parse_sizestring(const char *sizestring) +{ + int multiplier; + uint64_t val; + char *s; + + val = strtoull(sizestring, &s, 10); + multiplier = 0; + while (s && *s && multiplier == 0) { + switch (*s) { + case ' ': + break; + case 'k': + case 'K': + multiplier = KHZ(1); + break; + case 'm': + case 'M': + multiplier = MHZ(1); + break; + case 'g': + case 'G': + multiplier = GHZ(1); + break; + default: + val = 0; + multiplier = -1; + } + s++; + } + if (multiplier > 0) + val *= multiplier; + + return val; +} + +uint64_t sr_parse_timestring(const char *timestring) +{ + uint64_t time_msec; + char *s; + + time_msec = strtoull(timestring, &s, 10); + if (time_msec == 0 && s == timestring) + return 0; + + if (s && *s) { + while (*s == ' ') + s++; + if (!strcmp(s, "s")) + time_msec *= 1000; + else if (!strcmp(s, "ms")) + ; /* redundant */ + else + return 0; + } + + return time_msec; +} +