diff options
Diffstat (limited to 'common/cmd_nvedit.c')
| -rw-r--r-- | common/cmd_nvedit.c | 90 | 
1 files changed, 53 insertions, 37 deletions
| diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c index 3ee971ab0..ac9e5cfc3 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; +	int i, j; +	char c, buf[17]; -	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'); +	i = 0; +	buf[16] = '\0'; -			if (ctrlc()) { -				puts ("\n ** Abort\n"); -				return 1; +	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;  } |