[Python-checkins] cpython (3.2): Issue #16121: Fix line number accounting in shlex
petri.lehtinen
python-checkins at python.org
Sat Feb 23 22:15:45 CET 2013
http://hg.python.org/cpython/rev/f1d19fdb254f
changeset: 82365:f1d19fdb254f
branch: 3.2
parent: 82361:b65b6a0ebd44
user: Petri Lehtinen <petri at digip.org>
date: Sat Feb 23 22:07:39 2013 +0100
summary:
Issue #16121: Fix line number accounting in shlex
files:
Lib/shlex.py | 16 +++++++++++++++-
Lib/test/test_shlex.py | 9 +++++++++
Misc/ACKS | 1 +
Misc/NEWS | 3 +++
4 files changed, 28 insertions(+), 1 deletions(-)
diff --git a/Lib/shlex.py b/Lib/shlex.py
--- a/Lib/shlex.py
+++ b/Lib/shlex.py
@@ -44,6 +44,7 @@
self.state = ' '
self.pushback = deque()
self.lineno = 1
+ self._lines_found = 0
self.debug = 0
self.token = ''
self.filestack = deque()
@@ -114,12 +115,23 @@
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 @@
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 @@
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
--- a/Lib/test/test_shlex.py
+++ b/Lib/test/test_shlex.py
@@ -173,6 +173,15 @@
"%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):
diff --git a/Misc/ACKS b/Misc/ACKS
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -774,6 +774,7 @@
Gustavo Niemeyer
Oscar Nierstrasz
Hrvoje Niksic
+Birk Nilson
Gregory Nofi
Jesse Noller
Bill Noon
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -227,6 +227,9 @@
Library
-------
+- Issue #16121: Fix line number accounting in shlex. Patch by Birk
+ Nilson.
+
- Issue #14720: sqlite3: Convert datetime microseconds correctly.
Patch by Lowe Thiderman.
--
Repository URL: http://hg.python.org/cpython
More information about the Python-checkins
mailing list