diff -r 04b5bef5c8d3 Lib/shlex.py --- a/Lib/shlex.py Sat Feb 23 14:49:09 2013 +0200 +++ b/Lib/shlex.py Sat Feb 23 21:36:32 2013 +0100 @@ -45,6 +45,7 @@ self.state = ' ' self.pushback = deque() self.lineno = 1 + self._lines_found = 0 self.debug = 0 self.token = '' self.filestack = deque() @@ -115,12 +116,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)) @@ -140,6 +152,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' @@ -207,6 +220,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 -r 04b5bef5c8d3 Lib/test/test_shlex.py --- a/Lib/test/test_shlex.py Sat Feb 23 14:49:09 2013 +0200 +++ b/Lib/test/test_shlex.py Sat Feb 23 21:36:32 2013 +0100 @@ -189,6 +189,14 @@ 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):