| 1852 | printf("\x1b[%d;%dH", row, col); |
| 1853 | } |
| 1854 | |
| 1855 | static void term_clear_to_eol(void) { |
| 1856 | fputs("\x1b[K", stdout); |
| 1857 | } |
| 1858 | |
| 1859 | static int tui_right_text_w(const eval_ui *ui) { |
| 1860 | /* Avoid writing the physical last column. Many terminals defer wrapping |
| 1861 | * until the next byte after the last column, which would spill right-pane |
| 1862 | * status text into the next row's left pane. */ |
| 1863 | return ui->right_w > 1 ? ui->right_w - 1 : ui->right_w; |
| 1864 | } |
| 1865 | |
| 1866 | static void tui_clear_left_line(eval_ui *ui, int row) { |
| 1867 | term_move(row, 1); |
| 1868 | for (int i = 0; i < ui->left_w; i++) fputc(' ', stdout); |
| 1869 | term_move(row, ui->left_w + 1); |
| 1870 | fputs(ANSI_DIM "|" ANSI_RESET, stdout); |
| 1871 | term_move(row, 1); |
| 1872 | } |
| 1873 | |
| 1874 | static void term_set_color_for_status(eval_status st) { |
| 1875 | switch (st) { |
| 1876 | case EVAL_PENDING: fputs(ANSI_DIM, stdout); break; |
| 1877 | case EVAL_PREFILL: fputs(ANSI_CYAN, stdout); break; |
| 1878 | case EVAL_THINKING: fputs(ANSI_YELLOW, stdout); break; |
| 1879 | case EVAL_SKIPPED: fputs(ANSI_DIM, stdout); break; |
| 1880 | case EVAL_STOPPED: fputs(ANSI_YELLOW ANSI_BOLD, stdout); break; |
| 1881 | case EVAL_INCOMPLETE:fputs(ANSI_YELLOW ANSI_BOLD, stdout); break; |
| 1882 | case EVAL_PASSED: fputs(ANSI_GREEN ANSI_BOLD, stdout); break; |
| 1883 | case EVAL_FAILED: fputs(ANSI_RED ANSI_BOLD, stdout); break; |
| 1884 | } |
| 1885 | } |
| 1886 | |
| 1887 | static const char *status_name(eval_status st) { |
| 1888 | switch (st) { |
| 1889 | case EVAL_PENDING: return "PEND"; |
| 1890 | case EVAL_PREFILL: return "FILL"; |