PERFORCE change 154193 for review
Ed Schouten
ed at FreeBSD.org
Sat Dec 6 07:40:25 PST 2008
http://perforce.freebsd.org/chv.cgi?CH=154193
Change 154193 by ed at 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;
}
More information about the p4-projects
mailing list