Date: Sat, 6 Dec 2008 15:40:24 GMT From: Ed Schouten <ed@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 154193 for review Message-ID: <200812061540.mB6FeOMP012976@repoman.freebsd.org>
index | next in thread | raw e-mail
http://perforce.freebsd.org/chv.cgi?CH=154193 Change 154193 by ed@ed_flippo on 2008/12/06 15:39:26 Many cleanups/improvements to libteken + syscons: - Remove t_nextchar and replace its usage by a state flag TS_WRAPPED. - Implement CHT. - More xterm mimic fixes. - Best of all: enable UTF-8! Syscons now accepts UTF-8, but it isn't properly converted to its font map yet. Affected files ... .. //depot/projects/mpsafetty/sys/dev/syscons/teken/sequences#3 edit .. //depot/projects/mpsafetty/sys/dev/syscons/teken/teken.c#3 edit .. //depot/projects/mpsafetty/sys/dev/syscons/teken/teken.h#6 edit .. //depot/projects/mpsafetty/sys/dev/syscons/teken/teken_subr.h#4 edit Differences ... ==== //depot/projects/mpsafetty/sys/dev/syscons/teken/sequences#3 (text+ko) ==== @@ -68,6 +68,7 @@ IND Index ^[ D NEL Next line ^[ E RI Reverse index ^[ M +RIS Reset to Initial State ^[ c RM Reset Mode ^[ [ l 0 SCS SCS ^[ ( 0 SCS SCS ^[ ( 1 ==== //depot/projects/mpsafetty/sys/dev/syscons/teken/teken.c#3 (text+ko) ==== @@ -57,6 +57,7 @@ #define TS_INSERT 0x02 /* Insert mode. */ #define TS_AUTOWRAP 0x04 /* Autowrap. */ #define TS_ORIGIN 0x08 /* Origin mode. */ +#define TS_WRAPPED 0x10 /* Next character should be printed on col 0. */ static teken_state_t teken_state_init; @@ -179,13 +180,8 @@ t->t_softc = softc; t->t_nextstate = teken_state_init; - t->t_cursor.tp_row = t->t_cursor.tp_col = 0; - t->t_saved_cursor = t->t_nextchar = t->t_cursor; - t->t_stateflags = TS_AUTOWRAP; - t->t_curattr = t->t_saved_curattr = teken_defattr; - - teken_tab_default(t); + teken_subr_do_reset(t); #ifdef TEKEN_UTF8 t->t_utf8_left = 0; @@ -209,16 +205,14 @@ teken_subr_backspace(t); break; case '\n': + case '\x0B': teken_subr_newline(t); break; case '\r': teken_subr_carriage_return(t); break; case '\t': - teken_subr_horizontal_tab(t); - break; - case '\x0B': - teken_subr_vertical_tab(t); + teken_subr_cursor_forward_tabulation(t, 1); break; default: t->t_nextstate(t, c); @@ -232,7 +226,6 @@ teken_assert(t->t_cursor.tp_col < t->t_winsize.tp_col); teken_assert(t->t_saved_cursor.tp_row < t->t_winsize.tp_row); teken_assert(t->t_saved_cursor.tp_col < t->t_winsize.tp_col); - teken_assert(t->t_nextchar.tp_row <= t->t_winsize.tp_row); teken_assert(t->t_scrollreg.ts_end <= t->t_winsize.tp_row); teken_assert(t->t_scrollreg.ts_begin < t->t_scrollreg.ts_end); teken_assert(t->t_originreg.ts_end <= t->t_winsize.tp_row); @@ -270,7 +263,7 @@ t->t_utf8_partial = (t->t_utf8_partial << 6) | (c & 0x3f); if (t->t_utf8_left == 0) { teken_printf("Got UTF-8 char %u\n", t->t_utf8_partial); - teken_input_char(t, t->utf8_partial); + teken_input_char(t, t->t_utf8_partial); } } #else /* !TEKEN_UTF8 */ ==== //depot/projects/mpsafetty/sys/dev/syscons/teken/teken.h#6 (text+ko) ==== @@ -34,12 +34,14 @@ * commands. It implements commands similar to xterm-color. */ +#define TEKEN_UTF8 + #ifdef TEKEN_UTF8 typedef uint32_t teken_char_t; #else /* !TEKEN_UTF8 */ typedef unsigned char teken_char_t; #endif /* TEKEN_UTF8 */ -typedef unsigned int teken_unit_t; +typedef unsigned short teken_unit_t; typedef unsigned char teken_format_t; #define TF_BOLD 0x01 #define TF_UNDERLINE 0x02 @@ -124,7 +126,6 @@ teken_pos_t t_saved_cursor; teken_attr_t t_saved_curattr; - teken_pos_t t_nextchar; teken_pos_t t_winsize; /* For DECSTBM. */ ==== //depot/projects/mpsafetty/sys/dev/syscons/teken/teken_subr.h#4 (text+ko) ==== @@ -176,7 +176,7 @@ t->t_scrollreg.ts_end = t->t_winsize.tp_row; t->t_cursor.tp_row = t->t_cursor.tp_col = 0; - t->t_nextchar = t->t_cursor; + t->t_stateflags &= ~TS_WRAPPED; teken_funcs_cursor(t); tr.tr_begin.tp_row = 0; @@ -189,20 +189,11 @@ teken_subr_backspace(teken_t *t) { - /* We're already stuck at column 0. */ - if (t->t_nextchar.tp_col == 0) + if (t->t_cursor.tp_col == 0) return; - /* We may need to scroll one row back. */ - if (t->t_nextchar.tp_row > 0 && - (t->t_nextchar.tp_col % t->t_winsize.tp_col) == 0) { - t->t_nextchar.tp_row--; - } - t->t_nextchar.tp_col--; - - /* Sync cursor position again. */ - t->t_cursor.tp_row = t->t_nextchar.tp_row; - t->t_cursor.tp_col = t->t_nextchar.tp_col % t->t_winsize.tp_col; + t->t_cursor.tp_col--; + t->t_stateflags &= ~TS_WRAPPED; teken_funcs_cursor(t); } @@ -219,7 +210,7 @@ { t->t_cursor.tp_col = 0; - t->t_nextchar = t->t_cursor; + t->t_stateflags &= ~TS_WRAPPED; teken_funcs_cursor(t); } @@ -233,7 +224,7 @@ t->t_cursor.tp_col = 0; else t->t_cursor.tp_col -= ncols; - t->t_nextchar = t->t_cursor; + t->t_stateflags &= ~TS_WRAPPED; teken_funcs_cursor(t); } @@ -256,7 +247,7 @@ t->t_cursor.tp_row = t->t_scrollreg.ts_end - 1; else t->t_cursor.tp_row += nrows; - t->t_nextchar = t->t_cursor; + t->t_stateflags &= ~TS_WRAPPED; teken_funcs_cursor(t); } @@ -270,7 +261,7 @@ t->t_cursor.tp_col = t->t_winsize.tp_col - 1; else t->t_cursor.tp_col += ncols; - t->t_nextchar = t->t_cursor; + t->t_stateflags &= ~TS_WRAPPED; teken_funcs_cursor(t); } @@ -278,7 +269,22 @@ teken_subr_cursor_forward_tabulation(teken_t *t, unsigned int ntabs) { - teken_printf("CHT???\n"); + if (ntabs == 0) + ntabs = 1; + + do { + /* Stop when we've reached the end of the line. */ + if ((t->t_stateflags & TS_AUTOWRAP) == 0 && + t->t_cursor.tp_col == t->t_winsize.tp_col - 1) + break; + + teken_subr_regular_character(t, ' '); + + /* Tab marker set. */ + if (t->t_stateflags & TS_WRAPPED || + teken_tab_isset(t, t->t_cursor.tp_col)) + ntabs--; + } while (ntabs > 0); } static void @@ -296,7 +302,7 @@ t->t_cursor.tp_row = teken_clamp(row + t->t_originreg.ts_begin, 1, t->t_originreg.ts_end) - 1; t->t_cursor.tp_col = teken_clamp(col, 1, t->t_winsize.tp_col) - 1; - t->t_nextchar = t->t_cursor; + t->t_stateflags &= ~TS_WRAPPED; teken_funcs_cursor(t); } @@ -334,7 +340,7 @@ t->t_cursor.tp_row = t->t_scrollreg.ts_begin; else t->t_cursor.tp_row -= nrows; - t->t_nextchar = t->t_cursor; + t->t_stateflags &= ~TS_WRAPPED; teken_funcs_cursor(t); } @@ -513,28 +519,11 @@ { t->t_cursor.tp_col = teken_clamp(col, 1, t->t_winsize.tp_col) - 1; - t->t_nextchar = t->t_cursor; + t->t_stateflags &= ~TS_WRAPPED; teken_funcs_cursor(t); } static void -teken_subr_horizontal_tab(teken_t *t) -{ - - for (;;) { - /* Stop when we've reached the end of the line. */ - if (t->t_cursor.tp_col == t->t_winsize.tp_col - 1) - break; - - teken_subr_regular_character(t, ' '); - - /* Tab marker set. */ - if (teken_tab_isset(t, t->t_cursor.tp_col)) - break; - } -} - -static void teken_subr_horizontal_tab_set(teken_t *t) { @@ -547,7 +536,7 @@ if (t->t_cursor.tp_row < t->t_scrollreg.ts_end - 1) { t->t_cursor.tp_row++; - t->t_nextchar = t->t_cursor; + t->t_stateflags &= ~TS_WRAPPED; teken_funcs_cursor(t); } else { teken_subr_do_scroll(t, 1); @@ -641,7 +630,7 @@ t->t_cursor.tp_row = t->t_scrollreg.ts_end - 1; } - t->t_nextchar = t->t_cursor; + t->t_stateflags &= ~TS_WRAPPED; teken_funcs_cursor(t); } @@ -695,7 +684,10 @@ static void teken_subr_regular_character(teken_t *t, teken_char_t c) { - teken_pos_t tp; + + /* Unprintable characters. */ + if (c <= 0x1B) + return; if (t->t_stateflags & TS_INSERT) { /* @@ -704,6 +696,7 @@ */ if (t->t_cursor.tp_col < t->t_winsize.tp_col - 1) { teken_rect_t tr; + teken_pos_t tp; tr.tr_begin = t->t_cursor; tr.tr_end.tp_row = t->t_cursor.tp_row + 1; @@ -717,32 +710,42 @@ return; } - if (t->t_nextchar.tp_row >= t->t_winsize.tp_row || - (t->t_nextchar.tp_row >= t->t_scrollreg.ts_end && - t->t_cursor.tp_row < t->t_scrollreg.ts_end)) { - /* - * Only scroll if we're going to print past the - * scrolling region. If the user explicitly set the - * cursor beyond the scrolling region, don't scroll. - */ - teken_subr_do_scroll(t, 1); - t->t_nextchar.tp_row = t->t_scrollreg.ts_end - 1; - } + if (t->t_cursor.tp_col == t->t_winsize.tp_col - 1 && + (t->t_stateflags & (TS_WRAPPED|TS_AUTOWRAP)) == + (TS_WRAPPED|TS_AUTOWRAP)) { + teken_pos_t tp; + + if (t->t_cursor.tp_row == t->t_scrollreg.ts_end - 1) { + /* Perform scrolling. */ + teken_subr_do_scroll(t, 1); + tp.tp_row = t->t_scrollreg.ts_end - 1; + } else { + /* No scrolling needed. */ + tp.tp_row = t->t_cursor.tp_row + 1; + if (tp.tp_row == t->t_winsize.tp_row) { + teken_funcs_putchar(t, &t->t_cursor, c, + &t->t_curattr); + return; + } + } - tp.tp_row = t->t_nextchar.tp_row; - tp.tp_col = t->t_nextchar.tp_col % t->t_winsize.tp_col; - teken_funcs_putchar(t, &tp, c, &t->t_curattr); + tp.tp_col = 0; + teken_funcs_putchar(t, &tp, c, &t->t_curattr); - if ((++t->t_nextchar.tp_col % t->t_winsize.tp_col) == 0) { - if (t->t_stateflags & TS_AUTOWRAP) { - t->t_cursor.tp_row = t->t_nextchar.tp_row; - t->t_cursor.tp_col = t->t_winsize.tp_col - 1; - t->t_nextchar.tp_row++; + t->t_cursor.tp_row = tp.tp_row; + t->t_cursor.tp_col = 1; + t->t_stateflags &= ~TS_WRAPPED; + } else { + /* No scrolling needed. */ + teken_funcs_putchar(t, &t->t_cursor, c, &t->t_curattr); + if (t->t_cursor.tp_col == t->t_winsize.tp_col - 1) { + t->t_stateflags |= TS_WRAPPED; + } else { + t->t_cursor.tp_col++; + t->t_stateflags &= ~TS_WRAPPED; } - } else { - t->t_cursor.tp_row = t->t_nextchar.tp_row; - t->t_cursor.tp_col = t->t_nextchar.tp_col % t->t_winsize.tp_col; } + teken_funcs_cursor(t); } @@ -760,7 +763,7 @@ teken_subr_erase_display(t, 2); t->t_cursor.tp_row = 0; t->t_cursor.tp_col = 0; - t->t_nextchar = t->t_cursor; + t->t_stateflags &= ~TS_WRAPPED; teken_funcs_cursor(t); break; case 5: /* Inverse video. */ @@ -772,7 +775,7 @@ t->t_originreg.ts_begin = 0; t->t_originreg.ts_end = t->t_winsize.tp_row; t->t_cursor.tp_row = t->t_cursor.tp_col = 0; - t->t_nextchar = t->t_cursor; + t->t_stateflags &= ~TS_WRAPPED; teken_funcs_cursor(t); break; case 7: /* Autowrap mode. */ @@ -808,12 +811,33 @@ } static void +teken_subr_do_reset(teken_t *t) +{ + + t->t_curattr = t->t_saved_curattr = teken_defattr; + t->t_cursor.tp_row = t->t_cursor.tp_col = 0; + t->t_saved_cursor = t->t_cursor; + t->t_stateflags = TS_AUTOWRAP; + + teken_tab_default(t); +} + +static void +teken_subr_reset_to_initial_state(teken_t *t) +{ + + teken_subr_do_reset(t); + teken_subr_erase_display(t, 2); + teken_funcs_cursor(t); +} + +static void teken_subr_restore_cursor(teken_t *t) { t->t_cursor = t->t_saved_cursor; t->t_curattr = t->t_saved_curattr; - t->t_nextchar = t->t_cursor; + t->t_stateflags &= ~TS_WRAPPED; teken_funcs_cursor(t); } @@ -825,7 +849,7 @@ teken_assert(t->t_cursor.tp_row >= t->t_scrollreg.ts_begin); if (t->t_cursor.tp_row > t->t_scrollreg.ts_begin) { t->t_cursor.tp_row--; - t->t_nextchar = t->t_cursor; + t->t_stateflags &= ~TS_WRAPPED; teken_funcs_cursor(t); } else { teken_subr_do_scroll(t, -1); @@ -873,7 +897,7 @@ teken_subr_erase_display(t, 2); t->t_cursor.tp_row = 0; t->t_cursor.tp_col = 0; - t->t_nextchar = t->t_cursor; + t->t_stateflags &= ~TS_WRAPPED; teken_funcs_cursor(t); break; case 5: /* Inverse video. */ @@ -885,7 +909,7 @@ t->t_originreg = t->t_scrollreg; t->t_cursor.tp_row = t->t_scrollreg.ts_begin; t->t_cursor.tp_col = 0; - t->t_nextchar = t->t_cursor; + t->t_stateflags &= ~TS_WRAPPED; teken_funcs_cursor(t); break; case 7: /* Autowrap mode. */ @@ -1020,7 +1044,7 @@ t->t_originreg = t->t_scrollreg; t->t_cursor.tp_row = t->t_originreg.ts_begin; t->t_cursor.tp_col = 0; - t->t_nextchar = t->t_cursor; + t->t_stateflags &= ~TS_WRAPPED; teken_funcs_cursor(t); } } @@ -1064,15 +1088,8 @@ teken_subr_vertical_position_absolute(teken_t *t, unsigned int row) { - t->t_cursor.tp_row = teken_clamp(row + t->t_originreg.ts_begin, - 1, t->t_originreg.ts_end) - 1; - t->t_nextchar = t->t_cursor; - teken_funcs_cursor(t); -} - -static void -teken_subr_vertical_tab(teken_t *t) -{ - - teken_subr_newline(t); + t->t_curattr = t->t_saved_curattr = teken_defattr; + t->t_cursor.tp_row = t->t_cursor.tp_col = 0; + t->t_saved_cursor = t->t_cursor; + t->t_stateflags = TS_AUTOWRAP; }home | help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200812061540.mB6FeOMP012976>
