summaryrefslogtreecommitdiff
path: root/src/pen.h
diff options
context:
space:
mode:
authorBerke Güzel <wenekar1@gmail.com>2026-10-13 13:36:27 +0300
committerBerke Güzel <wenekar1@gmail.com>2026-10-13 13:36:27 +0300
commit4741f7a6dfa144ce65cf3bbdd4a1bc6bee6df2e5 (patch)
tree97932e58eee98623b56a9d9181a3b4289b6ecfc1 /src/pen.h
parenta0fefd3856a4f03be0abbc51f7a9a0416db69eb5 (diff)
Optimize and simplify loops, table lookups, and branchless parsers
- 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
Diffstat (limited to 'src/pen.h')
-rw-r--r--src/pen.h12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/pen.h b/src/pen.h
index d7118b5..8349566 100644
--- a/src/pen.h
+++ b/src/pen.h
@@ -1,6 +1,7 @@
#ifndef WSAP_TERM_PEN_H
#define WSAP_TERM_PEN_H
+#include "compat.h"
#include "term.h"
#include <stdbool.h>
#include <stdint.h>
@@ -78,9 +79,14 @@ static inline int sgr_extended_color(const int *params, int nparams, uint16_t su
if (params[i + 1] != 2)
return 0;
int colon = 0;
- while (i + 2 + colon < nparams && i + 2 + colon < 16 &&
- (subparams & (1u << (i + 2 + colon))))
- colon++;
+ int k = i + 2;
+ if (k < 16 && k < nparams) {
+ uint32_t shifted = (~(uint32_t)subparams) >> k;
+ colon = term_ctz32(shifted);
+ int max_colon = (nparams < 16 ? nparams : 16) - k;
+ if (colon > max_colon)
+ colon = max_colon;
+ }
int skip = colon >= 4 ? 1 : 0;
if (i + 4 + skip >= nparams)
return 0;