mirror of
https://github.com/AsahiLinux/u-boot
synced 2025-02-17 22:49:02 +00:00
env: re-add support for auto-completion
Currently, only basic completion is supported (no globs), but this is what we had previously. Signed-off-by: Mike Frysinger <vapier@gentoo.org>
This commit is contained in:
parent
42df1e1618
commit
560d424b6d
6 changed files with 50 additions and 27 deletions
|
@ -162,7 +162,6 @@ int cmd_usage(cmd_tbl_t *cmdtp)
|
||||||
|
|
||||||
int var_complete(int argc, char * const argv[], char last_char, int maxv, char *cmdv[])
|
int var_complete(int argc, char * const argv[], char last_char, int maxv, char *cmdv[])
|
||||||
{
|
{
|
||||||
#if 0 /* need to reimplement */
|
|
||||||
static char tmp_buf[512];
|
static char tmp_buf[512];
|
||||||
int space;
|
int space;
|
||||||
|
|
||||||
|
@ -173,7 +172,7 @@ int var_complete(int argc, char * const argv[], char last_char, int maxv, char *
|
||||||
|
|
||||||
if (!space && argc == 2)
|
if (!space && argc == 2)
|
||||||
return env_complete(argv[1], maxv, cmdv, sizeof(tmp_buf), tmp_buf);
|
return env_complete(argv[1], maxv, cmdv, sizeof(tmp_buf), tmp_buf);
|
||||||
#endif
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -246,42 +246,32 @@ void env_relocate (void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0 /* need to reimplement - def CONFIG_AUTO_COMPLETE */
|
#ifdef CONFIG_AUTO_COMPLETE
|
||||||
int env_complete(char *var, int maxv, char *cmdv[], int bufsz, char *buf)
|
int env_complete(char *var, int maxv, char *cmdv[], int bufsz, char *buf)
|
||||||
{
|
{
|
||||||
int i, nxt, len, vallen, found;
|
ENTRY *match;
|
||||||
const char *lval, *rval;
|
int found, idx;
|
||||||
|
|
||||||
|
idx = 0;
|
||||||
found = 0;
|
found = 0;
|
||||||
cmdv[0] = NULL;
|
cmdv[0] = NULL;
|
||||||
|
|
||||||
len = strlen(var);
|
while ((idx = hmatch_r(var, idx, &match, &env_htab))) {
|
||||||
/* now iterate over the variables and select those that match */
|
int vallen = strlen(match->key) + 1;
|
||||||
for (i=0; env_get_char(i) != '\0'; i=nxt+1) {
|
|
||||||
|
|
||||||
for (nxt=i; env_get_char(nxt) != '\0'; ++nxt)
|
if (found >= maxv - 2 || bufsz < vallen)
|
||||||
;
|
|
||||||
|
|
||||||
lval = (char *)env_get_addr(i);
|
|
||||||
rval = strchr(lval, '=');
|
|
||||||
if (rval != NULL) {
|
|
||||||
vallen = rval - lval;
|
|
||||||
rval++;
|
|
||||||
} else
|
|
||||||
vallen = strlen(lval);
|
|
||||||
|
|
||||||
if (len > 0 && (vallen < len || memcmp(lval, var, len) != 0))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (found >= maxv - 2 || bufsz < vallen + 1) {
|
|
||||||
cmdv[found++] = "...";
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
cmdv[found++] = buf;
|
cmdv[found++] = buf;
|
||||||
memcpy(buf, lval, vallen); buf += vallen; bufsz -= vallen;
|
memcpy(buf, match->key, vallen);
|
||||||
*buf++ = '\0'; bufsz--;
|
buf += vallen;
|
||||||
|
bufsz -= vallen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qsort(cmdv, found, sizeof(cmdv[0]), strcmp_compar);
|
||||||
|
|
||||||
|
if (idx)
|
||||||
|
cmdv[found++] = "...";
|
||||||
cmdv[found] = NULL;
|
cmdv[found] = NULL;
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
|
@ -632,6 +632,7 @@ static inline IPaddr_t getenv_IPaddr (char *var)
|
||||||
/* lib/qsort.c */
|
/* lib/qsort.c */
|
||||||
void qsort(void *base, size_t nmemb, size_t size,
|
void qsort(void *base, size_t nmemb, size_t size,
|
||||||
int(*compar)(const void *, const void *));
|
int(*compar)(const void *, const void *));
|
||||||
|
int strcmp_compar(const void *, const void *);
|
||||||
|
|
||||||
/* lib/time.c */
|
/* lib/time.c */
|
||||||
void udelay (unsigned long);
|
void udelay (unsigned long);
|
||||||
|
|
|
@ -74,6 +74,13 @@ extern void hdestroy_r(struct hsearch_data *__htab);
|
||||||
extern int hsearch_r(ENTRY __item, ACTION __action, ENTRY ** __retval,
|
extern int hsearch_r(ENTRY __item, ACTION __action, ENTRY ** __retval,
|
||||||
struct hsearch_data *__htab);
|
struct hsearch_data *__htab);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Search for an entry matching `MATCH'. Otherwise, Same semantics
|
||||||
|
* as hsearch_r().
|
||||||
|
*/
|
||||||
|
extern int hmatch_r(const char *__match, int __last_idx, ENTRY ** __retval,
|
||||||
|
struct hsearch_data *__htab);
|
||||||
|
|
||||||
/* Search and delete entry matching ITEM.key in internal hash table. */
|
/* Search and delete entry matching ITEM.key in internal hash table. */
|
||||||
extern int hdelete_r(const char *__key, struct hsearch_data *__htab);
|
extern int hdelete_r(const char *__key, struct hsearch_data *__htab);
|
||||||
|
|
||||||
|
|
|
@ -202,6 +202,26 @@ void hdestroy_r(struct hsearch_data *htab)
|
||||||
* example for functions like hdelete().
|
* example for functions like hdelete().
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
int hmatch_r(const char *match, int last_idx, ENTRY ** retval,
|
||||||
|
struct hsearch_data *htab)
|
||||||
|
{
|
||||||
|
unsigned int idx;
|
||||||
|
size_t key_len = strlen(match);
|
||||||
|
|
||||||
|
for (idx = last_idx + 1; idx < htab->size; ++idx) {
|
||||||
|
if (!htab->table[idx].used)
|
||||||
|
continue;
|
||||||
|
if (!strncmp(match, htab->table[idx].entry.key, key_len)) {
|
||||||
|
*retval = &htab->table[idx].entry;
|
||||||
|
return idx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__set_errno(ESRCH);
|
||||||
|
*retval = NULL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int hsearch_r(ENTRY item, ACTION action, ENTRY ** retval,
|
int hsearch_r(ENTRY item, ACTION action, ENTRY ** retval,
|
||||||
struct hsearch_data *htab)
|
struct hsearch_data *htab)
|
||||||
{
|
{
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
* bcc and gcc. */
|
* bcc and gcc. */
|
||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
#include <exports.h>
|
||||||
#if 0
|
#if 0
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#else
|
#else
|
||||||
|
@ -67,3 +68,8 @@ void qsort(void *base,
|
||||||
} while (wgap);
|
} while (wgap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int strcmp_compar(const void *p1, const void *p2)
|
||||||
|
{
|
||||||
|
return strcmp(*(const char **)p1, *(const char **)p2);
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue