MIRROR: javascript for 馃悳's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at mir/inline-method 85 lines 2.1 kB view raw
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}