svn commit: r300056 - in head/sys/boot: common efi/libefi

Warner Losh imp at FreeBSD.org
Tue May 17 14:10:47 UTC 2016


Author: imp
Date: Tue May 17 14:10:45 2016
New Revision: 300056
URL: https://svnweb.freebsd.org/changeset/base/300056

Log:
  It sure would be nice to use printf with wide strings. Implement %S to
  do that. The C_WIDEOUT flag indicates that the console supports
  it. Mark the EFI console as supporting this.
  
  MFC After: 3 days

Modified:
  head/sys/boot/common/bootstrap.h
  head/sys/boot/common/util.c
  head/sys/boot/efi/libefi/efi_console.c

Modified: head/sys/boot/common/bootstrap.h
==============================================================================
--- head/sys/boot/common/bootstrap.h	Tue May 17 14:10:44 2016	(r300055)
+++ head/sys/boot/common/bootstrap.h	Tue May 17 14:10:45 2016	(r300056)
@@ -102,6 +102,7 @@ struct console 
 #define C_PRESENTOUT	(1<<1)	    /* console can provide output */
 #define C_ACTIVEIN	(1<<2)	    /* user wants input from console */
 #define C_ACTIVEOUT	(1<<3)	    /* user wants output to console */
+#define	C_WIDEOUT	(1<<4)	    /* c_out routine groks wide chars */
     void	(* c_probe)(struct console *cp);	/* set c_flags to match hardware */
     int		(* c_init)(int arg);			/* reinit XXX may need more args */
     void	(* c_out)(int c);			/* emit c */

Modified: head/sys/boot/common/util.c
==============================================================================
--- head/sys/boot/common/util.c	Tue May 17 14:10:44 2016	(r300055)
+++ head/sys/boot/common/util.c	Tue May 17 14:10:45 2016	(r300056)
@@ -120,6 +120,7 @@ printf(const char *fmt, ...)
 	va_list ap;
 	const char *hex = "0123456789abcdef";
 	char buf[32], *s;
+	uint16_t *S;
 	unsigned long long u;
 	int c, l;
 
@@ -143,6 +144,10 @@ nextfmt:
 			for (s = va_arg(ap, char *); *s != '\0'; s++)
 				putchar(*s);
 			break;
+		case 'S':	/* Assume console can cope with wide chars */
+			for (S = va_arg(ap, uint16_t *); *S != 0; S++)
+				putchar(*S);
+ 			break;
 		case 'd':	/* A lie, always prints unsigned */
 		case 'u':
 		case 'x':

Modified: head/sys/boot/efi/libefi/efi_console.c
==============================================================================
--- head/sys/boot/efi/libefi/efi_console.c	Tue May 17 14:10:44 2016	(r300055)
+++ head/sys/boot/efi/libefi/efi_console.c	Tue May 17 14:10:45 2016	(r300056)
@@ -61,7 +61,7 @@ int efi_cons_poll(void);
 struct console efi_console = {
 	"efi",
 	"EFI console",
-	0,
+	C_WIDEOUT,
 	efi_cons_probe,
 	efi_cons_init,
 	efi_cons_putchar,


More information about the svn-src-head mailing list