|
@@ -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 i, nxt, len, vallen, found;
|
|
|
- const char *lval, *rval;
|
|
|
+ ENTRY *match;
|
|
|
+ int found, idx;
|
|
|
|
|
|
+ idx = 0;
|
|
|
found = 0;
|
|
|
cmdv[0] = NULL;
|
|
|
|
|
|
- len = strlen(var);
|
|
|
- /* now iterate over the variables and select those that match */
|
|
|
- for (i=0; env_get_char(i) != '\0'; i=nxt+1) {
|
|
|
+ while ((idx = hmatch_r(var, idx, &match, &env_htab))) {
|
|
|
+ int vallen = strlen(match->key) + 1;
|
|
|
|
|
|
- for (nxt=i; env_get_char(nxt) != '\0'; ++nxt)
|
|
|
- ;
|
|
|
-
|
|
|
- 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++] = "...";
|
|
|
+ if (found >= maxv - 2 || bufsz < vallen)
|
|
|
break;
|
|
|
- }
|
|
|
+
|
|
|
cmdv[found++] = buf;
|
|
|
- memcpy(buf, lval, vallen); buf += vallen; bufsz -= vallen;
|
|
|
- *buf++ = '\0'; bufsz--;
|
|
|
+ memcpy(buf, match->key, vallen);
|
|
|
+ buf += vallen;
|
|
|
+ bufsz -= vallen;
|
|
|
}
|
|
|
|
|
|
+ qsort(cmdv, found, sizeof(cmdv[0]), strcmp_compar);
|
|
|
+
|
|
|
+ if (idx)
|
|
|
+ cmdv[found++] = "...";
|
|
|
cmdv[found] = NULL;
|
|
|
return found;
|
|
|
}
|