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-all mailing list