#include <stdint.h>
#include <string.h>
#include <glib.h>
-#include <sigrok.h>
+#include <libsigrok/libsigrok.h>
#include "sigrok-cli.h"
char **parse_probestring(int max_probes, const char *probestring)
range = g_strsplit(tokens[i], "-", 2);
if (!range[0] || !range[1] || range[2]) {
/* Need exactly two arguments. */
- printf("Invalid probe syntax '%s'.\n",
- tokens[i]);
+ g_critical("Invalid probe syntax '%s'.", tokens[i]);
error = TRUE;
break;
}
b = strtol(range[0], NULL, 10);
e = strtol(range[1], NULL, 10);
- if (b < 1 || e > max_probes || b >= e) {
- printf("Invalid probe range '%s'.\n",
- tokens[i]);
+ if (b < 0 || e >= max_probes || b >= e) {
+ g_critical("Invalid probe range '%s'.", tokens[i]);
error = TRUE;
break;
}
while (b <= e) {
snprintf(str, 7, "%d", b);
- probelist[b - 1] = g_strdup(str);
+ probelist[b] = g_strdup(str);
b++;
}
} else {
tmp = strtol(tokens[i], NULL, 10);
- if (tmp < 1 || tmp > max_probes) {
- printf("Invalid probe %d.\n", tmp);
+ if (tmp < 0 || tmp >= max_probes) {
+ g_critical("Invalid probe %d.", tmp);
error = TRUE;
break;
}
if ((name = strchr(tokens[i], '='))) {
- probelist[tmp - 1] = g_strdup(++name);
- if (strlen(probelist[tmp - 1]) > SR_MAX_PROBENAME_LEN)
- probelist[tmp - 1][SR_MAX_PROBENAME_LEN] = 0;
+ probelist[tmp] = g_strdup(++name);
+ if (strlen(probelist[tmp]) > SR_MAX_PROBENAME_LEN)
+ probelist[tmp][SR_MAX_PROBENAME_LEN] = 0;
} else {
snprintf(str, 7, "%d", tmp);
- probelist[tmp - 1] = g_strdup(str);
+ probelist[tmp] = g_strdup(str);
}
}
}
return probelist;
}
-GHashTable *parse_generic_arg(const char *arg)
+GHashTable *parse_generic_arg(const char *arg, gboolean sep_first)
{
GHashTable *hash;
int i;
if (!arg || !arg[0])
return NULL;
- hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
+ i = 0;
+ hash = g_hash_table_new_full(g_str_hash, g_str_equal,
+ g_free, g_free);
elements = g_strsplit(arg, ":", 0);
- g_hash_table_insert(hash, g_strdup("sigrok_key"), g_strdup(elements[0]));
- for (i = 1; elements[i]; i++) {
+ if (sep_first)
+ g_hash_table_insert(hash, g_strdup("sigrok_key"),
+ g_strdup(elements[i++]));
+ for (; elements[i]; i++) {
e = strchr(elements[i], '=');
if (!e)
g_hash_table_insert(hash, g_strdup(elements[i]), NULL);
return hash;
}
-struct sr_dev *parse_devstring(const char *devstring)
+char *strcanon(const char *str)
{
- struct sr_dev *dev, *d;
- struct sr_dev_driver **drivers;
- GSList *devs, *l;
- int i, num_devs, dev_num, dev_cnt;
- char *tmp;
+ int p0, p1;
+ char *s;
+
+ /* Returns newly allocated string. */
+ s = g_ascii_strdown(str, -1);
+ for (p0 = p1 = 0; str[p0]; p0++) {
+ if ((s[p0] >= 'a' && s[p0] <= 'z')
+ || (s[p0] >= '0' && s[p0] <= '9'))
+ s[p1++] = s[p0];
+ }
+ s[p1] = '\0';
- if (!devstring)
- return NULL;
+ return s;
+}
- dev = NULL;
- dev_num = strtol(devstring, &tmp, 10);
- if (tmp != devstring) {
- /* argument is numeric, meaning a device ID. Make all drivers
- * scan for devices.
- */
- num_devs = num_real_devs();
- if (dev_num < 0 || dev_num >= num_devs)
- return NULL;
-
- dev_cnt = 0;
- devs = sr_dev_list();
- for (l = devs; l; l = l->next) {
- d = l->data;
- if (sr_dev_has_hwcap(d, SR_HWCAP_DEMO_DEV))
- continue;
- if (dev_cnt == dev_num) {
- if (dev_num == dev_cnt) {
- dev = d;
- break;
- }
- }
- dev_cnt++;
- }
- } else {
- /* select device by driver -- only initialize that driver,
- * no need to let them all scan
- */
- dev = NULL;
- drivers = sr_hw_list();
- for (i = 0; drivers[i]; i++) {
- if (strcmp(drivers[i]->name, devstring))
- continue;
- num_devs = sr_hw_init(drivers[i]);
- if (num_devs == 1) {
- devs = sr_dev_list();
- dev = devs->data;
- } else if (num_devs > 1) {
- printf("driver '%s' found %d devices, select by ID instead.\n",
- devstring, num_devs);
- }
- /* fall through: selected driver found no devices */
- break;
- }
- }
+int canon_cmp(const char *str1, const char *str2)
+{
+ int ret;
+ char *s1, *s2;
+
+ s1 = strcanon(str1);
+ s2 = strcanon(str2);
+ ret = g_ascii_strcasecmp(s1, s2);
+ g_free(s2);
+ g_free(s1);
- return dev;
+ return ret;
}