Module Name:    src
Committed By:   christos
Date:           Sat Aug 28 15:44:59 UTC 2010

Modified Files:
        src/lib/libedit: chared.c chared.h el.c eln.c histedit.h readline.c

Log Message:
setup a callback to be invoked on resize buffers so that readline can
reset rl_line_buffer which unfortunately some applications use it directly.


To generate a diff of this commit:
cvs rdiff -u -r1.28 -r1.29 src/lib/libedit/chared.c
cvs rdiff -u -r1.20 -r1.21 src/lib/libedit/chared.h
cvs rdiff -u -r1.59 -r1.60 src/lib/libedit/el.c
cvs rdiff -u -r1.7 -r1.8 src/lib/libedit/eln.c
cvs rdiff -u -r1.46 -r1.47 src/lib/libedit/histedit.h
cvs rdiff -u -r1.90 -r1.91 src/lib/libedit/readline.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/chared.c
diff -u src/lib/libedit/chared.c:1.28 src/lib/libedit/chared.c:1.29
--- src/lib/libedit/chared.c:1.28	Wed Dec 30 17:37:40 2009
+++ src/lib/libedit/chared.c	Sat Aug 28 11:44:59 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: chared.c,v 1.28 2009/12/30 22:37:40 christos Exp $	*/
+/*	$NetBSD: chared.c,v 1.29 2010/08/28 15:44:59 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -37,7 +37,7 @@
 #if 0
 static char sccsid[] = "@(#)chared.c	8.1 (Berkeley) 6/4/93";
 #else
-__RCSID("$NetBSD: chared.c,v 1.28 2009/12/30 22:37:40 christos Exp $");
+__RCSID("$NetBSD: chared.c,v 1.29 2010/08/28 15:44:59 christos Exp $");
 #endif
 #endif /* not lint && not SCCSID */
 
@@ -489,6 +489,8 @@
 	    sizeof(*el->el_chared.c_kill.buf));
 	el->el_chared.c_kill.mark	= el->el_line.buffer;
 	el->el_chared.c_kill.last	= el->el_chared.c_kill.buf;
+	el->el_chared.c_resizefun	= NULL;
+	el->el_chared.c_resizearg	= NULL;
 
 	el->el_map.current		= el->el_map.key;
 
@@ -629,6 +631,8 @@
 
 	/* Safe to set enlarged buffer size */
 	el->el_line.limit  = &el->el_line.buffer[newsz - EL_LEAVE];
+	if (el->el_chared.c_resizefun)
+		(*el->el_chared.c_resizefun)(el, el->el_chared.c_resizearg);
 	return 1;
 }
 
@@ -782,3 +786,11 @@
 		return (int)(el->el_line.cursor - ptr - 1);
 	}
 }
+
+protected int
+ch_resizefun(EditLine *el, el_zfunc_t f, void *a)
+{
+	el->el_chared.c_resizefun = f;
+	el->el_chared.c_resizearg = a;
+	return 0;
+}

Index: src/lib/libedit/chared.h
diff -u src/lib/libedit/chared.h:1.20 src/lib/libedit/chared.h:1.21
--- src/lib/libedit/chared.h:1.20	Wed Apr 14 20:57:33 2010
+++ src/lib/libedit/chared.h	Sat Aug 28 11:44:59 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: chared.h,v 1.20 2010/04/15 00:57:33 christos Exp $	*/
+/*	$NetBSD: chared.h,v 1.21 2010/08/28 15:44:59 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -103,6 +103,8 @@
 	Char	*mark;
 } c_kill_t;
 
+typedef void (*el_zfunc_t)(EditLine *, void *);
+
 /*
  * Note that we use both data structures because the user can bind
  * commands from both editors!
@@ -113,6 +115,8 @@
 	c_redo_t	c_redo;
 	c_vcmd_t	c_vcmd;
 	c_macro_t	c_macro;
+	el_zfunc_t	c_resizefun;
+	void *		c_resizearg;
 } el_chared_t;
 
 
@@ -160,6 +164,7 @@
 
 protected int	 ch_init(EditLine *);
 protected void	 ch_reset(EditLine *, int);
+protected int	 ch_resizefun(EditLine *, el_zfunc_t, void *);
 protected int	 ch_enlargebufs(EditLine *, size_t);
 protected void	 ch_end(EditLine *);
 

Index: src/lib/libedit/el.c
diff -u src/lib/libedit/el.c:1.59 src/lib/libedit/el.c:1.60
--- src/lib/libedit/el.c:1.59	Wed Apr 14 20:56:40 2010
+++ src/lib/libedit/el.c	Sat Aug 28 11:44:59 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: el.c,v 1.59 2010/04/15 00:56:40 christos Exp $	*/
+/*	$NetBSD: el.c,v 1.60 2010/08/28 15:44:59 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.59 2010/04/15 00:56:40 christos Exp $");
+__RCSID("$NetBSD: el.c,v 1.60 2010/08/28 15:44:59 christos Exp $");
 #endif
 #endif /* not lint && not SCCSID */
 
@@ -177,6 +177,13 @@
 		break;
 	}
 
+	case EL_RESIZE: {
+		el_zfunc_t p = va_arg(ap, el_zfunc_t);
+		void *arg = va_arg(ap, void *);
+		rv = ch_resizefun(el, p, arg);
+		break;
+	}
+
 	case EL_PROMPT_ESC:
 	case EL_RPROMPT_ESC: {
 		el_pfunc_t p = va_arg(ap, el_pfunc_t);

Index: src/lib/libedit/eln.c
diff -u src/lib/libedit/eln.c:1.7 src/lib/libedit/eln.c:1.8
--- src/lib/libedit/eln.c:1.7	Wed Apr 14 20:52:48 2010
+++ src/lib/libedit/eln.c	Sat Aug 28 11:44:59 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: eln.c,v 1.7 2010/04/15 00:52:48 christos Exp $	*/
+/*	$NetBSD: eln.c,v 1.8 2010/08/28 15:44:59 christos Exp $	*/
 
 /*-
  * Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 #include "config.h"
 #if !defined(lint) && !defined(SCCSID)
-__RCSID("$NetBSD: eln.c,v 1.7 2010/04/15 00:52:48 christos Exp $");
+__RCSID("$NetBSD: eln.c,v 1.8 2010/08/28 15:44:59 christos Exp $");
 #endif /* not lint && not SCCSID */
 
 #include "histedit.h"
@@ -118,6 +118,13 @@
 		break;
 	}
 
+	case EL_RESIZE: {
+		el_zfunc_t p = va_arg(ap, el_zfunc_t);
+		void *arg = va_arg(ap, void *);
+		ret = ch_resizefun(el, p, arg);
+		break;
+	}
+
 	case EL_TERMINAL:       /* const char * */
 		ret = el_wset(el, op, va_arg(ap, char *));
 		break;

Index: src/lib/libedit/histedit.h
diff -u src/lib/libedit/histedit.h:1.46 src/lib/libedit/histedit.h:1.47
--- src/lib/libedit/histedit.h:1.46	Wed Apr 14 20:50:03 2010
+++ src/lib/libedit/histedit.h	Sat Aug 28 11:44:59 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: histedit.h,v 1.46 2010/04/15 00:50:03 christos Exp $	*/
+/*	$NetBSD: histedit.h,v 1.47 2010/08/28 15:44:59 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -155,6 +155,7 @@
 #define	EL_REFRESH	20	/* , void);			      set     */
 #define	EL_PROMPT_ESC	21	/* , prompt_func, Char);	      set/get */
 #define	EL_RPROMPT_ESC	22	/* , prompt_func, Char);	      set/get */
+#define	EL_RESIZE	23	/* , el_zfunc_t, void *);	      set     */
 
 #define	EL_BUILTIN_GETCFN	(NULL)
 

Index: src/lib/libedit/readline.c
diff -u src/lib/libedit/readline.c:1.90 src/lib/libedit/readline.c:1.91
--- src/lib/libedit/readline.c:1.90	Wed Aug  4 16:29:18 2010
+++ src/lib/libedit/readline.c	Sat Aug 28 11:44:59 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: readline.c,v 1.90 2010/08/04 20:29:18 christos Exp $	*/
+/*	$NetBSD: readline.c,v 1.91 2010/08/28 15:44:59 christos Exp $	*/
 
 /*-
  * Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include "config.h"
 #if !defined(lint) && !defined(SCCSID)
-__RCSID("$NetBSD: readline.c,v 1.90 2010/08/04 20:29:18 christos Exp $");
+__RCSID("$NetBSD: readline.c,v 1.91 2010/08/28 15:44:59 christos Exp $");
 #endif /* not lint && not SCCSID */
 
 #include <sys/types.h>
@@ -220,6 +220,17 @@
 	return 1;
 }
 
+static void
+_resize_fun(EditLine *el, void *a)
+{
+	const LineInfo *li;
+	char **ap = a;
+
+	li = el_line(el);
+	/* a cheesy way to get rid of const cast. */
+	*ap = memchr(li->buffer, *li->buffer, 1);
+}
+
 static const char _dothistory[] = "/.history";
 
 static const char *
@@ -272,7 +283,6 @@
 rl_initialize(void)
 {
 	TYPE(HistEvent) ev;
-	const LineInfo *li;
 	int editmode = 1;
 	struct termios t;
 
@@ -306,6 +316,9 @@
 	max_input_history = INT_MAX;
 	el_set(e, EL_HIST, history, h);
 
+	/* Setup resize function */
+	el_set(e, EL_RESIZE, _resize_fun, &rl_line_buffer);
+
 	/* setup getc function if valid */
 	if (rl_getc_function)
 		el_set(e, EL_GETCFN, _getc_function);
@@ -351,9 +364,7 @@
 	 * Unfortunately, some applications really do use rl_point
 	 * and rl_line_buffer directly.
 	 */
-	li = el_line(e);
-	/* a cheesy way to get rid of const cast. */
-	rl_line_buffer = memchr(li->buffer, *li->buffer, 1);
+	_resize_fun(e, &rl_line_buffer);
 	_rl_update_pos();
 
 	if (rl_startup_hook)

Reply via email to