diff options
Diffstat (limited to 'lib/cmdline.c')
| -rw-r--r-- | lib/cmdline.c | 57 | 
1 files changed, 57 insertions, 0 deletions
diff --git a/lib/cmdline.c b/lib/cmdline.c index 8f13cf73c2ec..3c6432df7e63 100644 --- a/lib/cmdline.c +++ b/lib/cmdline.c @@ -15,6 +15,7 @@  #include <linux/export.h>  #include <linux/kernel.h>  #include <linux/string.h> +#include <linux/ctype.h>  /*   *	If a hyphen was found in get_option, this will handle the @@ -189,3 +190,59 @@ bool parse_option_str(const char *str, const char *option)  	return false;  } + +/* + * Parse a string to get a param value pair. + * You can use " around spaces, but can't escape ". + * Hyphens and underscores equivalent in parameter names. + */ +char *next_arg(char *args, char **param, char **val) +{ +	unsigned int i, equals = 0; +	int in_quote = 0, quoted = 0; +	char *next; + +	if (*args == '"') { +		args++; +		in_quote = 1; +		quoted = 1; +	} + +	for (i = 0; args[i]; i++) { +		if (isspace(args[i]) && !in_quote) +			break; +		if (equals == 0) { +			if (args[i] == '=') +				equals = i; +		} +		if (args[i] == '"') +			in_quote = !in_quote; +	} + +	*param = args; +	if (!equals) +		*val = NULL; +	else { +		args[equals] = '\0'; +		*val = args + equals + 1; + +		/* Don't include quotes in value. */ +		if (**val == '"') { +			(*val)++; +			if (args[i-1] == '"') +				args[i-1] = '\0'; +		} +	} +	if (quoted && args[i-1] == '"') +		args[i-1] = '\0'; + +	if (args[i]) { +		args[i] = '\0'; +		next = args + i + 1; +	} else +		next = args + i; + +	/* Chew up trailing spaces. */ +	return skip_spaces(next); +	//return next; +}  | 
