aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/mparser.py8
-rw-r--r--test cases/common/42 string operations/meson.build18
2 files changed, 22 insertions, 4 deletions
diff --git a/mesonbuild/mparser.py b/mesonbuild/mparser.py
index 8400a1a..0465d24 100644
--- a/mesonbuild/mparser.py
+++ b/mesonbuild/mparser.py
@@ -111,6 +111,7 @@ class Lexer:
par_count = 0
bracket_count = 0
col = 0
+ newline_rx = re.compile(r'(?<!\\)((?:\\\\)*)\\n')
while loc < len(self.code):
matched = False
value = None
@@ -139,10 +140,9 @@ class Lexer:
elif tid == 'dblquote':
raise ParseException('Double quotes are not supported. Use single quotes.', self.getline(line_start), lineno, col)
elif tid == 'string':
- value = match_text[1:-1]\
- .replace(r"\'", "'")\
- .replace(r" \\ ".strip(), r" \ ".strip())\
- .replace("\\n", "\n")
+ value = match_text[1:-1].replace(r"\'", "'")
+ value = newline_rx.sub(r'\1\n', value)
+ value = value.replace(r" \\ ".strip(), r" \ ".strip())
elif tid == 'multiline_string':
tid = 'string'
value = match_text[3:-3]
diff --git a/test cases/common/42 string operations/meson.build b/test cases/common/42 string operations/meson.build
index d9f8130..babe6cc 100644
--- a/test cases/common/42 string operations/meson.build
+++ b/test cases/common/42 string operations/meson.build
@@ -74,3 +74,21 @@ multiline string '''.strip() == '''multiline string''', 'Newlines badly stripped
assert('"1.1.20"'.strip('"') == '1.1.20', '" badly stripped')
assert('"1.1.20"'.strip('".') == '1.1.20', '". badly stripped')
assert('"1.1.20" '.strip('" ') == '1.1.20', '". badly stripped')
+
+bs_b = '''\b'''
+bs_bs_b = '''\\b'''
+nl = '''
+'''
+bs_n = '''\n'''
+bs_nl = '''\
+'''
+bs_bs_n = '''\\n'''
+
+assert('\b' == bs_b, 'Single backslash broken')
+assert('\\b' == bs_b, 'Double backslash broken')
+assert('\\\b' == bs_bs_b, 'Three backslash broken')
+assert('\\\\b' == bs_bs_b, 'Four backslash broken')
+assert('\n' == nl, 'Newline escape broken')
+assert('\\n' == bs_n, 'Double backslash broken before n')
+assert('\\\n' == bs_nl, 'Three backslash broken before n')
+assert('\\\\n' == bs_bs_n, 'Four backslash broken before n')