diff options
author | Petri Lehtinen <petri@digip.org> | 2013-02-23 21:07:39 (GMT) |
---|---|---|
committer | Petri Lehtinen <petri@digip.org> | 2013-02-23 21:08:07 (GMT) |
commit | 7a05113ccf76b077b138d40794e52f6881a57c4c (patch) | |
tree | 22113d900ad66a603701b290a951376f83d94b6c | |
parent | 905b648754be0974f32cfd259bad7f6a7e3aebfb (diff) | |
download | cpython-7a05113ccf76b077b138d40794e52f6881a57c4c.zip cpython-7a05113ccf76b077b138d40794e52f6881a57c4c.tar.gz cpython-7a05113ccf76b077b138d40794e52f6881a57c4c.tar.bz2 |
Issue #16121: Fix line number accounting in shlex
-rw-r--r-- | Lib/shlex.py | 16 | ||||
-rw-r--r-- | Lib/test/test_shlex.py | 9 | ||||
-rw-r--r-- | Misc/ACKS | 1 | ||||
-rw-r--r-- | Misc/NEWS | 3 |
4 files changed, 28 insertions, 1 deletions
diff --git a/Lib/shlex.py b/Lib/shlex.py index 3edd3db..b9fd1dd 100644 --- a/Lib/shlex.py +++ b/Lib/shlex.py @@ -44,6 +44,7 @@ class shlex: self.state = ' ' self.pushback = deque() self.lineno = 1 + self._lines_found = 0 self.debug = 0 self.token = '' self.filestack = deque() @@ -114,12 +115,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)) @@ -139,6 +151,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' @@ -206,6 +219,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 = ' ' diff --git a/Lib/test/test_shlex.py b/Lib/test/test_shlex.py index 25e4b6d..1cd8220 100644 --- a/Lib/test/test_shlex.py +++ b/Lib/test/test_shlex.py @@ -173,6 +173,15 @@ class ShlexTest(unittest.TestCase): "%s: %s != %s" % (self.data[i][0], l, self.data[i][1:])) + 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): for methname in dir(ShlexTest): @@ -774,6 +774,7 @@ Samuel Nicolary Gustavo Niemeyer Oscar Nierstrasz Hrvoje Niksic +Birk Nilson Gregory Nofi Jesse Noller Bill Noon @@ -227,6 +227,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. |