| Age | Commit message (Collapse) | Author |
|
On a screen taller than 256 rows the selection's row list is allocated.
When that failed, it fell back to the 256-entry stack array, so the
selection and the snapshot's selection spans silently stopped at row
256 while every call still reported success.
lines_init() now reports the failure. term_select_start() and
term_select_extend() return false and leave the selection unchanged,
term_snapshot_update() fails and keeps its previous content, and the
text getters return NULL, as they do for their other allocations.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
# Conflicts:
# src/snapshot.c
|
|
|
|
term_snapshot_update converted the viewport in place, so an allocation
that failed midway left the snapshot empty and a renderer painted a blank
frame. Split the update into two phases. Phase 1 makes every allocation
the update needs and counts the arena words the converted rows add, then
grows the arena once. Phase 2 writes the view, cells, keys, clusters, and
selection, and cannot fail. A failed update now keeps the previous
content, and a retry is an ordinary incremental update.
invalidate() is removed. The term_snapshot_update comment and the
correctness audit now say the snapshot keeps its previous content.
The failure test fails each allocation in turn from the same starting
state. After every failed call it compares the view, cells, row keys,
selection spans, and cluster code points with the state before the call.
A retry must succeed and match a fresh capture. The cases are a first
update, a 32 by 16 screen of ZWJ families and regional-indicator flags
(arena growth), a resize, a 300-row screen (scratch arrays), and a long
scroll run.
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
|
|
The pkg-config file put include/term on the host's include path, so
ncurses' term.h could be picked up in place of ours. Hosts now write
<term/term.h> and the package adds only its include directory.
The installed Unicode API had unprefixed names that collide with host
symbols and macros. Rename them: term_ for functions, types, and static
tables, TERM_ for macros and include guards. unicode_data.inc and
tools/generate_unicode.py are renamed to match. The generator's inputs
here are Unicode 15.1 and the checked-in table is 18.0.0, so the table
data was not regenerated. Only the declarations were checked against
the generator.
utf8.h casts the malloc result so it compiles as C++.
header_test.sh now includes <term/term.h> with only include/ on the path.
It also checks that a host which defines unicode_width, UTF8_ACCEPT,
GRAPHEME_MAX_LEN, in_ranges, and similar names compiles with the Unicode
headers as C11 and C++, in both declaration orders.
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
|
|
The snapshot getters crashed on a NULL snapshot, unlike the rest of the
API. They now return NULL, an empty span, 0, or write nothing, as the
terminal functions do. term_snapshot_cluster writes nothing when cps is
NULL or cap is 0.
Document that the view and its palette keep their address for the life
of the snapshot, and that a row pointer lasts only until the next update
or free, since an update can realloc the cell array.
Rename the term_input.h include guard to TERM_INPUT_H to match the file.
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
|
|
Make text queries return allocated strings released with term_text_free, keeping each capture atomic. Align public attributes with the write core, remove snapshot conversion tables, and migrate tests and the Kitty adapter.
|
|
Account for cluster records discarded by snapshot scrolling, propagate snapshot allocation failures with an empty retryable view, and allocate resized screens before mutating visible state. Add bounded-memory and allocation-failure regressions, and update the saved diagnostic and audit report.
|
|
|
|
- Replace sequential colon-counting loop with branchless CTZ bitmask in src/pen.h
- Replace linear strchr with 256-bit ASCII punctuation bitmask in src/selection.c
- Flatten 3D color cube loop and precompute constants in src/palette.c
- Use static 256-byte LUT for hex decoding and bsearch for termcap in src/escape.c
- Replace capacity doubling while loops with branchless CLZ pow2 helpers across core
- Use direct memset/memcpy in src/snapshot.c
- Optimize input digit/byte formatting, alt-prefix path, and make keyboard state optional in src/input.c
|
|
The core now builds, tests, and benchmarks alone, as a Meson subproject
with no dependency on the main tree.
- include/term/ holds term.h and the header-only unicode/. src/ holds
the core and its private headers. The main tree gets only
include/term through term_dep, so it cannot reach a private header.
- The term tests, the term benchmarks, the Kitty parser suite, and
tools/amalgamate.py and tools/generate_unicode.py move with it. The
tests run as term:<name>.
- The main build passes its -march (arch_flag) and b_ndebug to the
subproject. A directory configured before this commit needs
meson configure -Dterm:arch_flag=-march=... once.
- The term tests compile with -UNDEBUG. They do work inside assert.
- The subproject exports term_test_dep with term_api.h, for the main
tree's render, thumbnail, color, and selection tests.
- The Kitty bridge used struct vector2i and has not compiled since the
public API redesign. It builds again. 2 of its 14 tests fail: REP
after a tab, and a cursor report after a resize.
- dirgraph.py drops the term and unicode layers. Its self-test uses pty.
- The symbols test ignores the __odr_asan symbols that ASan adds.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|