diff --git a/cpplint/cpplint.py b/cpplint/cpplint.py index 8e07cab..fb34e11 100755 --- a/cpplint/cpplint.py +++ b/cpplint/cpplint.py @@ -51,6 +51,7 @@ import sre_compile import string import sys import unicodedata +import sysconfig try: xrange # Python 2 @@ -4291,6 +4292,16 @@ def GetLineWidth(line): if unicodedata.east_asian_width(uc) in ('W', 'F'): width += 2 elif not unicodedata.combining(uc): + # Issue 337 + # https://mail.python.org/pipermail/python-list/2012-August/628809.html + if (sys.version_info.major, sys.version_info.minor) <= (3, 2): + # https://github.com/python/cpython/blob/2.7/Include/unicodeobject.h#L81 + is_wide_build = sysconfig.get_config_var("Py_UNICODE_SIZE") >= 4 + # https://github.com/python/cpython/blob/2.7/Objects/unicodeobject.c#L564 + is_low_surrogate = 0xDC00 <= ord(uc) <= 0xDFFF + if not is_wide_build and is_low_surrogate: + width -= 1 + width += 1 return width else: diff --git a/cpplint/cpplint_unittest.py b/cpplint/cpplint_unittest.py index b3c7725..6087d8f 100755 --- a/cpplint/cpplint_unittest.py +++ b/cpplint/cpplint_unittest.py @@ -321,6 +321,8 @@ class CpplintTest(CpplintTestBase): self.assertEquals(0, cpplint.GetLineWidth('')) self.assertEquals(10, cpplint.GetLineWidth(u'x' * 10)) self.assertEquals(16, cpplint.GetLineWidth(u'都|道|府|県|支庁')) + self.assertEquals(5 + 13 + 9, cpplint.GetLineWidth( + u'd𝐱/dt' + u'f : t ⨯ 𝐱 → ℝ' + u't ⨯ 𝐱 → ℝ')) def testGetTextInside(self): self.assertEquals('', cpplint._GetTextInside('fun()', r'fun\('))