From ea78200ae3c831aa8484ae0bfff1f7f02fda55db Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Tue, 24 Feb 2015 22:04:05 -0500 Subject: [PATCH] TW-1549 - TW-1549 task annotate hangs with specific text pattern (thanks to Alexandre de Verteuil). --- AUTHORS | 1 + ChangeLog | 2 ++ src/Lexer.cpp | 6 +++++ test/tw-1549.t | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 71 insertions(+) create mode 100755 test/tw-1549.t diff --git a/AUTHORS b/AUTHORS index 2cd0d30b1..61e6b2bad 100644 --- a/AUTHORS +++ b/AUTHORS @@ -245,3 +245,4 @@ suggestions: Scott Carter Taisuke Hachimura Martin + Alexandre de Verteuil diff --git a/ChangeLog b/ChangeLog index 3af27b816..4e3bbf3fd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,6 +6,8 @@ Renato Alves). - TW-1547 Recur column is always shown even if no recurring task is displayed (thanks to Renato Alves). +- TW-1549 task annotate hangs with specific text pattern (thanks to Alexandre + de Verteuil). - TW-1550 _contexts helper-command (thanks to David Patrick). - Eliminated some code that is not UTF8-safe. - Removed pthreads linkage. diff --git a/src/Lexer.cpp b/src/Lexer.cpp index 371a3a4c8..5b1636077 100644 --- a/src/Lexer.cpp +++ b/src/Lexer.cpp @@ -387,6 +387,12 @@ bool Lexer::token (std::string& result, Type& type) result += utf8_character (_n0); shift (); } + else + { + result += utf8_character (hex_to_int (_n0, _n1, _n2, _n3)); + shift (); + type = quote ? typeString : typeIdentifier; + } break; case typeExponent: diff --git a/test/tw-1549.t b/test/tw-1549.t new file mode 100755 index 000000000..29879ae6e --- /dev/null +++ b/test/tw-1549.t @@ -0,0 +1,62 @@ +#!/usr/bin/env python2.7 +# -*- coding: utf-8 -*- +################################################################################ +## +## Copyright 2006 - 2015, Paul Beckingham, Federico Hernandez. +## +## Permission is hereby granted, free of charge, to any person obtaining a copy +## of this software and associated documentation files (the "Software"), to deal +## in the Software without restriction, including without limitation the rights +## to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +## copies of the Software, and to permit persons to whom the Software is +## furnished to do so, subject to the following conditions: +## +## The above copyright notice and this permission notice shall be included +## in all copies or substantial portions of the Software. +## +## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +## OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +## FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +## THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +## LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +## SOFTWARE. +## +## http://www.opensource.org/licenses/mit-license.php +## +################################################################################ + +import sys +import os +import unittest + +# Ensure python finds the local simpletap module +sys.path.append(os.path.dirname(os.path.abspath(__file__))) + +from basetest import Task, TestCase + +class Test1549(TestCase): + def setUp(self): + self.t = Task() + + def test_lexer_state(self): + """ + The token '1e ' left the lexer in a bad state. + + +--------+ +----------+ +---------------------+ +--------------+ + | | -> |1 | -> |e | -> | | + |typeNone| |typeNumber| |typeExponentIndicator| |Missing 'else'| + +--------+ +----------+ +---------------------+ +--------------+ + + """ + + # This command will hang and therefore timeout in 2.4.1. + code, out, err = self.t(('add', '1e x')) + self.assertIn("Created task 1.", out) + + +if __name__ == "__main__": + from simpletap import TAPTestRunner + unittest.main(testRunner=TAPTestRunner()) + +# vim: ai sts=4 et sw=4