From e6f758b98690671d7ed8c51aaeb94404aca21fda Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 24 Oct 2017 14:41:59 +0530 Subject: [PATCH] Simplify line_text_at() --- kitty/line.c | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/kitty/line.c b/kitty/line.c index 8184deaa0..c6ff4130f 100644 --- a/kitty/line.c +++ b/kitty/line.c @@ -35,22 +35,15 @@ line_length(Line *self) { PyObject* line_text_at(char_type ch, combining_type cc) { PyObject *ans; - if (cc == 0) { - ans = PyUnicode_New(1, ch); - if (ans == NULL) return PyErr_NoMemory(); - PyUnicode_WriteChar(ans, 0, ch); + if (LIKELY(cc == 0)) { + ans = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, &ch, 1); } else { - Py_UCS4 cc1 = cc & CC_MASK, cc2 = cc >> 16; - Py_UCS4 normalized = normalize(ch, cc1, cc2); - if (normalized) { return line_text_at(normalized, 0); } - Py_UCS4 maxc = (ch > cc1) ? MAX(ch, cc2) : MAX(cc1, cc2); - ans = PyUnicode_New(cc2 ? 3 : 2, maxc); - if (ans == NULL) return PyErr_NoMemory(); - PyUnicode_WriteChar(ans, 0, ch); - PyUnicode_WriteChar(ans, 1, cc1); - if (cc2) PyUnicode_WriteChar(ans, 2, cc2); + Py_UCS4 buf[3]; + buf[0] = ch; buf[1] = cc & CC_MASK; buf[2] = cc >> 16; + Py_UCS4 normalized = normalize(ch, buf[1], buf[2]); + if (normalized) ans = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, &normalized, 1); + else ans = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buf, buf[2] ? 3 : 2); } - return ans; }