diff options
| -rw-r--r-- | common/main.c | 168 | 
1 files changed, 77 insertions, 91 deletions
| diff --git a/common/main.c b/common/main.c index 13d12a430..cc4b50f61 100644 --- a/common/main.c +++ b/common/main.c @@ -95,14 +95,12 @@ static __inline__ int abortboot(int bootdelay)  {  	int abort = 0;  	uint64_t etime = endtick(bootdelay); -	struct -	{ +	struct {  		char* str;  		u_int len;  		int retry;  	} -	delaykey [] = -	{ +	delaykey [] = {  		{ str: getenv ("bootdelaykey"),  retry: 1 },  		{ str: getenv ("bootdelaykey2"), retry: 1 },  		{ str: getenv ("bootstopkey"),   retry: 0 }, @@ -498,7 +496,7 @@ void main_loop (void)  #ifdef CONFIG_BOOT_RETRY_TIME  /*************************************************************************** - * initialise command line timeout + * initialize command line timeout   */  void init_cmd_timeout(void)  { @@ -529,23 +527,9 @@ void reset_cmd_timeout(void)   * Author: Janghoon Lyu <nandy@mizi.com>   */ -#if 1	/* avoid redundand code -- wd */  #define putnstr(str,n)	do {			\  		printf ("%.*s", n, str);	\  	} while (0) -#else -void putnstr(const char *str, size_t n) -{ -	if (str == NULL) -		return; - -	while (n && *str != '\0') { -		putc(*str); -		str++; -		n--; -	} -} -#endif  #define CTL_CH(c)		((c) - 'a' + 1) @@ -1138,97 +1122,99 @@ static void process_macros (const char *input, char *output)  {  	char c, prev;  	const char *varname_start = NULL; -	int inputcnt  = strlen (input); +	int inputcnt = strlen (input);  	int outputcnt = CFG_CBSIZE; -	int state = 0;	/* 0 = waiting for '$'	*/ -			/* 1 = waiting for '(' or '{' */ -			/* 2 = waiting for ')' or '}' */ -			/* 3 = waiting for '''  */ +	int state = 0;		/* 0 = waiting for '$'  */ + +	/* 1 = waiting for '(' or '{' */ +	/* 2 = waiting for ')' or '}' */ +	/* 3 = waiting for '''  */  #ifdef DEBUG_PARSER  	char *output_start = output; -	printf ("[PROCESS_MACROS] INPUT len %d: \"%s\"\n", strlen(input), input); +	printf ("[PROCESS_MACROS] INPUT len %d: \"%s\"\n", strlen (input), +		input);  #endif -	prev = '\0';			/* previous character	*/ +	prev = '\0';		/* previous character   */  	while (inputcnt && outputcnt) { -	    c = *input++; -	    inputcnt--; - -	    if (state!=3) { -	    /* remove one level of escape characters */ -	    if ((c == '\\') && (prev != '\\')) { -		if (inputcnt-- == 0) -			break; -		prev = c;  		c = *input++; -	    } -	    } +		inputcnt--; -	    switch (state) { -	    case 0:			/* Waiting for (unescaped) $	*/ -		if ((c == '\'') && (prev != '\\')) { -			state = 3; -			break; -		} -		if ((c == '$') && (prev != '\\')) { -			state++; -		} else { -			*(output++) = c; -			outputcnt--; +		if (state != 3) { +			/* remove one level of escape characters */ +			if ((c == '\\') && (prev != '\\')) { +				if (inputcnt-- == 0) +					break; +				prev = c; +				c = *input++; +			}  		} -		break; -	    case 1:			/* Waiting for (	*/ -		if (c == '(' || c == '{') { -			state++; -			varname_start = input; -		} else { -			state = 0; -			*(output++) = '$'; -			outputcnt--; -			if (outputcnt) { +		switch (state) { +		case 0:	/* Waiting for (unescaped) $    */ +			if ((c == '\'') && (prev != '\\')) { +				state = 3; +				break; +			} +			if ((c == '$') && (prev != '\\')) { +				state++; +			} else {  				*(output++) = c;  				outputcnt--;  			} -		} -		break; -	    case 2:			/* Waiting for )	*/ -		if (c == ')' || c == '}') { -			int i; -			char envname[CFG_CBSIZE], *envval; -			int envcnt = input-varname_start-1; /* Varname # of chars */ +			break; +		case 1:	/* Waiting for (        */ +			if (c == '(' || c == '{') { +				state++; +				varname_start = input; +			} else { +				state = 0; +				*(output++) = '$'; +				outputcnt--; -			/* Get the varname */ -			for (i = 0; i < envcnt; i++) { -				envname[i] = varname_start[i]; +				if (outputcnt) { +					*(output++) = c; +					outputcnt--; +				}  			} -			envname[i] = 0; - -			/* Get its value */ -			envval = getenv (envname); +			break; +		case 2:	/* Waiting for )        */ +			if (c == ')' || c == '}') { +				int i; +				char envname[CFG_CBSIZE], *envval; +				int envcnt = input - varname_start - 1;	/* Varname # of chars */ -			/* Copy into the line if it exists */ -			if (envval != NULL) -				while ((*envval) && outputcnt) { -					*(output++) = *(envval++); -					outputcnt--; +				/* Get the varname */ +				for (i = 0; i < envcnt; i++) { +					envname[i] = varname_start[i];  				} -			/* Look for another '$' */ -			state = 0; -		} -		break; -	    case 3:			/* Waiting for '	*/ -		if ((c == '\'') && (prev != '\\')) { -			state = 0; -		} else { -			*(output++) = c; -			outputcnt--; +				envname[i] = 0; + +				/* Get its value */ +				envval = getenv (envname); + +				/* Copy into the line if it exists */ +				if (envval != NULL) +					while ((*envval) && outputcnt) { +						*(output++) = *(envval++); +						outputcnt--; +					} +				/* Look for another '$' */ +				state = 0; +			} +			break; +		case 3:	/* Waiting for '        */ +			if ((c == '\'') && (prev != '\\')) { +				state = 0; +			} else { +				*(output++) = c; +				outputcnt--; +			} +			break;  		} -		break; -	    } -	    prev = c; +		prev = c;  	}  	if (outputcnt) @@ -1236,7 +1222,7 @@ static void process_macros (const char *input, char *output)  #ifdef DEBUG_PARSER  	printf ("[PROCESS_MACROS] OUTPUT len %d: \"%s\"\n", -		strlen(output_start), output_start); +		strlen (output_start), output_start);  #endif  } |