X-Git-Url: https://sigrok.org/gitweb/?p=sigrok-cli.git;a=blobdiff_plain;f=parsers.c;h=d575dce076c83660a0107d53884b4cade36b8b80;hp=1dfc16cba283f039280b30761e04b07c9b757312;hb=dd2f206a287e1b13abf4307c940f874668d30113;hpb=497f5362fe63dc5674ab7146384c9efab35d9e5e diff --git a/parsers.c b/parsers.c index 1dfc16c..d575dce 100644 --- a/parsers.c +++ b/parsers.c @@ -1,5 +1,5 @@ /* - * This file is part of the sigrok project. + * This file is part of the sigrok-cli project. * * Copyright (C) 2011 Bert Vermeulen * @@ -17,13 +17,12 @@ * along with this program. If not, see . */ +#include "sigrok-cli.h" #include #include #include #include #include -#include -#include "sigrok-cli.h" struct sr_probe *find_probe(GSList *probelist, const char *probename) { @@ -49,11 +48,12 @@ GSList *parse_probestring(struct sr_dev_inst *sdi, const char *probestring) char **tokens, **range, **names, *eptr, str[8]; if (!probestring || !probestring[0]) - /* All probes are enabled by default by the driver. */ - return NULL; + /* Use all probes by default. */ + return g_slist_copy(sdi->probes); ret = SR_OK; range = NULL; + names = NULL; probelist = NULL; tokens = g_strsplit(probestring, ",", 0); for (i = 0; tokens[i]; i++) { @@ -72,25 +72,25 @@ GSList *parse_probestring(struct sr_dev_inst *sdi, const char *probestring) /* Need exactly two arguments. */ g_critical("Invalid probe syntax '%s'.", tokens[i]); ret = SR_ERR; - break; + goto range_fail; } b = strtol(range[0], &eptr, 10); if (eptr == range[0] || *eptr != '\0') { g_critical("Invalid probe '%s'.", range[0]); ret = SR_ERR; - break; + goto range_fail; } e = strtol(range[1], NULL, 10); if (eptr == range[1] || *eptr != '\0') { g_critical("Invalid probe '%s'.", range[1]); ret = SR_ERR; - break; + goto range_fail; } if (b < 0 || b >= e) { g_critical("Invalid probe range '%s'.", tokens[i]); ret = SR_ERR; - break; + goto range_fail; } while (b <= e) { @@ -109,6 +109,10 @@ GSList *parse_probestring(struct sr_dev_inst *sdi, const char *probestring) probelist = g_slist_append(probelist, probe); b++; } +range_fail: + if (range) + g_strfreev(range); + if (ret != SR_OK) break; } else { @@ -116,6 +120,7 @@ GSList *parse_probestring(struct sr_dev_inst *sdi, const char *probestring) if (!names[0] || (names[1] && names[2])) { /* Need one or two arguments. */ g_critical("Invalid probe '%s'.", tokens[i]); + g_strfreev(names); ret = SR_ERR; break; } @@ -123,6 +128,7 @@ GSList *parse_probestring(struct sr_dev_inst *sdi, const char *probestring) probe = find_probe(sdi->probes, names[0]); if (!probe) { g_critical("unknown probe '%s'.", names[0]); + g_strfreev(names); ret = SR_ERR; break; } @@ -132,10 +138,10 @@ GSList *parse_probestring(struct sr_dev_inst *sdi, const char *probestring) probe->name = g_strdup(names[1]); } probelist = g_slist_append(probelist, probe); + + g_strfreev(names); } } - if (range) - g_strfreev(range); if (ret != SR_OK) { g_slist_free(probelist); @@ -177,7 +183,7 @@ GHashTable *parse_generic_arg(const char *arg, gboolean sep_first) return hash; } -char *strcanon(const char *str) +static char *strcanon(const char *str) { int p0, p1; char *s;