From 7acc6bdeb8d1e577931534aa7ea2d84fc32aeaa2 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 10 Mar 2023 17:26:06 +0530 Subject: [PATCH] Move splitlines_like_git to a more appropriate home --- kittens/diff/diff_speedup.pyi | 5 ++++- kittens/diff/patch.py | 4 +--- kittens/diff/speedup.c | 34 ++++++++++++++++++++++++++++++++++ kitty/fast_data_types.pyi | 1 - kitty/kittens.c | 33 --------------------------------- 5 files changed, 39 insertions(+), 38 deletions(-) diff --git a/kittens/diff/diff_speedup.pyi b/kittens/diff/diff_speedup.pyi index 51034a6e6..630c25ac6 100644 --- a/kittens/diff/diff_speedup.pyi +++ b/kittens/diff/diff_speedup.pyi @@ -1,7 +1,10 @@ -from typing import List, Optional, Tuple + +from typing import Callable, List, Optional, Tuple from .collect import Segment +def splitlines_like_git(raw: bytes, callback: Callable[[memoryview], None]) -> None: ... + def split_with_highlights( line: str, truncate_points: List[int], fg_highlights: List[Segment], bg_highlight: Optional[Segment] diff --git a/kittens/diff/patch.py b/kittens/diff/patch.py index 9ca1465fe..7c7d9d878 100644 --- a/kittens/diff/patch.py +++ b/kittens/diff/patch.py @@ -8,11 +8,9 @@ import shutil import subprocess from typing import Dict, Iterator, List, Optional, Sequence, Tuple, Union -from kitty.fast_data_types import splitlines_like_git - from . import global_data from .collect import lines_for_path -from .diff_speedup import changed_center +from .diff_speedup import changed_center, splitlines_like_git left_lines: Tuple[str, ...] = () right_lines: Tuple[str, ...] = () diff --git a/kittens/diff/speedup.c b/kittens/diff/speedup.c index 1614e5ff4..61179e3b4 100644 --- a/kittens/diff/speedup.c +++ b/kittens/diff/speedup.c @@ -175,6 +175,39 @@ split_with_highlights(PyObject *self UNUSED, PyObject *args) { #undef NEXT_TRUNCATE_POINT } +static PyObject* +splitlines_like_git(PyObject *self UNUSED, PyObject *args) { + char *raw; Py_ssize_t sz; + PyObject *callback; + if (!PyArg_ParseTuple(args, "y#O", &raw, &sz, &callback)) return NULL; + while (sz > 0 && (raw[sz-1] == '\n' || raw[sz-1] == '\r')) sz--; + PyObject *mv, *ret; +#define CALLBACK \ + mv = PyMemoryView_FromMemory(raw + start, i - start, PyBUF_READ); \ + if (mv == NULL) return NULL; \ + ret = PyObject_CallFunctionObjArgs(callback, mv, NULL); \ + Py_DECREF(mv); \ + if (ret == NULL) return NULL; \ + Py_DECREF(ret); start = i + 1; + + Py_ssize_t i = 0, start = 0; + for (; i < sz; i++) { + switch (raw[i]) { + case '\n': + CALLBACK; break; + case '\r': + CALLBACK; + if (i + 1 < sz && raw[i+1] == '\n') { i++; start++; } + break; + } + } + if (start < sz) { + i = sz; CALLBACK; + } + Py_RETURN_NONE; +} + + static void free_resources(void) { free(line_buffer.buf); line_buffer.buf = NULL; line_buffer.capacity = 0; line_buffer.pos = 0; @@ -183,6 +216,7 @@ free_resources(void) { static PyMethodDef module_methods[] = { {"changed_center", (PyCFunction)changed_center, METH_VARARGS, ""}, {"split_with_highlights", (PyCFunction)split_with_highlights, METH_VARARGS, ""}, + {"splitlines_like_git", (PyCFunction)splitlines_like_git, METH_VARARGS, ""}, {NULL, NULL, 0, NULL} /* Sentinel */ }; diff --git a/kitty/fast_data_types.pyi b/kitty/fast_data_types.pyi index acf0e1293..5d0b39bea 100644 --- a/kitty/fast_data_types.pyi +++ b/kitty/fast_data_types.pyi @@ -1535,4 +1535,3 @@ def expand_ansi_c_escapes(test: str) -> str: ... def update_tab_bar_edge_colors(os_window_id: int) -> bool: ... def mask_kitty_signals_process_wide() -> None: ... def is_modifier_key(key: int) -> bool: ... -def splitlines_like_git(raw: bytes, callback: Callable[[memoryview], None]) -> None: ... diff --git a/kitty/kittens.c b/kitty/kittens.c index 9dcae4e2c..29b4461f4 100644 --- a/kitty/kittens.c +++ b/kitty/kittens.c @@ -196,42 +196,9 @@ parse_input_from_terminal(PyObject *self UNUSED, PyObject *args) { #undef CALL } -static PyObject* -splitlines_like_git(PyObject *self UNUSED, PyObject *args) { - char *raw; Py_ssize_t sz; - PyObject *callback; - if (!PyArg_ParseTuple(args, "y#O", &raw, &sz, &callback)) return NULL; - while (sz > 0 && (raw[sz-1] == '\n' || raw[sz-1] == '\r')) sz--; - PyObject *mv, *ret; -#define CALLBACK \ - mv = PyMemoryView_FromMemory(raw + start, i - start, PyBUF_READ); \ - if (mv == NULL) return NULL; \ - ret = PyObject_CallFunctionObjArgs(callback, mv, NULL); \ - Py_DECREF(mv); \ - if (ret == NULL) return NULL; \ - Py_DECREF(ret); start = i + 1; - - Py_ssize_t i = 0, start = 0; - for (; i < sz; i++) { - switch (raw[i]) { - case '\n': - CALLBACK; break; - case '\r': - CALLBACK; - if (i + 1 < sz && raw[i+1] == '\n') { i++; start++; } - break; - } - } - if (start < sz) { - i = sz; CALLBACK; - } - Py_RETURN_NONE; -} - static PyMethodDef module_methods[] = { METHODB(parse_input_from_terminal, METH_VARARGS), METHODB(read_command_response, METH_VARARGS), - METHODB(splitlines_like_git, METH_VARARGS), {NULL, NULL, 0, NULL} /* Sentinel */ };