summaryrefslogtreecommitdiff
path: root/src/pen.h
diff options
context:
space:
mode:
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;