Subj : src/sbbs3/zmodem.c zmodem.h To : Git commit to main/sbbs/master From : Rob Swindell (on Debian Linux) Date : Mon Aug 24 2026 20:32:03 https://gitlab.synchro.net/main/sbbs/-/commit/81e5e3a3a6f008a7e11ff590 Modified Files: src/sbbs3/zmodem.c zmodem.h Log Message: zmodem: derive the receive fast path from one table of plain bytes zmodem_rx() decided per byte, through a switch, whether the byte it had just read needed handling: ZDLE introduces an escape, the four XON/XOFF forms are dropped as flow control, and when the peer negotiated ZF0_ESCCTL a control character that arrived unescaped is dropped too. Everything else is returned verbatim, which on ordinary data is the overwhelming majority of bytes. Precompute that predicate into a 256-entry table and test it before the switch. The switch is then reached only by bytes that genuinely need it, and the common case is one indexed load. A 256 MiB localhost receive goes from 126.9 to 153.0 MB/s and from 2.11 to 1.74 CPU-seconds. The table is built in zmodem_init() and rebuilt where escape_ctrl_chars is assigned from the peer's ZRINIT, which is the only place it changes. Building it eagerly rather than on demand avoids needing a sentinel to distinguish "not built yet" from "built for escape_ctrl_chars == FALSE"; zmodem_init() memsets the struct, so any such sentinel would have to be assigned anyway and is easy to forget. Co-Authored-By: Claude Opus 5 (1M context) --- SBBSecho 3.37-Linux * Origin: Vertrauen - [vert/cvs/bbs].synchro.net (1:103/705) .