settings: Add support for multi-line strings
Unterminated strings are now an error.
This commit is contained in:
@@ -119,16 +119,11 @@ static void include_files(parser_helper_t *ctx);
|
|||||||
<str>{
|
<str>{
|
||||||
"\"" |
|
"\"" |
|
||||||
<<EOF>> |
|
<<EOF>> |
|
||||||
\n |
|
|
||||||
\\ {
|
\\ {
|
||||||
if (!streq(yytext, "\""))
|
if (!streq(yytext, "\""))
|
||||||
{
|
{
|
||||||
if (streq(yytext, "\n"))
|
|
||||||
{ /* put the newline back to fix the line numbers */
|
|
||||||
unput('\n');
|
|
||||||
yy_set_bol(0);
|
|
||||||
}
|
|
||||||
PARSER_DBG1(yyextra, "unterminated string detected");
|
PARSER_DBG1(yyextra, "unterminated string detected");
|
||||||
|
return STRING_ERROR;
|
||||||
}
|
}
|
||||||
if (yy_top_state(yyscanner) == inc)
|
if (yy_top_state(yyscanner) == inc)
|
||||||
{ /* string include */
|
{ /* string include */
|
||||||
@@ -148,7 +143,7 @@ static void include_files(parser_helper_t *ctx);
|
|||||||
\\t yyextra->string_add(yyextra, "\t");
|
\\t yyextra->string_add(yyextra, "\t");
|
||||||
\\\r?\n /* merge lines that end with EOL characters */
|
\\\r?\n /* merge lines that end with EOL characters */
|
||||||
\\. yyextra->string_add(yyextra, yytext+1);
|
\\. yyextra->string_add(yyextra, yytext+1);
|
||||||
[^\\\n"]+ {
|
[^\\"]+ {
|
||||||
yyextra->string_add(yyextra, yytext);
|
yyextra->string_add(yyextra, yytext);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ static int yylex(YYSTYPE *lvalp, parser_helper_t *ctx)
|
|||||||
struct kv_t *kv;
|
struct kv_t *kv;
|
||||||
}
|
}
|
||||||
%token <s> NAME STRING
|
%token <s> NAME STRING
|
||||||
%token NEWLINE
|
%token NEWLINE STRING_ERROR
|
||||||
|
|
||||||
/* ...and other symbols */
|
/* ...and other symbols */
|
||||||
%type <s> value valuepart
|
%type <s> value valuepart
|
||||||
|
|||||||
@@ -58,6 +58,10 @@ START_SETUP(setup_base_config)
|
|||||||
" }\n"
|
" }\n"
|
||||||
" key2 = with space\n"
|
" key2 = with space\n"
|
||||||
" key3 = \"string with\\nnewline\"\n"
|
" key3 = \"string with\\nnewline\"\n"
|
||||||
|
" key4 = \"multi line\n"
|
||||||
|
"string\"\n"
|
||||||
|
" key5 = \"escaped \\\n"
|
||||||
|
"newline\"\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
"out = side\n"
|
"out = side\n"
|
||||||
"other {\n"
|
"other {\n"
|
||||||
@@ -88,6 +92,8 @@ START_TEST(test_get_str)
|
|||||||
verify_string("", "main.empty");
|
verify_string("", "main.empty");
|
||||||
verify_string("with space", "main.key2");
|
verify_string("with space", "main.key2");
|
||||||
verify_string("string with\nnewline", "main.key3");
|
verify_string("string with\nnewline", "main.key3");
|
||||||
|
verify_string("multi line\nstring", "main.key4");
|
||||||
|
verify_string("escaped newline", "main.key5");
|
||||||
verify_string("value", "main.sub1.key");
|
verify_string("value", "main.sub1.key");
|
||||||
verify_string("value2", "main.sub1.key2");
|
verify_string("value2", "main.sub1.key2");
|
||||||
verify_string("bar", "main.sub1.subsub.foo");
|
verify_string("bar", "main.sub1.subsub.foo");
|
||||||
@@ -97,7 +103,7 @@ START_TEST(test_get_str)
|
|||||||
verify_string("other val", "other.key1");
|
verify_string("other val", "other.key1");
|
||||||
|
|
||||||
verify_null("main.none");
|
verify_null("main.none");
|
||||||
verify_null("main.key4");
|
verify_null("main.key6");
|
||||||
verify_null("other.sub");
|
verify_null("other.sub");
|
||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
@@ -131,7 +137,7 @@ START_TEST(test_get_str_printf)
|
|||||||
* probably document it at least */
|
* probably document it at least */
|
||||||
verify_null("main.%s%u.key%d", "sub", 1, 2);
|
verify_null("main.%s%u.key%d", "sub", 1, 2);
|
||||||
|
|
||||||
verify_null("%s.%s%d", "main", "key", 4);
|
verify_null("%s.%s%d", "main", "key", 6);
|
||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
|
|
||||||
@@ -906,9 +912,8 @@ START_SETUP(setup_string_config)
|
|||||||
create_settings(chunk_from_str(
|
create_settings(chunk_from_str(
|
||||||
"string = \" with accurate\twhitespace\"\n"
|
"string = \" with accurate\twhitespace\"\n"
|
||||||
"special = \"all { special } characters # can be used.\"\n"
|
"special = \"all { special } characters # can be used.\"\n"
|
||||||
"unterminated = \"is fine\n"
|
"newlines = \"can be encoded explicitly\\nor implicitly\n"
|
||||||
"but = produces a warning\n"
|
"or \\\n"
|
||||||
"newlines = \"can either be encoded\\nor \\\n"
|
|
||||||
"escaped\"\n"
|
"escaped\"\n"
|
||||||
"quotes = \"\\\"and\\\" slashes \\\\ can \\\\ be\" # escaped too\n"
|
"quotes = \"\\\"and\\\" slashes \\\\ can \\\\ be\" # escaped too\n"
|
||||||
"multiple = \"strings\" are \"combined\"\n"
|
"multiple = \"strings\" are \"combined\"\n"
|
||||||
@@ -920,9 +925,7 @@ START_TEST(test_strings)
|
|||||||
{
|
{
|
||||||
verify_string(" with accurate\twhitespace", "string");
|
verify_string(" with accurate\twhitespace", "string");
|
||||||
verify_string("all { special } characters # can be used.", "special");
|
verify_string("all { special } characters # can be used.", "special");
|
||||||
verify_string("is fine", "unterminated");
|
verify_string("can be encoded explicitly\nor implicitly\nor escaped", "newlines");
|
||||||
verify_string("produces a warning", "but");
|
|
||||||
verify_string("can either be encoded\nor escaped", "newlines");
|
|
||||||
verify_string("\"and\" slashes \\ can \\ be", "quotes");
|
verify_string("\"and\" slashes \\ can \\ be", "quotes");
|
||||||
verify_string("strings are combined", "multiple");
|
verify_string("strings are combined", "multiple");
|
||||||
}
|
}
|
||||||
@@ -989,6 +992,12 @@ START_TEST(test_invalid)
|
|||||||
ck_assert(chunk_write(contents, path, 0022, TRUE));
|
ck_assert(chunk_write(contents, path, 0022, TRUE));
|
||||||
ck_assert(!settings->load_files(settings, path, FALSE));
|
ck_assert(!settings->load_files(settings, path, FALSE));
|
||||||
|
|
||||||
|
contents = chunk_from_str(
|
||||||
|
"unterminated {\n"
|
||||||
|
" strings = \"are invalid\n");
|
||||||
|
ck_assert(chunk_write(contents, path, 0022, TRUE));
|
||||||
|
ck_assert(!settings->load_files(settings, path, FALSE));
|
||||||
|
|
||||||
contents = chunk_from_str(
|
contents = chunk_from_str(
|
||||||
"spaces in name {}");
|
"spaces in name {}");
|
||||||
ck_assert(chunk_write(contents, path, 0022, TRUE));
|
ck_assert(chunk_write(contents, path, 0022, TRUE));
|
||||||
|
|||||||
Reference in New Issue
Block a user