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 <[email protected]>
+ * 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@rate", NULL},
+               L"ls atthe\\@rate "
+       },
+       {
+               /* test for @ inside single quote */
+               L"ls 'sat",
+               "sat",
+               {"satthe@rate", NULL},
+               L"ls 'satthe@rate'"
+       },
+       {
+               /* test for @ inside double quote */
+               L"ls \"dat",
+               "dat",
+               {"datthe@rate", NULL},
+               L"ls \"datthe@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 ***
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to