diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2015-08-06 16:22:01 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2015-08-07 09:20:39 +0200 |
commit | 3086fd8bb43ae6350d057e8a1534cfcc2f7f7558 (patch) | |
tree | ad1875ad79a3200046ccdc27d5765762d97b33d6 | |
parent | 98b5672c4d474f25227450a29f82f14e84c85f3c (diff) | |
download | barebox-3086fd8bb43ae6350d057e8a1534cfcc2f7f7558.tar.gz barebox-3086fd8bb43ae6350d057e8a1534cfcc2f7f7558.tar.xz |
completion: fix device parameter completion
With device parameter completion the '.' separator between the device
name and the parameter was not handled correctly. For example with
a device named global a completion starting with "g." was completed to
"g.obal.". fix this.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | common/complete.c | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/common/complete.c b/common/complete.c index f0ef576401..aee21ea183 100644 --- a/common/complete.c +++ b/common/complete.c @@ -169,15 +169,12 @@ int device_complete(struct string_list *sl, char *instr) } EXPORT_SYMBOL(device_complete); -static int device_param_complete(char *begin, struct device_d *dev, - struct string_list *sl, char *instr) +static int device_param_complete(struct device_d *dev, struct string_list *sl, + char *instr, int eval) { struct param_d *param; int len; - if (!instr) - instr = ""; - len = strlen(instr); list_for_each_entry(param, &dev->parameters, list) { @@ -185,8 +182,8 @@ static int device_param_complete(char *begin, struct device_d *dev, continue; string_list_add_asprintf(sl, "%s%s.%s%c", - begin ? begin : "", dev_name(dev), param->name, - begin ? ' ' : '='); + eval ? "$" : "", dev_name(dev), param->name, + eval ? ' ' : '='); } return 0; @@ -316,20 +313,26 @@ static int env_param_complete(struct string_list *sl, char *instr, int eval) } if (instr_param) { + char *devname; + len = (instr_param - instr); + + devname = xstrndup(instr, len); + instr_param++; - } else { - len = strlen(instr); - instr_param = ""; + + dev = get_device_by_name(devname); + free(devname); + if (dev) + device_param_complete(dev, sl, instr_param, eval); + return 0; } + len = strlen(instr); + for_each_device(dev) { - if (!strncmp(instr, dev_name(dev), len)) { - if (eval) - device_param_complete("$", dev, sl, instr_param); - else - device_param_complete(NULL, dev, sl, instr_param); - } + if (!strncmp(instr, dev_name(dev), len)) + device_param_complete(dev, sl, "", eval); } return 0; |