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)