summaryrefslogtreecommitdiff
path: root/src/snapshot.c
AgeCommit message (Collapse)Author
10 daysRename the library to wsap_vtcoreBerke Güzel
ncurses installs <term.h> and defines struct term. In a file that includes both headers, an ncurses TERMINAL * and this library's terminal are silently the same type. The name wsap_vtcore avoids the clash. The public header is now <wsap_vtcore/wsap_vtcore.h>. Every global symbol uses the wsap_vtcore_ prefix, every macro uses WSAP_VTCORE_, and the shared library is libwsap_vtcore.so.0. The default terminal name is now "wsap_vtcore". The ISA override variable is WSAP_VTCORE_ISA. No other behavior changes. The amalgamation writes wsap_vtcore.c and wsap_vtcore.h. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
10 daysConvert each changed snapshot row onceBerke Güzel
The atomic update counted arena words by converting every changed row in phase 1, then converted it again in apply(). A history row is decoded on each conversion, so paging through history took 74% longer, and a full redraw 20% longer. A changed row is now converted once. Small updates reserve the arena for the most their rows can add, then convert in apply() straight into the cells, as before. Larger updates and rebuilds convert into a stage in phase 1, with cluster records after the live ones or in a spare arena, and apply() copies the smaller of the kept and staged parts, swapping the stage in when that saves the copy. A failed update still changes nothing a reader sees. A row that scrolls in from below no longer counts as kept when its new key is 0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysReport selection allocation failure instead of truncatingBerke Güzel
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>
10 daysMerge branch 'wt/snapshot-atomic' into api-hardeningBerke Güzel
# Conflicts: # src/snapshot.c
10 daysMerge branch 'wt/namespace' into api-hardeningBerke Güzel
10 daysKeep the snapshot unchanged when an update failsBerke Güzel
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>
10 daysKeep installed headers from shadowing or polluting host namesBerke Güzel
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>
10 daysDocument snapshot pointer lifetimes and make getters NULL-safeBerke Güzel
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>
10 daysReturn owned text and share cell attribute flags with snapshotsBerke Güzel
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.
10 daysFix snapshot storage and allocation failure correctnessBerke Güzel
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.
12 daysOptimize hot loops with direct access, LUTs, and closed-form formulasBerke Güzel
12 daysOptimize and simplify loops, table lookups, and branchless parsersBerke Güzel
- 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
13 daysterm: move the term core to subprojects/termBerke Güzel
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>