svn commit: r352134 - in vendor/NetBSD/libedit/dist: . TEST readline
Baptiste Daroussin
bapt at FreeBSD.org
Tue Sep 10 13:55:47 UTC 2019
Author: bapt
Date: Tue Sep 10 13:55:44 2019
New Revision: 352134
URL: https://svnweb.freebsd.org/changeset/base/352134
Log:
Update libedit to snapshot 2019-09-10
Added:
vendor/NetBSD/libedit/dist/TEST/test_filecompletion.c (contents, props changed)
Modified:
vendor/NetBSD/libedit/dist/TEST/Makefile
vendor/NetBSD/libedit/dist/chared.c
vendor/NetBSD/libedit/dist/chartype.c
vendor/NetBSD/libedit/dist/common.c
vendor/NetBSD/libedit/dist/editline.3
vendor/NetBSD/libedit/dist/el.c
vendor/NetBSD/libedit/dist/el.h
vendor/NetBSD/libedit/dist/eln.c
vendor/NetBSD/libedit/dist/filecomplete.c
vendor/NetBSD/libedit/dist/hist.c
vendor/NetBSD/libedit/dist/history.c
vendor/NetBSD/libedit/dist/keymacro.c
vendor/NetBSD/libedit/dist/literal.c
vendor/NetBSD/libedit/dist/map.c
vendor/NetBSD/libedit/dist/parse.c
vendor/NetBSD/libedit/dist/read.c
vendor/NetBSD/libedit/dist/readline.c
vendor/NetBSD/libedit/dist/readline/readline.h
vendor/NetBSD/libedit/dist/refresh.c
vendor/NetBSD/libedit/dist/search.c
vendor/NetBSD/libedit/dist/terminal.c
vendor/NetBSD/libedit/dist/tty.c
vendor/NetBSD/libedit/dist/tty.h
vendor/NetBSD/libedit/dist/vi.c
Modified: vendor/NetBSD/libedit/dist/TEST/Makefile
==============================================================================
--- vendor/NetBSD/libedit/dist/TEST/Makefile Tue Sep 10 09:57:24 2019 (r352133)
+++ vendor/NetBSD/libedit/dist/TEST/Makefile Tue Sep 10 13:55:44 2019 (r352134)
@@ -1,7 +1,7 @@
-# $NetBSD: Makefile,v 1.7 2016/03/23 22:27:48 christos Exp $
+# $NetBSD: Makefile,v 1.8 2017/10/15 18:59:00 abhinav Exp $
NOMAN=1
-PROG=wtc1
+PROG=wtc1 test_filecompletion
CPPFLAGS=-I${.CURDIR}/..
LDADD+=-ledit -ltermlib
DPADD+=${LIBEDIT} ${LIBTERMLIB}
Added: vendor/NetBSD/libedit/dist/TEST/test_filecompletion.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ vendor/NetBSD/libedit/dist/TEST/test_filecompletion.c Tue Sep 10 13:55:44 2019 (r352134)
@@ -0,0 +1,553 @@
+/* $NetBSD: test_filecompletion.c,v 1.5 2019/09/08 05:50:58 abhinav Exp $ */
+
+/*-
+ * Copyright (c) 2017 Abhinav Upadhyay <abhinav at NetBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#include <assert.h>
+#include <err.h>
+#include <stdio.h>
+#include <histedit.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+
+#include "filecomplete.h"
+#include "el.h"
+
+typedef struct {
+ const wchar_t *user_typed_text; /* The actual text typed by the user on the terminal */
+ const char *completion_function_input ; /*the text received by fn_filename_completion_function */
+ const char *expanded_text[2]; /* the value to which completion_function_input should be expanded */
+ const wchar_t *escaped_output; /* expected escaped value of expanded_text */
+} test_input;
+
+static test_input inputs[] = {
+ {
+ /* simple test for escaping angular brackets */
+ L"ls ang",
+ "ang",
+ {"ang<ular>test", NULL},
+ L"ls ang\\<ular\\>test "
+ },
+ {
+ /* test angular bracket inside double quotes: ls "dq_ang */
+ L"ls \"dq_ang",
+ "dq_ang",
+ {"dq_ang<ular>test", NULL},
+ L"ls \"dq_ang<ular>test\""
+ },
+ {
+ /* test angular bracket inside singlq quotes: ls "sq_ang */
+ L"ls 'sq_ang",
+ "sq_ang",
+ {"sq_ang<ular>test", NULL},
+ L"ls 'sq_ang<ular>test'"
+ },
+ {
+ /* simple test for backslash */
+ L"ls back",
+ "back",
+ {"backslash\\test", NULL},
+ L"ls backslash\\\\test "
+ },
+ {
+ /* backslash inside single quotes */
+ L"ls 'sback",
+ "sback",
+ {"sbackslash\\test", NULL},
+ L"ls 'sbackslash\\test'"
+ },
+ {
+ /* backslash inside double quotes */
+ L"ls \"dback",
+ "dback",
+ {"dbackslash\\test", NULL},
+ L"ls \"dbackslash\\\\test\""
+ },
+ {
+ /* test braces */
+ L"ls br",
+ "br",
+ {"braces{test}", NULL},
+ L"ls braces\\{test\\} "
+ },
+ {
+ /* test braces inside single quotes */
+ L"ls 'sbr",
+ "sbr",
+ {"sbraces{test}", NULL},
+ L"ls 'sbraces{test}'"
+ },
+ {
+ /* test braces inside double quotes */
+ L"ls \"dbr",
+ "dbr",
+ {"dbraces{test}", NULL},
+ L"ls \"dbraces{test}\""
+ },
+ {
+ /* test dollar */
+ L"ls doll",
+ "doll",
+ {"doll$artest", NULL},
+ L"ls doll\\$artest "
+ },
+ {
+ /* test dollar inside single quotes */
+ L"ls 'sdoll",
+ "sdoll",
+ {"sdoll$artest", NULL},
+ L"ls 'sdoll$artest'"
+ },
+ {
+ /* test dollar inside double quotes */
+ L"ls \"ddoll",
+ "ddoll",
+ {"ddoll$artest", NULL},
+ L"ls \"ddoll\\$artest\""
+ },
+ {
+ /* test equals */
+ L"ls eq",
+ "eq",
+ {"equals==test", NULL},
+ L"ls equals\\=\\=test "
+ },
+ {
+ /* test equals inside sinqle quotes */
+ L"ls 'seq",
+ "seq",
+ {"sequals==test", NULL},
+ L"ls 'sequals==test'"
+ },
+ {
+ /* test equals inside double quotes */
+ L"ls \"deq",
+ "deq",
+ {"dequals==test", NULL},
+ L"ls \"dequals==test\""
+ },
+ {
+ /* test \n */
+ L"ls new",
+ "new",
+ {"new\\nline", NULL},
+ L"ls new\\\\nline "
+ },
+ {
+ /* test \n inside single quotes */
+ L"ls 'snew",
+ "snew",
+ {"snew\nline", NULL},
+ L"ls 'snew\nline'"
+ },
+ {
+ /* test \n inside double quotes */
+ L"ls \"dnew",
+ "dnew",
+ {"dnew\nline", NULL},
+ L"ls \"dnew\nline\""
+ },
+ {
+ /* test single space */
+ L"ls spac",
+ "spac",
+ {"space test", NULL},
+ L"ls space\\ test "
+ },
+ {
+ /* test single space inside singlq quotes */
+ L"ls 's_spac",
+ "s_spac",
+ {"s_space test", NULL},
+ L"ls 's_space test'"
+ },
+ {
+ /* test single space inside double quotes */
+ L"ls \"d_spac",
+ "d_spac",
+ {"d_space test", NULL},
+ L"ls \"d_space test\""
+ },
+ {
+ /* test multiple spaces */
+ L"ls multi",
+ "multi",
+ {"multi space test", NULL},
+ L"ls multi\\ space\\ \\ test "
+ },
+ {
+ /* test multiple spaces inside single quotes */
+ L"ls 's_multi",
+ "s_multi",
+ {"s_multi space test", NULL},
+ L"ls 's_multi space test'"
+ },
+ {
+ /* test multiple spaces inside double quotes */
+ L"ls \"d_multi",
+ "d_multi",
+ {"d_multi space test", NULL},
+ L"ls \"d_multi space test\""
+ },
+ {
+ /* test double quotes */
+ L"ls doub",
+ "doub",
+ {"doub\"quotes", NULL},
+ L"ls doub\\\"quotes "
+ },
+ {
+ /* test double quotes inside single quotes */
+ L"ls 's_doub",
+ "s_doub",
+ {"s_doub\"quotes", NULL},
+ L"ls 's_doub\"quotes'"
+ },
+ {
+ /* test double quotes inside double quotes */
+ L"ls \"d_doub",
+ "d_doub",
+ {"d_doub\"quotes", NULL},
+ L"ls \"d_doub\\\"quotes\""
+ },
+ {
+ /* test multiple double quotes */
+ L"ls mud",
+ "mud",
+ {"mud\"qu\"otes\"", NULL},
+ L"ls mud\\\"qu\\\"otes\\\" "
+ },
+ {
+ /* test multiple double quotes inside single quotes */
+ L"ls 'smud",
+ "smud",
+ {"smud\"qu\"otes\"", NULL},
+ L"ls 'smud\"qu\"otes\"'"
+ },
+ {
+ /* test multiple double quotes inside double quotes */
+ L"ls \"dmud",
+ "dmud",
+ {"dmud\"qu\"otes\"", NULL},
+ L"ls \"dmud\\\"qu\\\"otes\\\"\""
+ },
+ {
+ /* test one single quote */
+ L"ls sing",
+ "sing",
+ {"single'quote", NULL},
+ L"ls single\\'quote "
+ },
+ {
+ /* test one single quote inside single quote */
+ L"ls 'ssing",
+ "ssing",
+ {"ssingle'quote", NULL},
+ L"ls 'ssingle'\\''quote'"
+ },
+ {
+ /* test one single quote inside double quote */
+ L"ls \"dsing",
+ "dsing",
+ {"dsingle'quote", NULL},
+ L"ls \"dsingle'quote\""
+ },
+ {
+ /* test multiple single quotes */
+ L"ls mu_sing",
+ "mu_sing",
+ {"mu_single''quotes''", NULL},
+ L"ls mu_single\\'\\'quotes\\'\\' "
+ },
+ {
+ /* test multiple single quotes inside single quote */
+ L"ls 'smu_sing",
+ "smu_sing",
+ {"smu_single''quotes''", NULL},
+ L"ls 'smu_single'\\'''\\''quotes'\\\'''\\'''"
+ },
+ {
+ /* test multiple single quotes inside double quote */
+ L"ls \"dmu_sing",
+ "dmu_sing",
+ {"dmu_single''quotes''", NULL},
+ L"ls \"dmu_single''quotes''\""
+ },
+ {
+ /* test parenthesis */
+ L"ls paren",
+ "paren",
+ {"paren(test)", NULL},
+ L"ls paren\\(test\\) "
+ },
+ {
+ /* test parenthesis inside single quote */
+ L"ls 'sparen",
+ "sparen",
+ {"sparen(test)", NULL},
+ L"ls 'sparen(test)'"
+ },
+ {
+ /* test parenthesis inside double quote */
+ L"ls \"dparen",
+ "dparen",
+ {"dparen(test)", NULL},
+ L"ls \"dparen(test)\""
+ },
+ {
+ /* test pipe */
+ L"ls pip",
+ "pip",
+ {"pipe|test", NULL},
+ L"ls pipe\\|test "
+ },
+ {
+ /* test pipe inside single quote */
+ L"ls 'spip",
+ "spip",
+ {"spipe|test", NULL},
+ L"ls 'spipe|test'",
+ },
+ {
+ /* test pipe inside double quote */
+ L"ls \"dpip",
+ "dpip",
+ {"dpipe|test", NULL},
+ L"ls \"dpipe|test\""
+ },
+ {
+ /* test tab */
+ L"ls ta",
+ "ta",
+ {"tab\ttest", NULL},
+ L"ls tab\\\ttest "
+ },
+ {
+ /* test tab inside single quote */
+ L"ls 'sta",
+ "sta",
+ {"stab\ttest", NULL},
+ L"ls 'stab\ttest'"
+ },
+ {
+ /* test tab inside double quote */
+ L"ls \"dta",
+ "dta",
+ {"dtab\ttest", NULL},
+ L"ls \"dtab\ttest\""
+ },
+ {
+ /* test back tick */
+ L"ls tic",
+ "tic",
+ {"tick`test`", NULL},
+ L"ls tick\\`test\\` "
+ },
+ {
+ /* test back tick inside single quote */
+ L"ls 'stic",
+ "stic",
+ {"stick`test`", NULL},
+ L"ls 'stick`test`'"
+ },
+ {
+ /* test back tick inside double quote */
+ L"ls \"dtic",
+ "dtic",
+ {"dtick`test`", NULL},
+ L"ls \"dtick\\`test\\`\""
+ },
+ {
+ /* test for @ */
+ L"ls at",
+ "at",
+ {"atthe at rate", NULL},
+ L"ls atthe\\@rate "
+ },
+ {
+ /* test for @ inside single quote */
+ L"ls 'sat",
+ "sat",
+ {"satthe at rate", NULL},
+ L"ls 'satthe at rate'"
+ },
+ {
+ /* test for @ inside double quote */
+ L"ls \"dat",
+ "dat",
+ {"datthe at rate", NULL},
+ L"ls \"datthe at rate\""
+ },
+ {
+ /* test ; */
+ L"ls semi",
+ "semi",
+ {"semi;colon;test", NULL},
+ L"ls semi\\;colon\\;test "
+ },
+ {
+ /* test ; inside single quote */
+ L"ls 'ssemi",
+ "ssemi",
+ {"ssemi;colon;test", NULL},
+ L"ls 'ssemi;colon;test'"
+ },
+ {
+ /* test ; inside double quote */
+ L"ls \"dsemi",
+ "dsemi",
+ {"dsemi;colon;test", NULL},
+ L"ls \"dsemi;colon;test\""
+ },
+ {
+ /* test & */
+ L"ls amp",
+ "amp",
+ {"ampers&and", NULL},
+ L"ls ampers\\&and "
+ },
+ {
+ /* test & inside single quote */
+ L"ls 'samp",
+ "samp",
+ {"sampers&and", NULL},
+ L"ls 'sampers&and'"
+ },
+ {
+ /* test & inside double quote */
+ L"ls \"damp",
+ "damp",
+ {"dampers&and", NULL},
+ L"ls \"dampers&and\""
+ },
+ {
+ /* test completion when cursor at \ */
+ L"ls foo\\",
+ "foo",
+ {"foo bar", NULL},
+ L"ls foo\\ bar "
+ },
+ {
+ /* test completion when cursor at single quote */
+ L"ls foo'",
+ "foo'",
+ {"foo bar", NULL},
+ L"ls foo\\ bar "
+ },
+ {
+ /* test completion when cursor at double quote */
+ L"ls foo\"",
+ "foo\"",
+ {"foo bar", NULL},
+ L"ls foo\\ bar "
+ },
+ {
+ /* test multiple completion matches */
+ L"ls fo",
+ "fo",
+ {"foo bar", "foo baz"},
+ L"ls foo\\ ba"
+ },
+ {
+ L"ls ba",
+ "ba",
+ {"bar <bar>", "bar <baz>"},
+ L"ls bar\\ \\<ba"
+ }
+};
+
+static const wchar_t break_chars[] = L" \t\n\"\\'`@$><=;|&{(";
+
+/*
+ * Custom completion function passed to fn_complet, NULLe.
+ * The function returns hardcoded completion matches
+ * based on the test cases present in inputs[] (above)
+ */
+static char *
+mycomplet_func(const char *text, int index)
+{
+ static int last_index = 0;
+ size_t i = 0;
+ if (last_index == 2) {
+ last_index = 0;
+ return NULL;
+ }
+
+ for (i = 0; i < sizeof(inputs)/sizeof(inputs[0]); i++) {
+ if (strcmp(text, inputs[i].completion_function_input) == 0) {
+ if (inputs[i].expanded_text[last_index] != NULL)
+ return strdup(inputs[i].expanded_text[last_index++]);
+ else {
+ last_index = 0;
+ return NULL;
+ }
+ }
+ }
+
+ return NULL;
+}
+
+int
+main(int argc, char **argv)
+{
+ EditLine *el = el_init(argv[0], stdin, stdout, stderr);
+ size_t i;
+ size_t input_len;
+ el_line_t line;
+ wchar_t *buffer = malloc(64 * sizeof(*buffer));
+ if (buffer == NULL)
+ err(EXIT_FAILURE, "malloc failed");
+
+ for (i = 0; i < sizeof(inputs)/sizeof(inputs[0]); i++) {
+ memset(buffer, 0, 64 * sizeof(*buffer));
+ input_len = wcslen(inputs[i].user_typed_text);
+ wmemcpy(buffer, inputs[i].user_typed_text, input_len);
+ buffer[input_len] = 0;
+ line.buffer = buffer;
+ line.cursor = line.buffer + input_len ;
+ line.lastchar = line.cursor - 1;
+ line.limit = line.buffer + 64 * sizeof(*buffer);
+ el->el_line = line;
+ fn_complete(el, mycomplet_func, NULL, break_chars, NULL, NULL, 10, NULL, NULL, NULL, NULL);
+
+ /*
+ * fn_complete would have expanded and escaped the input in el->el_line.buffer.
+ * We need to assert that it matches with the expected value in our test data
+ */
+ printf("User input: %ls\t Expected output: %ls\t Generated output: %ls\n",
+ inputs[i].user_typed_text, inputs[i].escaped_output, el->el_line.buffer);
+ assert(wcscmp(el->el_line.buffer, inputs[i].escaped_output) == 0);
+ }
+ el_end(el);
+ return 0;
+
+}
Modified: vendor/NetBSD/libedit/dist/chared.c
==============================================================================
--- vendor/NetBSD/libedit/dist/chared.c Tue Sep 10 09:57:24 2019 (r352133)
+++ vendor/NetBSD/libedit/dist/chared.c Tue Sep 10 13:55:44 2019 (r352134)
@@ -1,4 +1,4 @@
-/* $NetBSD: chared.c,v 1.56 2016/05/22 19:44:26 christos Exp $ */
+/* $NetBSD: chared.c,v 1.59 2019/07/23 10:18:52 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.56 2016/05/22 19:44:26 christos Exp $");
+__RCSID("$NetBSD: chared.c,v 1.59 2019/07/23 10:18:52 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
@@ -174,7 +174,7 @@ c_delbefore(EditLine *el, int num)
wchar_t *cp;
for (cp = el->el_line.cursor - num;
- cp <= el->el_line.lastchar;
+ &cp[num] <= el->el_line.lastchar;
cp++)
*cp = cp[num];
@@ -396,26 +396,22 @@ cv__endword(wchar_t *p, wchar_t *high, int n, int (*wt
libedit_private int
ch_init(EditLine *el)
{
- el->el_line.buffer = el_malloc(EL_BUFSIZ *
+ el->el_line.buffer = el_calloc(EL_BUFSIZ,
sizeof(*el->el_line.buffer));
if (el->el_line.buffer == NULL)
return -1;
- (void) memset(el->el_line.buffer, 0, EL_BUFSIZ *
- sizeof(*el->el_line.buffer));
el->el_line.cursor = el->el_line.buffer;
el->el_line.lastchar = el->el_line.buffer;
el->el_line.limit = &el->el_line.buffer[EL_BUFSIZ - EL_LEAVE];
- el->el_chared.c_undo.buf = el_malloc(EL_BUFSIZ *
+ el->el_chared.c_undo.buf = el_calloc(EL_BUFSIZ,
sizeof(*el->el_chared.c_undo.buf));
if (el->el_chared.c_undo.buf == NULL)
return -1;
- (void) memset(el->el_chared.c_undo.buf, 0, EL_BUFSIZ *
- sizeof(*el->el_chared.c_undo.buf));
el->el_chared.c_undo.len = -1;
el->el_chared.c_undo.cursor = 0;
- el->el_chared.c_redo.buf = el_malloc(EL_BUFSIZ *
+ el->el_chared.c_redo.buf = el_calloc(EL_BUFSIZ,
sizeof(*el->el_chared.c_redo.buf));
if (el->el_chared.c_redo.buf == NULL)
return -1;
@@ -426,12 +422,10 @@ ch_init(EditLine *el)
el->el_chared.c_vcmd.action = NOP;
el->el_chared.c_vcmd.pos = el->el_line.buffer;
- el->el_chared.c_kill.buf = el_malloc(EL_BUFSIZ *
+ el->el_chared.c_kill.buf = el_calloc(EL_BUFSIZ,
sizeof(*el->el_chared.c_kill.buf));
if (el->el_chared.c_kill.buf == NULL)
return -1;
- (void) memset(el->el_chared.c_kill.buf, 0, EL_BUFSIZ *
- 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;
@@ -591,7 +585,7 @@ ch_end(EditLine *el)
/* el_insertstr():
- * Insert string at cursorI
+ * Insert string at cursor
*/
int
el_winsertstr(EditLine *el, const wchar_t *s)
Modified: vendor/NetBSD/libedit/dist/chartype.c
==============================================================================
--- vendor/NetBSD/libedit/dist/chartype.c Tue Sep 10 09:57:24 2019 (r352133)
+++ vendor/NetBSD/libedit/dist/chartype.c Tue Sep 10 13:55:44 2019 (r352134)
@@ -1,4 +1,4 @@
-/* $NetBSD: chartype.c,v 1.31 2017/01/09 02:54:18 christos Exp $ */
+/* $NetBSD: chartype.c,v 1.35 2019/07/23 10:18:52 christos Exp $ */
/*-
* Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -31,10 +31,11 @@
*/
#include "config.h"
#if !defined(lint) && !defined(SCCSID)
-__RCSID("$NetBSD: chartype.c,v 1.31 2017/01/09 02:54:18 christos Exp $");
+__RCSID("$NetBSD: chartype.c,v 1.35 2019/07/23 10:18:52 christos Exp $");
#endif /* not lint && not SCCSID */
#include <ctype.h>
+#include <limits.h>
#include <stdlib.h>
#include <string.h>
@@ -156,7 +157,7 @@ ct_decode_argv(int argc, const char *argv[], ct_buffer
if (ct_conv_wbuff_resize(conv, bufspace + CT_BUFSIZ) == -1)
return NULL;
- wargv = el_malloc((size_t)(argc + 1) * sizeof(*wargv));
+ wargv = el_calloc((size_t)(argc + 1), sizeof(*wargv));
for (i = 0, p = conv->wbuff; i < argc; ++i) {
if (!argv[i]) { /* don't pass null pointers to mbstowcs */
@@ -183,17 +184,14 @@ ct_decode_argv(int argc, const char *argv[], ct_buffer
libedit_private size_t
ct_enc_width(wchar_t c)
{
- /* UTF-8 encoding specific values */
- if (c < 0x80)
- return 1;
- else if (c < 0x0800)
- return 2;
- else if (c < 0x10000)
- return 3;
- else if (c < 0x110000)
- return 4;
- else
- return 0; /* not a valid codepoint */
+ mbstate_t mbs;
+ char buf[MB_LEN_MAX];
+ size_t size;
+ memset(&mbs, 0, sizeof(mbs));
+
+ if ((size = wcrtomb(buf, c, &mbs)) == (size_t)-1)
+ return 0;
+ return size;
}
libedit_private ssize_t
Modified: vendor/NetBSD/libedit/dist/common.c
==============================================================================
--- vendor/NetBSD/libedit/dist/common.c Tue Sep 10 09:57:24 2019 (r352133)
+++ vendor/NetBSD/libedit/dist/common.c Tue Sep 10 13:55:44 2019 (r352134)
@@ -1,4 +1,4 @@
-/* $NetBSD: common.c,v 1.47 2016/05/22 19:44:26 christos Exp $ */
+/* $NetBSD: common.c,v 1.48 2018/02/26 17:36:14 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)common.c 8.1 (Berkeley) 6/4/93";
#else
-__RCSID("$NetBSD: common.c,v 1.47 2016/05/22 19:44:26 christos Exp $");
+__RCSID("$NetBSD: common.c,v 1.48 2018/02/26 17:36:14 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
@@ -363,15 +363,17 @@ ed_prev_char(EditLine *el, wint_t c __attribute__((__u
* [^V] [^V]
*/
libedit_private el_action_t
-ed_quoted_insert(EditLine *el, wint_t c)
+/*ARGSUSED*/
+ed_quoted_insert(EditLine *el, wint_t c __attribute__((__unused__)))
{
int num;
+ wchar_t ch;
tty_quotemode(el);
- num = el_wgetc(el, &c);
+ num = el_wgetc(el, &ch);
tty_noquotemode(el);
if (num == 1)
- return ed_insert(el, c);
+ return ed_insert(el, ch);
else
return ed_end_of_file(el, 0);
}
Modified: vendor/NetBSD/libedit/dist/editline.3
==============================================================================
--- vendor/NetBSD/libedit/dist/editline.3 Tue Sep 10 09:57:24 2019 (r352133)
+++ vendor/NetBSD/libedit/dist/editline.3 Tue Sep 10 13:55:44 2019 (r352134)
@@ -1,4 +1,4 @@
-.\" $NetBSD: editline.3,v 1.98 2017/09/02 06:48:10 wiz Exp $
+.\" $NetBSD: editline.3,v 1.99 2018/11/18 17:09:39 christos Exp $
.\"
.\" Copyright (c) 1997-2014 The NetBSD Foundation, Inc.
.\" All rights reserved.
@@ -26,7 +26,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd September 1, 2017
+.Dd November 9, 2018
.Dt EDITLINE 3
.Os
.Sh NAME
@@ -181,8 +181,6 @@ library respects the
locale set by the application program and never uses
.Xr setlocale 3
to change the locale.
-The only locales supported are UTF-8 and the default C or POSIX locale.
-If any other locale is set, behaviour is undefined.
.Sh LINE EDITING FUNCTIONS
The line editing functions use a common data structure,
.Fa EditLine ,
Modified: vendor/NetBSD/libedit/dist/el.c
==============================================================================
--- vendor/NetBSD/libedit/dist/el.c Tue Sep 10 09:57:24 2019 (r352133)
+++ vendor/NetBSD/libedit/dist/el.c Tue Sep 10 13:55:44 2019 (r352134)
@@ -1,4 +1,4 @@
-/* $NetBSD: el.c,v 1.95 2017/09/05 18:07:59 christos Exp $ */
+/* $NetBSD: el.c,v 1.99 2019/07/23 10:18:52 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.95 2017/09/05 18:07:59 christos Exp $");
+__RCSID("$NetBSD: el.c,v 1.99 2019/07/23 10:18:52 christos Exp $");
#endif
#endif /* not lint && not SCCSID */
@@ -71,13 +71,11 @@ libedit_private EditLine *
el_init_internal(const char *prog, FILE *fin, FILE *fout, FILE *ferr,
int fdin, int fdout, int fderr, int flags)
{
- EditLine *el = el_malloc(sizeof(*el));
+ EditLine *el = el_calloc(1, sizeof(*el));
if (el == NULL)
return NULL;
- memset(el, 0, sizeof(EditLine));
-
el->el_infile = fin;
el->el_outfile = fout;
el->el_errfile = ferr;
@@ -96,10 +94,6 @@ el_init_internal(const char *prog, FILE *fin, FILE *fo
* Initialize all the modules. Order is important!!!
*/
el->el_flags = flags;
- if (setlocale(LC_CTYPE, NULL) != NULL){
- if (strcmp(nl_langinfo(CODESET), "UTF-8") == 0)
- el->el_flags |= CHARSET_IS_UTF8;
- }
if (terminal_init(el) == -1) {
el_free(el->el_prog);
@@ -146,7 +140,7 @@ el_end(EditLine *el)
keymacro_end(el);
map_end(el);
if (!(el->el_flags & NO_TTY))
- tty_end(el);
+ tty_end(el, TCSAFLUSH);
ch_end(el);
read_end(el->el_read);
search_end(el);
@@ -301,7 +295,7 @@ el_wset(EditLine *el, int op, ...)
void *ptr = va_arg(ap, void *);
rv = hist_set(el, func, ptr);
- if (!(el->el_flags & CHARSET_IS_UTF8))
+ if (MB_CUR_MAX == 1)
el->el_flags &= ~NARROW_HISTORY;
break;
}
@@ -443,15 +437,11 @@ el_wget(EditLine *el, int op, ...)
case EL_GETTC:
{
static char name[] = "gettc";
- char *argv[20];
- int i;
-
- for (i = 1; i < (int)__arraycount(argv); i++)
- if ((argv[i] = va_arg(ap, char *)) == NULL)
- break;
-
+ char *argv[3];
argv[0] = name;
- rv = terminal_gettc(el, i, argv);
+ argv[1] = va_arg(ap, char *);
+ argv[2] = va_arg(ap, void *);
+ rv = terminal_gettc(el, 3, argv);
break;
}
@@ -542,7 +532,7 @@ el_source(EditLine *el, const char *fname)
if ((ptr = getenv("HOME")) == NULL)
return -1;
plen += strlen(ptr);
- if ((path = el_malloc(plen * sizeof(*path))) == NULL)
+ if ((path = el_calloc(plen, sizeof(*path))) == NULL)
return -1;
(void)snprintf(path, plen, "%s%s", ptr,
elpath + (*ptr == '\0'));
Modified: vendor/NetBSD/libedit/dist/el.h
==============================================================================
--- vendor/NetBSD/libedit/dist/el.h Tue Sep 10 09:57:24 2019 (r352133)
+++ vendor/NetBSD/libedit/dist/el.h Tue Sep 10 13:55:44 2019 (r352134)
@@ -1,4 +1,4 @@
-/* $NetBSD: el.h,v 1.43 2017/09/05 18:07:59 christos Exp $ */
+/* $NetBSD: el.h,v 1.45 2019/07/23 10:18:52 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -55,7 +55,6 @@
#define NO_TTY 0x02
#define EDIT_DISABLED 0x04
#define UNBUFFERED 0x08
-#define CHARSET_IS_UTF8 0x10
#define NARROW_HISTORY 0x40
#define NO_RESET 0x80
@@ -90,6 +89,7 @@ typedef struct el_state_t {
* Until we come up with something better...
*/
#define el_malloc(a) malloc(a)
+#define el_calloc(a,b) calloc(a, b)
#define el_realloc(a,b) realloc(a, b)
#define el_free(a) free(a)
Modified: vendor/NetBSD/libedit/dist/eln.c
==============================================================================
--- vendor/NetBSD/libedit/dist/eln.c Tue Sep 10 09:57:24 2019 (r352133)
+++ vendor/NetBSD/libedit/dist/eln.c Tue Sep 10 13:55:44 2019 (r352134)
@@ -1,4 +1,4 @@
-/* $NetBSD: eln.c,v 1.34 2016/05/09 21:37:34 christos Exp $ */
+/* $NetBSD: eln.c,v 1.35 2019/04/26 16:56:57 christos Exp $ */
/*-
* Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
*/
#include "config.h"
#if !defined(lint) && !defined(SCCSID)
-__RCSID("$NetBSD: eln.c,v 1.34 2016/05/09 21:37:34 christos Exp $");
+__RCSID("$NetBSD: eln.c,v 1.35 2019/04/26 16:56:57 christos Exp $");
#endif /* not lint && not SCCSID */
#include <errno.h>
@@ -321,14 +321,12 @@ el_get(EditLine *el, int op, ...)
break;
case EL_GETTC: {
- char *argv[20];
+ char *argv[3];
static char gettc[] = "gettc";
- int i;
- for (i = 1; i < (int)__arraycount(argv); ++i)
- if ((argv[i] = va_arg(ap, char *)) == NULL)
- break;
argv[0] = gettc;
- ret = terminal_gettc(el, i, argv);
+ argv[1] = va_arg(ap, char *);
+ argv[2] = va_arg(ap, void *);
+ ret = terminal_gettc(el, 3, argv);
break;
}
Modified: vendor/NetBSD/libedit/dist/filecomplete.c
==============================================================================
--- vendor/NetBSD/libedit/dist/filecomplete.c Tue Sep 10 09:57:24 2019 (r352133)
+++ vendor/NetBSD/libedit/dist/filecomplete.c Tue Sep 10 13:55:44 2019 (r352134)
@@ -1,4 +1,4 @@
-/* $NetBSD: filecomplete.c,v 1.45 2017/04/21 05:38:03 abhinav Exp $ */
+/* $NetBSD: filecomplete.c,v 1.58 2019/09/08 05:50:58 abhinav Exp $ */
/*-
* Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
#include "config.h"
#if !defined(lint) && !defined(SCCSID)
-__RCSID("$NetBSD: filecomplete.c,v 1.45 2017/04/21 05:38:03 abhinav Exp $");
+__RCSID("$NetBSD: filecomplete.c,v 1.58 2019/09/08 05:50:58 abhinav Exp $");
#endif /* not lint && not SCCSID */
#include <sys/types.h>
@@ -83,7 +83,7 @@ fn_tilde_expand(const char *txt)
} else {
/* text until string after slash */
len = (size_t)(temp - txt + 1);
- temp = el_malloc(len * sizeof(*temp));
+ temp = el_calloc(len, sizeof(*temp));
if (temp == NULL)
return NULL;
(void)strncpy(temp, txt + 1, len - 2);
@@ -118,7 +118,7 @@ fn_tilde_expand(const char *txt)
txt += len;
len = strlen(pass->pw_dir) + 1 + strlen(txt) + 1;
- temp = el_malloc(len * sizeof(*temp));
+ temp = el_calloc(len, sizeof(*temp));
if (temp == NULL)
return NULL;
(void)snprintf(temp, len, "%s/%s", pass->pw_dir, txt);
@@ -126,7 +126,193 @@ fn_tilde_expand(const char *txt)
return temp;
}
+static int
+needs_escaping(char c)
+{
+ switch (c) {
+ case '\'':
+ case '"':
+ case '(':
+ case ')':
+ case '\\':
+ case '<':
+ case '>':
+ case '$':
+ case '#':
+ case ' ':
+ case '\n':
+ case '\t':
+ case '?':
+ case ';':
+ case '`':
+ case '@':
+ case '=':
+ case '|':
+ case '{':
+ case '}':
+ case '&':
+ case '*':
+ case '[':
+ return 1;
+ default:
+ return 0;
+ }
+}
+static int
+needs_dquote_escaping(char c)
+{
+ switch (c) {
+ case '"':
+ case '\\':
+ case '`':
+ case '$':
+ return 1;
+ default:
+ return 0;
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-vendor
mailing list