Module Name:    src
Committed By:   christos
Date:           Sun Feb 14 14:47:48 UTC 2016

Modified Files:
        src/lib/libedit: chartype.c chartype.h read.c

Log Message:
>From Ingo Schwartze:

Next step:  Remove #ifdef'ing in read_char(), in the same style
as we did for setlocale(3) in el.c.

A few remarks are required to explain the choices made.

 * On first sight, handling mbrtowc(3) seems a bit less trivial
   than handling setlocale(3) because its prototype uses the data
   type mbstate_t from <wchar.h>.  However, it turns out that
   "histedit.h" already includes <wchar.h> unconditionally (i don't
   like headers including other headers, but that ship has sailed,
   people are by now certainly used to the fact that including
   "histedit.h" doesn't require including <wchar.h> before), and
   "histedit.h" is of course included all over the place.  So from
   that perspective, there is no problem with using mbrtowc(3)
   unconditionally ever for !WIDECHAR.

 * However, <wchar.h> also defines the mbrtowc(3) prototype,
   so we cannot just #define mbrtowc away, or including the header
   will break.  It would also be a bad idea to porovide a local
   implementation of mbrtowc() and hope that it overrides the one
   in libc.  Besides, the required prototype is subtly different:
   While mbrtowc(3) takes "wchar_t *" as its first argument, we
   need a function that takes "Char *".  So unfortunately, we have
   to keep a ct_mbrtowc #define, at least until we can maybe get
   rid of "Char *" in the more remote future.

 * After getting rid of the #else clause in read_char(), we can
   pull "return 1;" into the default: clause.  After that, we can
   get rid of the ugly "goto again_lastbyte;" and just "break;".
   As a bonus, that also gets rid of the ugly CONSTCOND.

 * While here, delete the unused ct_mbtowc() from chartype.h.


To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/lib/libedit/chartype.c
cvs rdiff -u -r1.17 -r1.18 src/lib/libedit/chartype.h
cvs rdiff -u -r1.76 -r1.77 src/lib/libedit/read.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libedit/chartype.c
diff -u src/lib/libedit/chartype.c:1.13 src/lib/libedit/chartype.c:1.14
--- src/lib/libedit/chartype.c:1.13	Thu Feb 11 14:21:04 2016
+++ src/lib/libedit/chartype.c	Sun Feb 14 09:47:48 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: chartype.c,v 1.13 2016/02/11 19:21:04 christos Exp $	*/
+/*	$NetBSD: chartype.c,v 1.14 2016/02/14 14:47:48 christos Exp $	*/
 
 /*-
  * Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -38,7 +38,7 @@
  */
 #include "config.h"
 #if !defined(lint) && !defined(SCCSID)
-__RCSID("$NetBSD: chartype.c,v 1.13 2016/02/11 19:21:04 christos Exp $");
+__RCSID("$NetBSD: chartype.c,v 1.14 2016/02/14 14:47:48 christos Exp $");
 #endif /* not lint && not SCCSID */
 #include "el.h"
 #include <stdlib.h>
@@ -210,6 +210,20 @@ ct_encode_char(char *dst, size_t len, Ch
 	}
 	return l;
 }
+
+#else
+
+size_t
+ct_mbrtowc(char *wc, const char *s, size_t n,
+    void *mbs __attribute((__unused__))) {
+	if (s == NULL)
+		return 0;
+	if (n == 0)
+		return (size_t)-2;
+	if (wc != NULL)
+		*wc = *s;
+	return *s != '\0';
+}
 #endif
 
 protected const Char *

Index: src/lib/libedit/chartype.h
diff -u src/lib/libedit/chartype.h:1.17 src/lib/libedit/chartype.h:1.18
--- src/lib/libedit/chartype.h:1.17	Thu Feb 11 14:10:18 2016
+++ src/lib/libedit/chartype.h	Sun Feb 14 09:47:48 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: chartype.h,v 1.17 2016/02/11 19:10:18 christos Exp $	*/
+/*	$NetBSD: chartype.h,v 1.18 2016/02/14 14:47:48 christos Exp $	*/
 
 /*-
  * Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -60,7 +60,6 @@
 #warning Build environment does not support non-BMP characters
 #endif
 
-#define ct_mbtowc            mbtowc
 #define ct_mbrtowc           mbrtowc
 #define ct_wctomb            wctomb
 #define ct_wctomb_reset      wctomb(0,0)
@@ -115,8 +114,7 @@ Width(wchar_t c)
 
 #else /* NARROW */
 
-#define ct_mbtowc            error
-#define ct_mbrtowc           error
+size_t 	ct_mbrtowc(char *, const char *, size_t, void *);
 #define ct_wctomb            error
 #define ct_wctomb_reset      
 #define ct_wcstombs(a, b, c)    (strncpy(a, b, c), strlen(a))

Index: src/lib/libedit/read.c
diff -u src/lib/libedit/read.c:1.76 src/lib/libedit/read.c:1.77
--- src/lib/libedit/read.c:1.76	Fri Feb 12 10:36:08 2016
+++ src/lib/libedit/read.c	Sun Feb 14 09:47:48 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: read.c,v 1.76 2016/02/12 15:36:08 christos Exp $	*/
+/*	$NetBSD: read.c,v 1.77 2016/02/14 14:47:48 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -37,7 +37,7 @@
 #if 0
 static char sccsid[] = "@(#)read.c	8.1 (Berkeley) 6/4/93";
 #else
-__RCSID("$NetBSD: read.c,v 1.76 2016/02/12 15:36:08 christos Exp $");
+__RCSID("$NetBSD: read.c,v 1.77 2016/02/14 14:47:48 christos Exp $");
 #endif
 #endif /* not lint && not SCCSID */
 
@@ -337,10 +337,9 @@ read_char(EditLine *el, Char *cp)
 		return 0;
 	}
 
-#ifdef WIDECHAR
-	do {
+	for (;;) {
 		mbstate_t mbs;
-again_lastbyte:
+
 		++cbp;
 		/* This only works because UTF8 is stateless */
 		memset(&mbs, 0, sizeof(mbs));
@@ -353,7 +352,7 @@ again_lastbyte:
 				 */
 				cbuf[0] = cbuf[cbp - 1];
 				cbp = 0;
-				goto again_lastbyte;
+				break;
 			} else {
 				/* Invalid byte, discard it. */
 				cbp = 0;
@@ -375,14 +374,9 @@ again_lastbyte:
 			goto again;
 		default:
 			/* Valid character, process it. */
-			break;
+			return 1;
 		}
-	} while (/*CONSTCOND*/0);
-#else
-	*cp = (Char)(unsigned char)cbuf[0];
-#endif
-
-	return 1;
+	}
 }
 
 /* read_pop():

Reply via email to