Commit 770aaedb authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull bootconfig updates from Masami Hiramatsu:

 - Update the bootconfig parser to stop searching for a value when it
   encounters a newline character

 - Update the tests for bootconfig parser to ensure the good examples to
   be parsed correctly by comparing the expected results

* tag 'bootconfig-v7.0' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace:
  bootconfig: Check the parsed output of the good examples
  bootconfig: Terminate value search if it hits a newline
parents 3c6e577d 8c5d862f
Loading
Loading
Loading
Loading
+16 −8
Original line number Diff line number Diff line
@@ -20,18 +20,26 @@ Config File Syntax

The boot config syntax is a simple structured key-value. Each key consists
of dot-connected-words, and key and value are connected by ``=``. The value
has to be terminated by semi-colon (``;``) or newline (``\n``).
For array value, array entries are separated by comma (``,``). ::

  KEY[.WORD[...]] = VALUE[, VALUE2[...]][;]

Unlike the kernel command line syntax, spaces are OK around the comma and ``=``.
string has to be terminated by the following delimiters described below.

Each key word must contain only alphabets, numbers, dash (``-``) or underscore
(``_``). And each value only contains printable characters or spaces except
for delimiters such as semi-colon (``;``), new-line (``\n``), comma (``,``),
hash (``#``) and closing brace (``}``).

If the ``=`` is followed by whitespace up to one of these delimiters, the
key is assigned an empty value.

For arrays, the array values are comma (``,``) separated, and comments and
line breaks with newline (``\n``) are allowed between array values for
readability. Thus the first entry of the array must be on the same line as
the key.::

  KEY[.WORD[...]] = VALUE[, VALUE2[...]][;]

Unlike the kernel command line syntax, white spaces (including tabs) are
ignored around the comma and ``=``.

If you want to use those delimiters in a value, you can use either double-
quotes (``"VALUE"``) or single-quotes (``'VALUE'``) to quote it. Note that
you can not escape these quotes.
@@ -138,8 +146,8 @@ This is parsed as below::
 foo = value
 bar = 1, 2, 3

Note that you can not put a comment between value and delimiter(``,`` or
``;``). This means following config has a syntax error ::
Note that you can NOT put a comment or a newline between value and delimiter
(``,`` or ``;``). This means following config has a syntax error ::

 key = 1 # comment
       ,2
+19 −8
Original line number Diff line number Diff line
@@ -557,17 +557,13 @@ static int __init __xbc_close_brace(char *p)
/*
 * Return delimiter or error, no node added. As same as lib/cmdline.c,
 * you can use " around spaces, but can't escape " for value.
 * *@__v must point real value string. (not including spaces before value.)
 */
static int __init __xbc_parse_value(char **__v, char **__n)
{
	char *p, *v = *__v;
	int c, quotes = 0;

	v = skip_spaces(v);
	while (*v == '#') {
		v = skip_comment(v);
		v = skip_spaces(v);
	}
	if (*v == '"' || *v == '\'') {
		quotes = *v;
		v++;
@@ -617,6 +613,13 @@ static int __init xbc_parse_array(char **__v)
		last_parent = xbc_node_get_child(last_parent);

	do {
		/* Search the next array value beyond comments and empty lines */
		next = skip_spaces(*__v);
		while (*next == '#') {
			next = skip_comment(next);
			next = skip_spaces(next);
		}
		*__v = next;
		c = __xbc_parse_value(__v, &next);
		if (c < 0)
			return c;
@@ -701,9 +704,17 @@ static int __init xbc_parse_kv(char **k, char *v, int op)
	if (ret)
		return ret;

	v = skip_spaces_until_newline(v);
	/* If there is a comment, this has an empty value. */
	if (*v == '#') {
		next = skip_comment(v);
		*v = '\0';
		c = '\n';
	} else {
		c = __xbc_parse_value(&v, &next);
		if (c < 0)
			return c;
	}

	child = xbc_node_get_child(last_parent);
	if (child && xbc_node_is_value(child)) {
+4 −0
Original line number Diff line number Diff line
# the first array value must be on the same line as the key
key = # comment
 value1,
 value2
+4 −0
Original line number Diff line number Diff line
# the first array value must be on the same line as the key
key =
  value1,
  value2
+1 −0
Original line number Diff line number Diff line
key = "value1", "value2", "value3";
Loading