[cfe-commits] r77783 - /cfe/trunk/utils/test/ShUtil.py
Daniel Dunbar
daniel at zuster.org
Sat Aug 1 02:41:12 PDT 2009
Author: ddunbar
Date: Sat Aug 1 04:41:09 2009
New Revision: 77783
URL: http://llvm.org/viewvc/llvm-project?rev=77783&view=rev
Log:
lit: Two more sh lex/parse bugs (but its so simple!)
- Empty arguments weren't handled correctly.
- Escapes outside quoted strings weren't handled.
Modified:
cfe/trunk/utils/test/ShUtil.py
Modified: cfe/trunk/utils/test/ShUtil.py
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/utils/test/ShUtil.py?rev=77783&r1=77782&r2=77783&view=diff
==============================================================================
--- cfe/trunk/utils/test/ShUtil.py (original)
+++ cfe/trunk/utils/test/ShUtil.py Sat Aug 1 04:41:09 2009
@@ -35,7 +35,8 @@
# If it has special characters, the fast path failed.
if ('|' in chunk or '&' in chunk or
'<' in chunk or '>' in chunk or
- "'" in chunk or '"' in chunk):
+ "'" in chunk or '"' in chunk or
+ '\\' in chunk):
return None
self.pos = self.pos - 1 + len(chunk)
@@ -67,6 +68,14 @@
elif c == '"':
self.eat()
str += self.lex_arg_quoted('"')
+ elif c == '\\':
+ # Outside of a string, '\\' escapes everything.
+ self.eat()
+ if self.pos == self.end:
+ Util.warning("escape at end of quoted argument in: %r" %
+ self.data)
+ return str
+ str += self.eat()
else:
str += self.eat()
return str
@@ -78,8 +87,8 @@
if c == delim:
return str
elif c == '\\' and delim == '"':
- # Shell escaping is just '\"' to avoid termination, no actual
- # escaping.
+ # Inside a '"' quoted string, '\\' only escapes the quote
+ # character and backslash, otherwise it is preserved.
if self.pos == self.end:
Util.warning("escape at end of quoted argument in: %r" %
self.data)
@@ -214,7 +223,7 @@
def look(self):
next = self.lex()
- if next:
+ if next is not None:
self.tokens = itertools.chain([next], self.tokens)
return next
@@ -310,6 +319,10 @@
["hello\\world"])
self.assertEqual(self.lex(""" he"llo wo"rld """),
["hello world"])
+ self.assertEqual(self.lex(""" a\\ b a\\\\b """),
+ ["a b", "a\\b"])
+ self.assertEqual(self.lex(""" "" "" """),
+ ["", ""])
class TestShParse(unittest.TestCase):
def parse(self, str):
@@ -318,6 +331,8 @@
def test_basic(self):
self.assertEqual(self.parse('echo hello'),
Pipeline([Command(['echo', 'hello'], [])], False))
+ self.assertEqual(self.parse('echo ""'),
+ Pipeline([Command(['echo', ''], [])], False))
def test_redirection(self):
self.assertEqual(self.parse('echo hello > c'),
@@ -370,6 +385,6 @@
Pipeline([Command(['b'], [])], False)),
'||',
Pipeline([Command(['c'], [])], False)))
-
+
if __name__ == '__main__':
unittest.main()
More information about the cfe-commits
mailing list