summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/cmd_nvedit.c94
1 files changed, 55 insertions, 39 deletions
diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c
index 3ee971ab0e3..ac9e5cfc320 100644
--- a/common/cmd_nvedit.c
+++ b/common/cmd_nvedit.c
@@ -94,56 +94,72 @@ int get_env_id (void)
* Command interface: print one or all environment variables
*/
-int do_printenv (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+/*
+ * state 0: finish printing this string and return (matched!)
+ * state 1: no matching to be done; print everything
+ * state 2: continue searching for matched name
+ */
+static int printenv(char *name, int state)
{
- int i, j, k, nxt;
- int rcode = 0;
-
- if (argc == 1) { /* Print all env variables */
- for (i=0; env_get_char(i) != '\0'; i=nxt+1) {
- for (nxt=i; env_get_char(nxt) != '\0'; ++nxt)
- ;
- for (k=i; k<nxt; ++k)
- putc(env_get_char(k));
- putc ('\n');
-
- if (ctrlc()) {
- puts ("\n ** Abort\n");
- return 1;
+ int i, j;
+ char c, buf[17];
+
+ i = 0;
+ buf[16] = '\0';
+
+ while (state && env_get_char(i) != '\0') {
+ if (state == 2 && envmatch((uchar *)name, i) >= 0)
+ state = 0;
+
+ j = 0;
+ do {
+ buf[j++] = c = env_get_char(i++);
+ if (j == sizeof(buf) - 1) {
+ if (state <= 1)
+ puts(buf);
+ j = 0;
}
- }
+ } while (c != '\0');
- printf("\nEnvironment size: %d/%ld bytes\n",
- i, (ulong)ENV_SIZE);
+ if (state <= 1) {
+ if (j)
+ puts(buf);
+ putc('\n');
+ }
- return 0;
+ if (ctrlc())
+ return -1;
}
- for (i=1; i<argc; ++i) { /* print single env variables */
- char *name = argv[i];
+ if (state == 0)
+ i = 0;
+ return i;
+}
- k = -1;
+int do_printenv (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+ int i;
+ int rcode = 0;
- for (j=0; env_get_char(j) != '\0'; j=nxt+1) {
+ if (argc == 1) {
+ /* print all env vars */
+ rcode = printenv(NULL, 1);
+ if (rcode < 0)
+ return 1;
+ printf("\nEnvironment size: %d/%ld bytes\n",
+ rcode, (ulong)ENV_SIZE);
+ return 0;
+ }
- for (nxt=j; env_get_char(nxt) != '\0'; ++nxt)
- ;
- k = envmatch((uchar *)name, j);
- if (k < 0) {
- continue;
- }
- puts (name);
- putc ('=');
- while (k < nxt)
- putc(env_get_char(k++));
- putc ('\n');
- break;
- }
- if (k < 0) {
- printf ("## Error: \"%s\" not defined\n", name);
- rcode ++;
+ /* print selected env vars */
+ for (i = 1; i < argc; ++i) {
+ char *name = argv[i];
+ if (printenv(name, 2)) {
+ printf("## Error: \"%s\" not defined\n", name);
+ ++rcode;
}
}
+
return rcode;
}