Module Name: src Committed By: christos Date: Tue Apr 19 19:50:53 UTC 2016
Modified Files: src/lib/libedit: el.c el.h histedit.h read.c read.h Log Message: >From Ingo Schwarze: - Put the data type el_rfunc_t into the public header <histedit.h>. - Make el_read in struct editline an opaque pointer rather than an embedded struct. - Do not include "read.h" everywhere, but only in the two files needing access to el_read, read.c and el.c. - To functions that don't need more, pass the struct el_read_t * rather than the full EditLine *. - Of course, that means that read_init() can now fail from memory exhaustion, but it's easy to clean up after that. To generate a diff of this commit: cvs rdiff -u -r1.88 -r1.89 src/lib/libedit/el.c cvs rdiff -u -r1.37 -r1.38 src/lib/libedit/el.h cvs rdiff -u -r1.55 -r1.56 src/lib/libedit/histedit.h cvs rdiff -u -r1.94 -r1.95 src/lib/libedit/read.c cvs rdiff -u -r1.9 -r1.10 src/lib/libedit/read.h 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/el.c diff -u src/lib/libedit/el.c:1.88 src/lib/libedit/el.c:1.89 --- src/lib/libedit/el.c:1.88 Mon Apr 11 14:56:31 2016 +++ src/lib/libedit/el.c Tue Apr 19 15:50:53 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: el.c,v 1.88 2016/04/11 18:56:31 christos Exp $ */ +/* $NetBSD: el.c,v 1.89 2016/04/19 19:50:53 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.88 2016/04/11 18:56:31 christos Exp $"); +__RCSID("$NetBSD: el.c,v 1.89 2016/04/19 19:50:53 christos Exp $"); #endif #endif /* not lint && not SCCSID */ @@ -55,6 +55,7 @@ __RCSID("$NetBSD: el.c,v 1.88 2016/04/11 #include "el.h" #include "parse.h" +#include "read.h" /* el_init(): * Initialize editline and set default parameters. @@ -114,8 +115,10 @@ el_init_fd(const char *prog, FILE *fin, (void) hist_init(el); (void) prompt_init(el); (void) sig_init(el); - (void) read_init(el); - + if (read_init(el) == -1) { + el_end(el); + return NULL; + } return el; } @@ -303,7 +306,7 @@ el_wset(EditLine *el, int op, ...) case EL_GETCFN: { el_rfunc_t rc = va_arg(ap, el_rfunc_t); - rv = el_read_setfn(el, rc); + rv = el_read_setfn(el->el_read, rc); break; } @@ -442,7 +445,7 @@ el_wget(EditLine *el, int op, ...) } case EL_GETCFN: - *va_arg(ap, el_rfunc_t *) = el_read_getfn(el); + *va_arg(ap, el_rfunc_t *) = el_read_getfn(el->el_read); rv = 0; break; Index: src/lib/libedit/el.h diff -u src/lib/libedit/el.h:1.37 src/lib/libedit/el.h:1.38 --- src/lib/libedit/el.h:1.37 Mon Apr 18 13:01:19 2016 +++ src/lib/libedit/el.h Tue Apr 19 15:50:53 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: el.h,v 1.37 2016/04/18 17:01:19 christos Exp $ */ +/* $NetBSD: el.h,v 1.38 2016/04/19 19:50:53 christos Exp $ */ /*- * Copyright (c) 1992, 1993 @@ -102,7 +102,8 @@ typedef struct el_state_t { #include "hist.h" #include "map.h" #include "sig.h" -#include "read.h" + +struct el_read_t; struct editline { wchar_t *el_prog; /* the program name */ @@ -131,7 +132,7 @@ struct editline { el_history_t el_history; /* History stuff */ el_search_t el_search; /* Search stuff */ el_signal_t el_signal; /* Signal handling stuff */ - el_read_t el_read; /* Character reading stuff */ + struct el_read_t *el_read; /* Character reading stuff */ 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/histedit.h diff -u src/lib/libedit/histedit.h:1.55 src/lib/libedit/histedit.h:1.56 --- src/lib/libedit/histedit.h:1.55 Wed Feb 17 14:47:49 2016 +++ src/lib/libedit/histedit.h Tue Apr 19 15:50:53 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: histedit.h,v 1.55 2016/02/17 19:47:49 christos Exp $ */ +/* $NetBSD: histedit.h,v 1.56 2016/04/19 19:50:53 christos Exp $ */ /*- * Copyright (c) 1992, 1993 @@ -261,6 +261,8 @@ typedef struct lineinfow { const wchar_t *lastchar; } LineInfoW; +typedef int (*el_rfunc_t)(EditLine *, wchar_t *); + const wchar_t *el_wgets(EditLine *, int *); int el_wgetc(EditLine *, wchar_t *); void el_wpush(EditLine *, const wchar_t *); Index: src/lib/libedit/read.c diff -u src/lib/libedit/read.c:1.94 src/lib/libedit/read.c:1.95 --- src/lib/libedit/read.c:1.94 Mon Apr 18 13:01:19 2016 +++ src/lib/libedit/read.c Tue Apr 19 15:50:53 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: read.c,v 1.94 2016/04/18 17:01:19 christos Exp $ */ +/* $NetBSD: read.c,v 1.95 2016/04/19 19:50:53 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.94 2016/04/18 17:01:19 christos Exp $"); +__RCSID("$NetBSD: read.c,v 1.95 2016/04/19 19:50:53 christos Exp $"); #endif #endif /* not lint && not SCCSID */ @@ -55,6 +55,11 @@ __RCSID("$NetBSD: read.c,v 1.94 2016/04/ #include "el.h" #include "fcns.h" +#include "read.h" + +struct el_read_t { + el_rfunc_t read_char; /* Function to read a character. */ +}; static int read__fixio(int, int); static int read_char(EditLine *, wchar_t *); @@ -67,8 +72,10 @@ static void read_pop(c_macro_t *); protected int read_init(EditLine *el) { + if ((el->el_read = el_malloc(sizeof(*el->el_read))) == NULL) + return -1; /* builtin read_char */ - el->el_read.read_char = read_char; + el->el_read->read_char = read_char; return 0; } @@ -78,9 +85,9 @@ read_init(EditLine *el) * If it is set to EL_BUILTIN_GETCFN, then reset to the builtin one. */ protected int -el_read_setfn(EditLine *el, el_rfunc_t rc) +el_read_setfn(struct el_read_t *el_read, el_rfunc_t rc) { - el->el_read.read_char = (rc == EL_BUILTIN_GETCFN) ? read_char : rc; + el_read->read_char = (rc == EL_BUILTIN_GETCFN) ? read_char : rc; return 0; } @@ -90,10 +97,10 @@ el_read_setfn(EditLine *el, el_rfunc_t r * if it is the default one */ protected el_rfunc_t -el_read_getfn(EditLine *el) +el_read_getfn(struct el_read_t *el_read) { - return el->el_read.read_char == read_char ? - EL_BUILTIN_GETCFN : el->el_read.read_char; + return el_read->read_char == read_char ? + EL_BUILTIN_GETCFN : el_read->read_char; } @@ -390,7 +397,7 @@ el_wgetc(EditLine *el, wchar_t *cp) #ifdef DEBUG_READ (void) fprintf(el->el_errfile, "Reading a character\n"); #endif /* DEBUG_READ */ - num_read = (*el->el_read.read_char)(el, cp); + num_read = (*el->el_read->read_char)(el, cp); if (num_read < 0) el->el_errno = errno; #ifdef DEBUG_READ @@ -448,7 +455,7 @@ el_wgets(EditLine *el, int *nread) size_t idx; cp = el->el_line.buffer; - while ((num = (*el->el_read.read_char)(el, &wc)) == 1) { + while ((num = (*el->el_read->read_char)(el, &wc)) == 1) { *cp = wc; /* make sure there is space for next character */ if (cp + 1 >= el->el_line.limit) { @@ -501,7 +508,7 @@ el_wgets(EditLine *el, int *nread) terminal__flush(el); - while ((num = (*el->el_read.read_char)(el, &wc)) == 1) { + while ((num = (*el->el_read->read_char)(el, &wc)) == 1) { *cp = wc; /* make sure there is space next character */ if (cp + 1 >= el->el_line.limit) { Index: src/lib/libedit/read.h diff -u src/lib/libedit/read.h:1.9 src/lib/libedit/read.h:1.10 --- src/lib/libedit/read.h:1.9 Wed Feb 24 12:13:22 2016 +++ src/lib/libedit/read.h Tue Apr 19 15:50:53 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: read.h,v 1.9 2016/02/24 17:13:22 christos Exp $ */ +/* $NetBSD: read.h,v 1.10 2016/04/19 19:50:53 christos Exp $ */ /*- * Copyright (c) 2001 The NetBSD Foundation, Inc. @@ -35,16 +35,10 @@ #ifndef _h_el_read #define _h_el_read -typedef int (*el_rfunc_t)(EditLine *, wchar_t *); - -typedef struct el_read_t { - el_rfunc_t read_char; /* Function to read a character */ -} el_read_t; - protected int read_init(EditLine *); protected void read_prepare(EditLine *); protected void read_finish(EditLine *); -protected int el_read_setfn(EditLine *, el_rfunc_t); -protected el_rfunc_t el_read_getfn(EditLine *); +protected int el_read_setfn(struct el_read_t *, el_rfunc_t); +protected el_rfunc_t el_read_getfn(struct el_read_t *); #endif /* _h_el_read */