aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/parse_tree.cpp11
-rw-r--r--tests/line-continuation.err0
-rw-r--r--tests/line-continuation.in25
-rw-r--r--tests/line-continuation.out5
-rw-r--r--tests/line-continuation.status1
5 files changed, 39 insertions, 3 deletions
diff --git a/src/parse_tree.cpp b/src/parse_tree.cpp
index 3d2f7b8c..cdaec9ef 100644
--- a/src/parse_tree.cpp
+++ b/src/parse_tree.cpp
@@ -1254,6 +1254,12 @@ static parse_keyword_t keyword_with_name(const wchar_t *name)
return result;
}
+static bool is_keyword_char(wchar_t c)
+{
+ return (c >= L'a' && c <= L'z') || (c >= L'A' && c <= L'Z') || (c >= L'0' && c <= L'9')
+ || c == L'\'' || c == L'"' || c == L'\\' || c == '\n';
+}
+
/* Given a token, returns the keyword it matches, or parse_keyword_none. */
static parse_keyword_t keyword_for_token(token_type tok, const wcstring &token)
{
@@ -1267,17 +1273,16 @@ static parse_keyword_t keyword_for_token(token_type tok, const wcstring &token)
parse_keyword_t result = parse_keyword_none;
bool needs_expand = false, all_chars_valid = true;
const wchar_t *tok_txt = token.c_str();
- const wchar_t *chars_allowed_in_keywords = L"abcdefghijklmnopqrstuvwxyz'\"";
for (size_t i=0; tok_txt[i] != L'\0'; i++)
{
wchar_t c = tok_txt[i];
- if (! wcschr(chars_allowed_in_keywords, c))
+ if (! is_keyword_char(c))
{
all_chars_valid = false;
break;
}
// If we encounter a quote, we need expansion
- needs_expand = needs_expand || c == L'"' || c == L'\'';
+ needs_expand = needs_expand || c == L'"' || c == L'\'' || c == L'\\';
}
if (all_chars_valid)
diff --git a/tests/line-continuation.err b/tests/line-continuation.err
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/line-continuation.err
diff --git a/tests/line-continuation.in b/tests/line-continuation.in
new file mode 100644
index 00000000..a1ac9293
--- /dev/null
+++ b/tests/line-continuation.in
@@ -0,0 +1,25 @@
+ech\
+o echo
+
+buil\
+tin echo builtin echo
+
+true; an\
+d echo true
+
+\i\
+\U00000066\
+ true
+ echo if true
+\
+\145n\
+d\
+;
+
+'if'\
+ true
+ echo if true
+"\
+en\
+d\
+";
diff --git a/tests/line-continuation.out b/tests/line-continuation.out
new file mode 100644
index 00000000..053209a5
--- /dev/null
+++ b/tests/line-continuation.out
@@ -0,0 +1,5 @@
+echo
+builtin echo
+true
+if true
+if true
diff --git a/tests/line-continuation.status b/tests/line-continuation.status
new file mode 100644
index 00000000..573541ac
--- /dev/null
+++ b/tests/line-continuation.status
@@ -0,0 +1 @@
+0