move vterm to heap to avoid stack overflow

This commit is contained in:
2026-05-27 15:55:26 +03:00
parent 1225df216c
commit c712e71951

View File

@@ -82,7 +82,7 @@ static int color_css(char* buf, size_t size, int32_t color, int is_bg) {
}
static char* vterm_render(const vterm_t* vt) {
const size_t cap =
const size_t cap = 1024
+ (size_t)(vt->last_row + 1) * 4
+ (size_t)(vt->last_row + 1) * (vt->last_col + 1) *
(sizeof("<span class=\" b i u s d k\" style=\"color:#xxxxxx;background:#xxxxxx;\">&amp;</span>") - 1);
@@ -288,13 +288,14 @@ static int utf8_len(const unsigned char c) {
}
static char* ansi2html(const char* ansislop) {
vterm_t vt = {0};
vterm_t* vt = malloc(sizeof(vterm_t));
memset(vt, 0, sizeof(vterm_t));
vt.slop.fg = vt.slop.bg = -1;
vt->slop.fg = vt->slop.bg = -1;
for (int r = 0; r < VTERM_ROWS; r++) {
for (int c = 0; c < VTERM_COLS; c++) {
vt.cells[r][c].slop.fg = vt.cells[r][c].slop.bg = -1;
vt.cells[r][c].utf8[0] = ' ';
vt->cells[r][c].slop.fg = vt->cells[r][c].slop.bg = -1;
vt->cells[r][c].utf8[0] = ' ';
}
}
@@ -302,7 +303,7 @@ static char* ansi2html(const char* ansislop) {
if (*p == '\e') {
p++;
if (*p == '[') {
p = vterm_csi(&vt, p + 1);
p = vterm_csi(vt, p + 1);
}
else if (*p == '(') {
p += 2;
@@ -313,19 +314,19 @@ static char* ansi2html(const char* ansislop) {
}
else if (*p == '\r') {
p++;
vt.col = 0;
vt->col = 0;
}
else if (*p == '\n') {
p++;
vt.col = 0;
vt.row++;
vt->col = 0;
vt->row++;
}
else if (*p == '\t') {
p++;
vt.col = (vt.col + 8) & ~7;
if (vt.col >= VTERM_COLS) {
vt.col = 0;
vt.row++;
vt->col = (vt->col + 8) & ~7;
if (vt->col >= VTERM_COLS) {
vt->col = 0;
vt->row++;
}
}
else if ((uint8_t)*p < 0x20) {
@@ -333,9 +334,11 @@ static char* ansi2html(const char* ansislop) {
}
else {
const int l = utf8_len((unsigned char)*p);
vterm_put(&vt, p, l);
vterm_put(vt, p, l);
p += l;
}
}
return vterm_render(&vt);
char* html = vterm_render(vt);
free(vt);
return html;
}