14 if (!input || input_len == 0) {
24 char last_char[5] =
" ";
25 size_t last_char_len = 1;
28 while (i < input_len) {
30 if (input[i] ==
'\x1b' && i + 1 < input_len && input[i + 1] ==
'[') {
36 while (i < input_len && ((input[i] >=
'0' && input[i] <=
'9') || input[i] ==
';')) {
37 if (input[i] >=
'0' && input[i] <=
'9') {
38 param = param * 10 + (
uint32_t)(input[i] -
'0');
39 }
else if (input[i] ==
';') {
47 char final_byte = input[i];
51 if (final_byte ==
'b' && param > 0) {
52 for (
uint32_t r = 0; r < param; r++) {
53 ob_write(&ob, last_char, last_char_len);
57 ob_write(&ob, input + seq_start, i - seq_start);
62 unsigned char c = (
unsigned char)input[i];
66 if ((c & 0x80) == 0) {
68 }
else if ((c & 0xE0) == 0xC0) {
70 }
else if ((c & 0xF0) == 0xE0) {
72 }
else if ((c & 0xF8) == 0xF0) {
77 if (i + char_len > input_len) {
78 char_len = input_len - i;
85 if (c >= 0x20 && c != 0x7F) {
86 SAFE_MEMCPY(last_char,
sizeof(last_char), input + i, char_len);
87 last_char[char_len] =
'\0';
88 last_char_len = char_len;
99 if (!input || input_len == 0) {
107 while (i < input_len) {
109 if (input[i] ==
'\x1b' && i + 1 < input_len && input[i + 1] ==
'[') {
110 size_t seq_start = i;
114 while (i < input_len && ((input[i] >=
'0' && input[i] <=
'9') || input[i] ==
';')) {
124 ob_write(&ob, input + seq_start, i - seq_start);
130 if (c >= 0x20 && c != 0x7F) {
135 while (i < input_len && input[i] == c) {
148 for (
size_t k = 1; k < run_len; k++) {
#define SAFE_MEMCPY(dest, dest_size, src, count)
void ob_term(outbuf_t *ob)
Append null terminator to buffer.
void ob_putc(outbuf_t *ob, char c)
Append a character to buffer.
bool rep_is_profitable(uint32_t runlen)
Check if run-length encoding is profitable.
void ob_reserve(outbuf_t *ob, size_t need)
Reserve buffer space for upcoming writes.
void emit_rep(outbuf_t *ob, uint32_t extra)
Emit run-length encoded sequence.
char * ansi_compress_rle(const char *input, size_t input_len)
Compress repeated characters using RLE escape sequences.
void ob_write(outbuf_t *ob, const char *s, size_t n)
Append a string to buffer.
char * ansi_expand_rle(const char *input, size_t input_len)
Expand RLE escape sequences in a string.
Dynamic Output Buffer with ANSI Sequence Support.
ANSI RLE (REP) sequence compression and expansion.
Dynamic output buffer (auto-expanding)
char * buf
Buffer pointer (allocated, owned by caller, must be freed)