mirror of https://github.com/python/cpython
Issue #16121: Fix line number accounting in shlex
This commit is contained in:
commit
6d61eaa0d0
16
Lib/shlex.py
16
Lib/shlex.py
|
@ -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 = ' '
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -855,6 +855,7 @@ Jonathan Niehof
|
|||
Gustavo Niemeyer
|
||||
Oscar Nierstrasz
|
||||
Hrvoje Niksic
|
||||
Birk Nilson
|
||||
Gregory Nofi
|
||||
Jesse Noller
|
||||
Bill Noon
|
||||
|
|
Loading…
Reference in New Issue