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