aboutsummaryrefslogtreecommitdiffstats
path: root/src/kdl.c (follow)
Commit message (Collapse)AuthorAge
* parsers: fix seven bugs found by fuzzinguser2026-08-19
| | | | | | | | | | | | kdl: heap-buffer-overflow on trailing backslash in a string (a"\) jsonval: heap-buffer-overflow on truncated \uXXXX escape ("\u) jsonval: UB float-to-long cast on out-of-range numbers (2e22) expr: UB signed overflow in arithmetic ops — wrap as uint32 expr: INT32_MIN / -1 SIGFPE guard in OP_DIV/OP_MOD expr: stack overflow on deep nesting — add MAX_DEPTH 256 expr: 64-bit + saturation in OP_DIST to prevent squared overflow input: NULL memcpy in input_timeout's re-parse path input: signed overflow in CSI and SGR mouse parameter accumulation
* sl0ppty: clang-format the treeuser2026-08-17
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The bumpy one. `make fmt` over every `.c` and `.h` outside `vendor/`: 32 files, 1,843 lines rewritten, no behaviour changed. Nothing here is worth reading -- the next commit adds it to `.git-blame-ignore-revs` so `git blame` walks past it. Two thirds of it is alignment the formatter now owns: trailing comments in a struct, continuation lines under a signature. The rest is the hand-packed tables opening up to one entry per line -- `ACTIONS`, `NAMED_KEYS`, `ACTION_HELP`. That is a real loss of density and a real gain in diffs: adding an action was a reflow of the block and is now one line. Anything worth keeping packed can be fenced with `// clang-format off`; nothing was, on the grounds that a table is the thing a formatter is for. **One change is not formatting.** `src/config.h` had three trailing comments glued onto one field: uint16_t hover_delay_ms; /* how long the pointer must rest to arm a guide */ /* how long an announcement stays up */ /* rows per wheel notch */ -- `toast_ms`'s and `scroll_lines`' comments, landed on their neighbour by an earlier edit, documenting the wrong things ever since. It is in this commit because it is what caught it: clang-format could not settle on that line, wrapping it one way and then re-indenting the wrap on a second pass, so `make fmt` was not idempotent. The comments are back where they belong and it is. Verified after the reformat, not before: `make clean && make all` is warning-free, `make retest` is 1801 checks green, and `make fmt` twice in a row changes nothing the second time. A formatter that alters behaviour would be worse than none, so the gate was the whole suite rather than a reading of the diff.
* sl0ptty: M6 — the config file, and a READMEsl0p2026-08-13
D2, delivered: a hand-rolled KDL subset (kdl.c, 300 lines, no dependency) with arguments, key=value properties, children, // and /* */ comments, and ; terminators for single-line nodes. config/config.kdl documents every setting by being the defaults. Geometry, theme, the prefix and every binding now come from that file instead of being compiled in. Bindings are a table of (key, mods) -> action, so an action can be rebound, unbound with "none", or given a different prefix entirely; caps and num lock are masked out so they cannot stop a binding working. The property that matters is fail-open, applied to the mux itself rather than only to the CLI wrapper: a missing config is silent, a broken one writes the line number to stderr and keeps the compiled-in defaults, and a bad binding does not discard the rest of the file. A live session can reload, and a reload that fails to parse keeps the configuration that works instead of leaving you with half a theme. min_pane is configuration too, so the point at which a layout collapses is a preference rather than my taste — tested by making the same split collapse or not on the same terminal size. 14 parser cases as a C test, 24 config checks through the harness, and a README that shows what the thing actually looks like. 250 checks green.