Fast and reasonably complete (framebuffer) terminal emulator (Zig fork)

Bound some loops that could cause long hangs

mintsuki 9b51770c 545ab1fa

Changed files
+10 -5
+10 -5
flanterm.c
···
ctx->esc_values[0] = ctx->rows - 1;
ctx->set_cursor_pos(ctx, ctx->esc_values[1], ctx->esc_values[0]);
break;
-
case 'M':
-
for (size_t i = 0; i < ctx->esc_values[0]; i++) {
ctx->scroll(ctx);
}
break;
case 'L': {
size_t old_scroll_top_margin = ctx->scroll_top_margin;
ctx->scroll_top_margin = y;
-
for (size_t i = 0; i < ctx->esc_values[0]; i++) {
ctx->revscroll(ctx);
}
ctx->scroll_top_margin = old_scroll_top_margin;
···
ctx->move_character(ctx, i - ctx->esc_values[0], y, i, y);
ctx->set_cursor_pos(ctx, ctx->cols - ctx->esc_values[0], y);
// FALLTHRU
-
case 'X':
-
for (size_t i = 0; i < ctx->esc_values[0]; i++)
ctx->raw_putchar(ctx, ' ');
ctx->set_cursor_pos(ctx, x, y);
break;
case 'm':
sgr(ctx);
break;
···
ctx->esc_values[0] = ctx->rows - 1;
ctx->set_cursor_pos(ctx, ctx->esc_values[1], ctx->esc_values[0]);
break;
+
case 'M': {
+
size_t count = ctx->esc_values[0] > ctx->rows ? ctx->rows : ctx->esc_values[0];
+
for (size_t i = 0; i < count; i++) {
ctx->scroll(ctx);
}
break;
+
}
case 'L': {
size_t old_scroll_top_margin = ctx->scroll_top_margin;
ctx->scroll_top_margin = y;
+
size_t count = ctx->esc_values[0] > ctx->rows ? ctx->rows : ctx->esc_values[0];
+
for (size_t i = 0; i < count; i++) {
ctx->revscroll(ctx);
}
ctx->scroll_top_margin = old_scroll_top_margin;
···
ctx->move_character(ctx, i - ctx->esc_values[0], y, i, y);
ctx->set_cursor_pos(ctx, ctx->cols - ctx->esc_values[0], y);
// FALLTHRU
+
case 'X': {
+
size_t count = ctx->esc_values[0] > ctx->cols ? ctx->cols : ctx->esc_values[0];
+
for (size_t i = 0; i < count; i++)
ctx->raw_putchar(ctx, ' ');
ctx->set_cursor_pos(ctx, x, y);
break;
+
}
case 'm':
sgr(ctx);
break;