Module Name:    src
Committed By:   rin
Date:           Fri Nov 10 18:08:11 UTC 2017

Modified Files:
        src/external/bsd/nvi/dist/common: conv.c

Log Message:
Restore the initial state at the end of line.
This matters for stateful encodings like iso-2022-jp.
Fix taken from yamt via nvi2.


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/external/bsd/nvi/dist/common/conv.c

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

Modified files:

Index: src/external/bsd/nvi/dist/common/conv.c
diff -u src/external/bsd/nvi/dist/common/conv.c:1.5 src/external/bsd/nvi/dist/common/conv.c:1.6
--- src/external/bsd/nvi/dist/common/conv.c:1.5	Mon Nov  6 03:02:22 2017
+++ src/external/bsd/nvi/dist/common/conv.c	Fri Nov 10 18:08:11 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: conv.c,v 1.5 2017/11/06 03:02:22 rin Exp $ */
+/*	$NetBSD: conv.c,v 1.6 2017/11/10 18:08:11 rin Exp $ */
 /*-
  * Copyright (c) 1993, 1994
  *	The Regents of the University of California.  All rights reserved.
@@ -16,7 +16,7 @@
 static const char sccsid[] = "Id: conv.c,v 1.27 2001/08/18 21:41:41 skimo Exp  (Berkeley) Date: 2001/08/18 21:41:41 ";
 #endif /* not lint */
 #else
-__RCSID("$NetBSD: conv.c,v 1.5 2017/11/06 03:02:22 rin Exp $");
+__RCSID("$NetBSD: conv.c,v 1.6 2017/11/10 18:08:11 rin Exp $");
 #endif
 
 #include <sys/types.h>
@@ -260,10 +260,11 @@ default_int2char(SCR *sp, const CHAR_T *
  * cw->bp is grown as required
  */
 #ifdef USE_ICONV
-#define CONVERT2(len, cw, offset)					\
+#define CONVERT2(_buffer, lenp, cw, offset)				\
     do {								\
-	const char *bp = buffer;					\
-	while (len != 0) {						\
+	const char *bp = _buffer;					\
+	size_t ret;							\
+	do {								\
 	    size_t outleft = cw->blen1 - offset;			\
 	    char *obp = (char *)cw->bp1 + offset;		    	\
 	    if (cw->blen1 < offset + MB_CUR_MAX) {		    	\
@@ -271,14 +272,14 @@ default_int2char(SCR *sp, const CHAR_T *
 		BINC_RETC(NULL, cw->bp1, cw->blen1, nlen);		\
 	    }						    		\
 	    errno = 0;						    	\
-	    if (iconv(id, &bp, &len, &obp, &outleft) == (size_t)-1 &&	\
-		errno != E2BIG) 					\
+	    ret = iconv(id, &bp, lenp, &obp, &outleft);			\
+	    if (ret == (size_t)-1 && errno != E2BIG) 			\
 		    HANDLE_ICONV_ERROR(obp, bp, outleft, len);		\
 	    offset = cw->blen1 - outleft;			        \
-	}							        \
+	} while (ret != 0);					        \
     } while (0)
 #else
-#define CONVERT2(len, cw, offset)
+#define CONVERT2(_buffer, lenp, cw, offset)
 #endif
 
 
@@ -304,7 +305,7 @@ default_int2char(SCR *sp, const CHAR_T *
 	j += n;
 	if (buflen < j + MB_CUR_MAX) {
 	    if (id != (iconv_t)-1) {
-		CONVERT2(j, cw, offset);
+		CONVERT2(buffer, &j, cw, offset);
 	    } else {
 		nlen += 256;
 		BINC_RETC(NULL, *tostr, *blen, nlen);
@@ -318,7 +319,8 @@ default_int2char(SCR *sp, const CHAR_T *
     *tolen = j;
 
     if (id != (iconv_t)-1) {
-	CONVERT2(j, cw, offset);
+	CONVERT2(buffer, &j, cw, offset);
+	CONVERT2(NULL, NULL, cw, offset);  /* back to the initial state */
 	*tolen = offset;
     }
 

Reply via email to