Issue #16121: Fix line number accounting in shlex

This commit is contained in:
Petri Lehtinen 2013-02-23 22:09:51 +01:00
commit 6d61eaa0d0
4 changed files with 27 additions and 1 deletions

View File

@ -45,6 +45,7 @@ class shlex:
self.state = ' '
self.pushback = deque()
self.lineno = 1
self._lines_found = 0
self.debug = 0
self.token = ''
self.filestack = deque()
@ -115,12 +116,23 @@ class shlex:
return raw
def read_token(self):
if self._lines_found:
self.lineno += self._lines_found
self._lines_found = 0
i = 0
quoted = False
escapedstate = ' '
while True:
i += 1
nextchar = self.instream.read(1)
if nextchar == '\n':
self.lineno = self.lineno + 1
# In case newline is the first character increment lineno
if i == 1:
self.lineno += 1
else:
self._lines_found += 1
if self.debug >= 3:
print("shlex: in state", repr(self.state), \
"I see character:", repr(nextchar))
@ -140,6 +152,7 @@ class shlex:
continue
elif nextchar in self.commenters:
self.instream.readline()
# Not considered a token so incrementing lineno directly
self.lineno = self.lineno + 1
elif self.posix and nextchar in self.escape:
escapedstate = 'a'
@ -207,6 +220,7 @@ class shlex:
continue
elif nextchar in self.commenters:
self.instream.readline()
# Not considered a token so incrementing lineno directly
self.lineno = self.lineno + 1
if self.posix:
self.state = ' '

View File

@ -189,6 +189,14 @@ class ShlexTest(unittest.TestCase):
self.assertEqual(shlex.quote("test%s'name'" % u),
"'test%s'\"'\"'name'\"'\"''" % u)
def testLineNumbers(self):
data = '"a \n b \n c"\n"x"\n"y"'
for is_posix in (True, False):
s = shlex.shlex(data, posix=is_posix)
for i in (1, 4, 5):
s.read_token()
self.assertEqual(s.lineno, i)
# Allow this test to be used with old shlex.py
if not getattr(shlex, "split", None):

View File

@ -855,6 +855,7 @@ Jonathan Niehof
Gustavo Niemeyer
Oscar Nierstrasz
Hrvoje Niksic
Birk Nilson
Gregory Nofi
Jesse Noller
Bill Noon

View File

@ -181,6 +181,9 @@ Core and Builtins
Library
-------
- Issue #16121: Fix line number accounting in shlex. Patch by Birk
Nilson.
- Issue #14720: sqlite3: Convert datetime microseconds correctly.
Patch by Lowe Thiderman.