svn commit: r197115 - in head/sys: dev/syscons teken

Ed Schouten ed at FreeBSD.org
Sat Sep 12 10:34:34 UTC 2009


Author: ed
Date: Sat Sep 12 10:34:34 2009
New Revision: 197115
URL: http://svn.freebsd.org/changeset/base/197115

Log:
  Make 8-bit support run-time configurable.
  
  Now to do the same for xterm support. This means people can eventually
  toy around with xterm+UTF-8 without recompiling their kernel.

Modified:
  head/sys/dev/syscons/scterm-teken.c
  head/sys/teken/teken.c
  head/sys/teken/teken.h
  head/sys/teken/teken_demo.c
  head/sys/teken/teken_subr.h

Modified: head/sys/dev/syscons/scterm-teken.c
==============================================================================
--- head/sys/dev/syscons/scterm-teken.c	Sat Sep 12 08:19:24 2009	(r197114)
+++ head/sys/dev/syscons/scterm-teken.c	Sat Sep 12 10:34:34 2009	(r197115)
@@ -125,6 +125,9 @@ scteken_init(scr_stat *scp, void **softc
 		/* FALLTHROUGH */
 	case SC_TE_WARM_INIT:
 		teken_init(&ts->ts_teken, &scteken_funcs, scp);
+#ifndef TEKEN_UTF8
+		teken_set_8bit(&ts->ts_teken);
+#endif /* !TEKEN_UTF8 */
 
 		tp.tp_row = scp->ysize;
 		tp.tp_col = scp->xsize;

Modified: head/sys/teken/teken.c
==============================================================================
--- head/sys/teken/teken.c	Sat Sep 12 08:19:24 2009	(r197114)
+++ head/sys/teken/teken.c	Sat Sep 12 10:34:34 2009	(r197115)
@@ -49,26 +49,17 @@ static FILE *df;
 #endif /* __FreeBSD__ && _KERNEL */
 
 #include "teken.h"
-
-#ifdef TEKEN_UTF8
 #include "teken_wcwidth.h"
-#else /* !TEKEN_UTF8 */
-#ifdef TEKEN_XTERM
-#define	teken_wcwidth(c)	((c <= 0x1B) ? -1 : 1)
-#else /* !TEKEN_XTERM */
-#define	teken_wcwidth(c)	(1)
-#endif /* TEKEN_XTERM */
-#endif /* TEKEN_UTF8 */
 
-#if defined(TEKEN_XTERM) && defined(TEKEN_UTF8)
+#ifdef TEKEN_XTERM
 #include "teken_scs.h"
-#else /* !(TEKEN_XTERM && TEKEN_UTF8) */
+#else /* !TEKEN_XTERM */
 #define	teken_scs_process(t, c)	(c)
 #define	teken_scs_restore(t)
 #define	teken_scs_save(t)
 #define	teken_scs_set(t, g, ts)
 #define	teken_scs_switch(t, g)
-#endif /* TEKEN_XTERM && TEKEN_UTF8 */
+#endif /* TEKEN_XTERM */
 
 /* Private flags for t_stateflags. */
 #define	TS_FIRSTDIGIT	0x01	/* First numeric digit in escape sequence. */
@@ -187,9 +178,7 @@ teken_init(teken_t *t, const teken_funcs
 	t->t_defattr.ta_bgcolor = TC_BLACK;
 	teken_subr_do_reset(t);
 
-#ifdef TEKEN_UTF8
 	t->t_utf8_left = 0;
-#endif /* TEKEN_UTF8 */
 
 	teken_set_winsize(t, &tp);
 }
@@ -214,14 +203,14 @@ teken_input_char(teken_t *t, teken_char_
 	case '\x0C':
 		teken_subr_newpage(t);
 		break;
-#if defined(TEKEN_XTERM) && defined(TEKEN_UTF8)
+#ifdef TEKEN_XTERM
 	case '\x0E':
 		teken_scs_switch(t, 1);
 		break;
 	case '\x0F':
 		teken_scs_switch(t, 0);
 		break;
-#endif /* TEKEN_XTERM && TEKEN_UTF8 */
+#endif /* TEKEN_XTERM */
 	case '\r':
 		teken_subr_carriage_return(t);
 		break;
@@ -253,11 +242,13 @@ static void
 teken_input_byte(teken_t *t, unsigned char c)
 {
 
-#ifdef TEKEN_UTF8
 	/*
 	 * UTF-8 handling.
 	 */
-	if ((c & 0x80) == 0x00) {
+	 if (t->t_utf8_left == -1) {
+	 	/* UTF-8 disabled. */
+		teken_input_char(t, c);
+	} else if ((c & 0x80) == 0x00) {
 		/* One-byte sequence. */
 		t->t_utf8_left = 0;
 		teken_input_char(t, c);
@@ -283,9 +274,6 @@ teken_input_byte(teken_t *t, unsigned ch
 			teken_input_char(t, t->t_utf8_partial);
 		}
 	}
-#else /* !TEKEN_UTF8 */
-	teken_input_char(t, c);
-#endif /* TEKEN_UTF8 */
 }
 
 void
@@ -344,6 +332,13 @@ teken_set_winsize(teken_t *t, const teke
 	teken_subr_do_reset(t);
 }
 
+void
+teken_set_8bit(teken_t *t)
+{
+
+	t->t_utf8_left = -1;
+}
+
 /*
  * State machine.
  */

Modified: head/sys/teken/teken.h
==============================================================================
--- head/sys/teken/teken.h	Sat Sep 12 08:19:24 2009	(r197114)
+++ head/sys/teken/teken.h	Sat Sep 12 10:34:34 2009	(r197115)
@@ -36,7 +36,6 @@
  * commands.
  *
  * Configuration switches:
- * - TEKEN_UTF8: Enable/disable UTF-8 handling.
  * - TEKEN_XTERM: Enable xterm-style emulation, instead of cons25.
  */
 
@@ -44,11 +43,7 @@
 #include "opt_teken.h"
 #endif /* __FreeBSD__ && _KERNEL */
 
-#ifdef TEKEN_UTF8
 typedef uint32_t teken_char_t;
-#else /* !TEKEN_UTF8 */
-typedef unsigned char teken_char_t;
-#endif /* TEKEN_UTF8 */
 typedef unsigned short teken_unit_t;
 typedef unsigned char teken_format_t;
 #define	TF_BOLD		0x01
@@ -121,9 +116,9 @@ typedef struct {
 	tf_respond_t	*tf_respond;
 } teken_funcs_t;
 
-#if defined(TEKEN_XTERM) && defined(TEKEN_UTF8)
+#ifdef TEKEN_XTERM
 typedef teken_char_t teken_scs_t(teken_char_t);
-#endif /* TEKEN_XTERM && TEKEN_UTF8 */
+#endif /* TEKEN_XTERM */
 
 /*
  * Terminal state.
@@ -156,16 +151,14 @@ struct __teken {
 #define	T_NUMCOL	160
 	unsigned int	 t_tabstops[T_NUMCOL / (sizeof(unsigned int) * 8)];
 
-#ifdef TEKEN_UTF8
-	unsigned int	 t_utf8_left;
+	int		 t_utf8_left;
 	teken_char_t	 t_utf8_partial;
-#endif /* TEKEN_UTF8 */
 
-#if defined(TEKEN_XTERM) && defined(TEKEN_UTF8)
+#ifdef TEKEN_XTERM
 	unsigned int	 t_curscs;
 	teken_scs_t	*t_saved_curscs;
 	teken_scs_t	*t_scs[2];
-#endif /* TEKEN_XTERM && TEKEN_UTF8 */
+#endif /* TEKEN_XTERM */
 };
 
 /* Initialize teken structure. */
@@ -182,4 +175,7 @@ void	teken_set_curattr(teken_t *, const 
 void	teken_set_defattr(teken_t *, const teken_attr_t *);
 void	teken_set_winsize(teken_t *, const teken_pos_t *);
 
+/* Legacy features. */
+void	teken_set_8bit(teken_t *);
+
 #endif /* !_TEKEN_H_ */

Modified: head/sys/teken/teken_demo.c
==============================================================================
--- head/sys/teken/teken_demo.c	Sat Sep 12 08:19:24 2009	(r197114)
+++ head/sys/teken/teken_demo.c	Sat Sep 12 10:34:34 2009	(r197115)
@@ -95,7 +95,6 @@ printchar(const teken_pos_t *p)
  	px = &buffer[p->tp_col][p->tp_row];
 
 	/* Convert Unicode to UTF-8. */
-#ifdef TEKEN_UTF8
 	if (px->c < 0x80) {
 		str[0] = px->c;
 	} else if (px->c < 0x800) {
@@ -111,9 +110,6 @@ printchar(const teken_pos_t *p)
 		str[2] = 0x80 | ((px->c >> 6) & 0x3f);
 		str[3] = 0x80 | (px->c & 0x3f);
 	}
-#else /* !TEKEN_UTF8 */
-	str[0] = px->c;
-#endif /* TEKEN_UTF8 */
 
 	if (px->a.ta_format & TF_BOLD)
 		attr |= A_BOLD;
@@ -294,9 +290,7 @@ main(int argc __unused, char *argv[] __u
 	};
 	int i, j;
 
-#ifdef TEKEN_UTF8
 	setlocale(LC_CTYPE, "UTF-8");
-#endif /* TEKEN_UTF8 */
 
 	tp.tp_row = ws.ws_row = NROWS;
 	tp.tp_col = ws.ws_col = NCOLS;
@@ -311,9 +305,7 @@ main(int argc __unused, char *argv[] __u
 #else /* !TEKEN_XTERM */
 		setenv("TERM", "cons25", 1);
 #endif /* TEKEN_XTERM */
-#ifdef TEKEN_UTF8
 		setenv("LC_CTYPE", "UTF-8", 0);
-#endif /* TEKEN_UTF8 */
 		execlp("zsh", "-zsh", NULL);
 		execlp("bash", "-bash", NULL);
 		execlp("sh", "-sh", NULL);

Modified: head/sys/teken/teken_subr.h
==============================================================================
--- head/sys/teken/teken_subr.h	Sat Sep 12 08:19:24 2009	(r197114)
+++ head/sys/teken/teken_subr.h	Sat Sep 12 10:34:34 2009	(r197115)
@@ -786,13 +786,20 @@ static void
 teken_subr_regular_character(teken_t *t, teken_char_t c)
 {
 	int width;
-	
-	c = teken_scs_process(t, c);
 
-	/* XXX: Don't process zero-width characters yet. */
-	width = teken_wcwidth(c);
-	if (width <= 0)
-		return;
+	if (t->t_utf8_left == -1) {
+#ifdef TEKEN_XTERM
+		if (c <= 0x1B)
+			return;
+#endif /* TEKEN_XTERM */
+		width = 1;
+	} else {
+		c = teken_scs_process(t, c);
+		width = teken_wcwidth(c);
+		/* XXX: Don't process zero-width characters yet. */
+		if (width <= 0)
+			return;
+	}
 
 #ifdef TEKEN_XTERM
 	if (t->t_cursor.tp_col == t->t_winsize.tp_col - 1 &&


More information about the svn-src-all mailing list