Module Name:    src
Committed By:   christos
Date:           Mon May  2 16:48:34 UTC 2016

Modified Files:
        src/lib/libedit: chartype.c chartype.h el.c el.h terminal.c

Log Message:
eliminate static buffer with custom resizing code.


To generate a diff of this commit:
cvs rdiff -u -r1.28 -r1.29 src/lib/libedit/chartype.c
cvs rdiff -u -r1.32 -r1.33 src/lib/libedit/chartype.h
cvs rdiff -u -r1.89 -r1.90 src/lib/libedit/el.c
cvs rdiff -u -r1.38 -r1.39 src/lib/libedit/el.h
cvs rdiff -u -r1.30 -r1.31 src/lib/libedit/terminal.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.28 src/lib/libedit/chartype.c:1.29
--- src/lib/libedit/chartype.c:1.28	Mon Apr 11 14:56:31 2016
+++ src/lib/libedit/chartype.c	Mon May  2 12:48:34 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: chartype.c,v 1.28 2016/04/11 18:56:31 christos Exp $	*/
+/*	$NetBSD: chartype.c,v 1.29 2016/05/02 16:48:34 christos Exp $	*/
 
 /*-
  * Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
  */
 #include "config.h"
 #if !defined(lint) && !defined(SCCSID)
-__RCSID("$NetBSD: chartype.c,v 1.28 2016/04/11 18:56:31 christos Exp $");
+__RCSID("$NetBSD: chartype.c,v 1.29 2016/05/02 16:48:34 christos Exp $");
 #endif /* not lint && not SCCSID */
 
 #include <ctype.h>
@@ -211,51 +211,44 @@ ct_encode_char(char *dst, size_t len, wc
 }
 
 protected const wchar_t *
-ct_visual_string(const wchar_t *s)
+ct_visual_string(const wchar_t *s, ct_buffer_t *conv)
 {
-	static wchar_t *buff = NULL;
-	static size_t buffsize = 0;
-	void *p;
 	wchar_t *dst;
-	ssize_t used = 0;
+	ssize_t used;
 
 	if (!s)
 		return NULL;
-	if (!buff) {
-	    buffsize = CT_BUFSIZ;
-	    buff = el_malloc(buffsize * sizeof(*buff));
-	}
-	dst = buff;
+
+	if (ct_conv_wbuff_resize(conv, CT_BUFSIZ) == -1)
+		return NULL;
+
+	used = 0;
+	dst = conv->wbuff;
 	while (*s) {
-		used = ct_visual_char(dst, buffsize - (size_t)(dst - buff), *s);
-		if (used == -1) { /* failed to encode, need more buffer space */
-			used = dst - buff;
-			buffsize += CT_BUFSIZ;
-			p = el_realloc(buff, buffsize * sizeof(*buff));
-			if (p == NULL)
-				goto out;
-			buff = p;
-			dst = buff + used;
-			/* don't increment s here - we want to retry it! */
+		used = ct_visual_char(dst,
+		    conv->wsize - (size_t)(dst - conv->wbuff), *s);
+		if (used != -1) {
+			++s;
+			dst += used;
+			continue;
 		}
-		else
-		    ++s;
-		dst += used;
+
+		/* failed to encode, need more buffer space */
+		used = dst - conv->wbuff;
+		if (ct_conv_wbuff_resize(conv, conv->wsize + CT_BUFSIZ) == -1)
+			return NULL;
+		dst = conv->wbuff + used;
 	}
-	if (dst >= (buff + buffsize)) { /* sigh */
-		buffsize += 1;
-		p = el_realloc(buff, buffsize * sizeof(*buff));
-		if (p == NULL)
-			goto out;
-		buff = p;
-		dst = buff + buffsize - 1;
+
+	if (dst >= (conv->wbuff + conv->wsize)) { /* sigh */
+		used = dst - conv->wbuff;
+		if (ct_conv_wbuff_resize(conv, conv->wsize + CT_BUFSIZ) == -1)
+			return NULL;
+		dst = conv->wbuff + used;
 	}
-	*dst = 0;
-	return buff;
-out:
-	el_free(buff);
-	buffsize = 0;
-	return NULL;
+
+	*dst = L'\0';
+	return conv->wbuff;
 }
 
 

Index: src/lib/libedit/chartype.h
diff -u src/lib/libedit/chartype.h:1.32 src/lib/libedit/chartype.h:1.33
--- src/lib/libedit/chartype.h:1.32	Mon May  2 12:35:17 2016
+++ src/lib/libedit/chartype.h	Mon May  2 12:48:34 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: chartype.h,v 1.32 2016/05/02 16:35:17 christos Exp $	*/
+/*	$NetBSD: chartype.h,v 1.33 2016/05/02 16:48:34 christos Exp $	*/
 
 /*-
  * Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -95,7 +95,7 @@ protected ssize_t ct_visual_char(wchar_t
 
 /* Convert the given string into visual format, using the ct_visual_char()
  * function. Uses a static buffer, so not threadsafe. */
-protected const wchar_t *ct_visual_string(const wchar_t *);
+protected const wchar_t *ct_visual_string(const wchar_t *, ct_buffer_t *);
 
 
 /* printable character, use ct_visual_width() to find out display width */

Index: src/lib/libedit/el.c
diff -u src/lib/libedit/el.c:1.89 src/lib/libedit/el.c:1.90
--- src/lib/libedit/el.c:1.89	Tue Apr 19 15:50:53 2016
+++ src/lib/libedit/el.c	Mon May  2 12:48:34 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: el.c,v 1.89 2016/04/19 19:50:53 christos Exp $	*/
+/*	$NetBSD: el.c,v 1.90 2016/05/02 16:48:34 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -37,7 +37,7 @@
 #if 0
 static char sccsid[] = "@(#)el.c	8.2 (Berkeley) 1/3/94";
 #else
-__RCSID("$NetBSD: el.c,v 1.89 2016/04/19 19:50:53 christos Exp $");
+__RCSID("$NetBSD: el.c,v 1.90 2016/05/02 16:48:34 christos Exp $");
 #endif
 #endif /* not lint && not SCCSID */
 
@@ -147,6 +147,8 @@ el_end(EditLine *el)
 	sig_end(el);
 
 	el_free(el->el_prog);
+	el_free(el->el_visual.cbuff);
+	el_free(el->el_visual.wbuff);
 	el_free(el->el_scratch.cbuff);
 	el_free(el->el_scratch.wbuff);
 	el_free(el->el_lgcyconv.cbuff);

Index: src/lib/libedit/el.h
diff -u src/lib/libedit/el.h:1.38 src/lib/libedit/el.h:1.39
--- src/lib/libedit/el.h:1.38	Tue Apr 19 15:50:53 2016
+++ src/lib/libedit/el.h	Mon May  2 12:48:34 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: el.h,v 1.38 2016/04/19 19:50:53 christos Exp $	*/
+/*	$NetBSD: el.h,v 1.39 2016/05/02 16:48:34 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -133,6 +133,7 @@ struct editline {
 	el_search_t	  el_search;	/* Search stuff			*/
 	el_signal_t	  el_signal;	/* Signal handling stuff	*/
 	struct el_read_t *el_read;	/* Character reading stuff	*/
+	ct_buffer_t       el_visual;    /* Buffer for displayable str	*/
 	ct_buffer_t       el_scratch;   /* Scratch conversion buffer    */
 	ct_buffer_t       el_lgcyconv;  /* Buffer for legacy wrappers   */
 	LineInfo          el_lgcylinfo; /* Legacy LineInfo buffer       */

Index: src/lib/libedit/terminal.c
diff -u src/lib/libedit/terminal.c:1.30 src/lib/libedit/terminal.c:1.31
--- src/lib/libedit/terminal.c:1.30	Mon Apr 18 13:01:19 2016
+++ src/lib/libedit/terminal.c	Mon May  2 12:48:34 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: terminal.c,v 1.30 2016/04/18 17:01:19 christos Exp $	*/
+/*	$NetBSD: terminal.c,v 1.31 2016/05/02 16:48:34 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -37,7 +37,7 @@
 #if 0
 static char sccsid[] = "@(#)term.c	8.2 (Berkeley) 4/30/95";
 #else
-__RCSID("$NetBSD: terminal.c,v 1.30 2016/04/18 17:01:19 christos Exp $");
+__RCSID("$NetBSD: terminal.c,v 1.31 2016/05/02 16:48:34 christos Exp $");
 #endif
 #endif /* not lint && not SCCSID */
 
@@ -1316,8 +1316,8 @@ terminal_telltc(EditLine *el, int argc _
 		const char *ub;
 		if (*ts && **ts) {
 			ub = ct_encode_string(ct_visual_string(
-			    ct_decode_string(*ts, &el->el_scratch)),
-			    &el->el_scratch);
+			    ct_decode_string(*ts, &el->el_scratch),
+			    &el->el_visual), &el->el_scratch);
 		} else {
 			ub = "(empty)";
 		}

Reply via email to