MIRROR: javascript for 馃悳's, a tiny runtime with big ambitions
1#include <string.h>
2
3#include "highlight.h"
4#include "highlight/emit.h"
5
6int ant_highlight_stateful(
7 const char *input, size_t input_len,
8 char *out, size_t out_size,
9 highlight_state *state
10) {
11 hl_outbuf o;
12 hl_outbuf_init(&o, out, out_size);
13
14 hl_iter it;
15 hl_iter_init(&it, input, input_len, state);
16
17 hl_span span;
18 while (hl_iter_next(&it, &span) && !o.overflow)
19 hl_outbuf_emit_span(&o, span.cls, input + span.off, span.len);
20
21 *state = hl_iter_state(&it);
22
23 if (o.overflow) {
24 o.pos = 0;
25 o.overflow = false;
26 hl_outbuf_write_escaped(&o, input, input_len);
27 if (o.overflow) {
28 size_t safe = out_size > 1 ? out_size - 1 : 0;
29 if (safe > input_len) safe = input_len;
30 memcpy(out, input, safe);
31 out[safe] = '\0';
32 return (int)safe;
33 }
34 }
35
36 o.buf[o.pos] = '\0';
37 return (int)o.pos;
38}
39
40int ant_highlight(const char *input, size_t input_len, char *out, size_t out_size) {
41 highlight_state state = HL_STATE_INIT;
42 return ant_highlight_stateful(input, input_len, out, out_size, &state);
43}
44
45int highlight_js_line_clipped(
46 const char *line, size_t line_len,
47 size_t max_cols,
48 char *out, size_t out_size,
49 highlight_state *state
50) {
51 hl_outbuf o;
52 hl_outbuf_init(&o, out, out_size);
53
54 hl_iter it;
55 hl_iter_init(&it, line, line_len, state);
56
57 size_t vis_cols = 0;
58 hl_span span;
59
60 while (hl_iter_next(&it, &span)) {
61 if (vis_cols >= max_cols) continue;
62 size_t span_remaining = max_cols - vis_cols;
63 size_t emit_len = span.len < span_remaining ? span.len : span_remaining;
64 if (!o.overflow) hl_outbuf_emit_span(&o, span.cls, line + span.off, emit_len);
65 vis_cols += span.len;
66 }
67
68 *state = hl_iter_state(&it);
69
70 if (o.overflow) {
71 o.pos = 0;
72 size_t emit = line_len < max_cols ? line_len : max_cols;
73 hl_outbuf_write_escaped(&o, line, emit);
74 if (o.overflow) {
75 size_t safe = out_size > 1 ? out_size - 1 : 0;
76 if (safe > emit) safe = emit;
77 memcpy(out, line, safe);
78 out[safe] = '\0';
79 return (int)safe;
80 }
81 }
82
83 o.buf[o.pos] = '\0';
84 return (int)o.pos;
85}