Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libedit Add support for escaping special characters when...



details:   https://anonhg.NetBSD.org/src/rev/ed26ebcf040c
branches:  trunk
changeset: 827128:ed26ebcf040c
user:      abhinav <abhinav%NetBSD.org@localhost>
date:      Sun Oct 15 18:59:00 2017 +0000

description:
Add support for escaping special characters when doing filename completion.

For instance if the file name is "foo bar":
$ ls foo<TAB>
should get autocompleted to:
$ ls foo\ bar

Works for similar other characters too, which need escaping.

Also, add an accompanying test program to ensure the escaping is correct
in various scenarios (within quotes, without quotes, with other special characeters)

Thanks to Christos for reviews, help and feedback.

diffstat:

 lib/libedit/TEST/Makefile              |    4 +-
 lib/libedit/TEST/test_filecompletion.c |  492 +++++++++++++++++++++++++++++++++
 lib/libedit/filecomplete.c             |  174 ++++++++++-
 3 files changed, 649 insertions(+), 21 deletions(-)

diffs (truncated from 718 to 300 lines):

diff -r 84ff538ee983 -r ed26ebcf040c lib/libedit/TEST/Makefile
--- a/lib/libedit/TEST/Makefile Sun Oct 15 18:02:33 2017 +0000
+++ b/lib/libedit/TEST/Makefile Sun Oct 15 18:59:00 2017 +0000
@@ -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}
diff -r 84ff538ee983 -r ed26ebcf040c lib/libedit/TEST/test_filecompletion.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/libedit/TEST/test_filecompletion.c    Sun Oct 15 18:59:00 2017 +0000
@@ -0,0 +1,492 @@
+#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; /* 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",
+               L"ls ang\\<ular\\>test "
+       },
+       {
+               /* test angular bracket inside double quotes: ls "dq_ang */
+               L"ls \"dq_ang",
+               "dq_ang",
+               "dq_ang<ular>test",
+               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",
+               L"ls 'sq_ang<ular>test' "
+       },
+       {
+               /* simple test for backslash */
+               L"ls back",
+               "back",
+               "backslash\\test",
+               L"ls backslash\\\\test "
+       },
+       {
+               /* backslash inside single quotes */
+               L"ls 'sback",
+               "sback",
+               "sbackslash\\test",
+               L"ls 'sbackslash\\test' "
+       },
+       {
+               /* backslash inside double quotes */
+               L"ls \"dback",
+               "dback",
+               "dbackslash\\test",
+               L"ls \"dbackslash\\\\test\" "
+       },
+       {
+               /* test braces */
+               L"ls br",
+               "br",
+               "braces{test}",
+               L"ls braces\\{test\\} "
+       },
+       {
+               /* test braces inside single quotes */
+               L"ls 'sbr",
+               "sbr",
+               "sbraces{test}",
+               L"ls 'sbraces{test}' "
+       },
+       {
+               /* test braces inside double quotes */
+               L"ls \"dbr",
+               "dbr",
+               "dbraces{test}",
+               L"ls \"dbraces{test}\" "
+       },
+       {
+               /* test dollar */
+               L"ls doll",
+               "doll",
+               "doll$artest",
+               L"ls doll\\$artest "
+       },
+       {
+               /* test dollar inside single quotes */
+               L"ls 'sdoll",
+               "sdoll",
+               "sdoll$artest",
+               L"ls 'sdoll$artest' "
+       },
+       {
+               /* test dollar inside double quotes */
+               L"ls \"ddoll",
+               "ddoll",
+               "ddoll$artest",
+               L"ls \"ddoll\\$artest\" "
+       },
+       {
+               /* test equals */
+               L"ls eq",
+               "eq",
+               "equals==test",
+               L"ls equals\\=\\=test "
+       },
+       {
+               /* test equals inside sinqle quotes */
+               L"ls 'seq",
+               "seq",
+               "sequals==test",
+               L"ls 'sequals==test' "
+       },
+       {
+               /* test equals inside double quotes */
+               L"ls \"deq",
+               "deq",
+               "dequals==test",
+               L"ls \"dequals==test\" "
+       },
+       {
+               /* test \n */
+               L"ls new",
+               "new",
+               "new\\nline",
+               L"ls new\\\\nline "
+       },
+       {
+               /* test \n inside single quotes */
+               L"ls 'snew",
+               "snew",
+               "snew\nline",
+               L"ls 'snew\nline' "
+       },
+       {
+               /* test \n inside double quotes */
+               L"ls \"dnew",
+               "dnew",
+               "dnew\nline",
+               L"ls \"dnew\nline\" "
+       },
+       {
+               /* test single space */
+               L"ls spac",
+               "spac",
+               "space test",
+               L"ls space\\ test "
+       },
+       {
+               /* test single space inside singlq quotes */
+               L"ls 's_spac",
+               "s_spac",
+               "s_space test",
+               L"ls 's_space test' "
+       },
+       {
+               /* test single space inside double quotes */
+               L"ls \"d_spac",
+               "d_spac",
+               "d_space test",
+               L"ls \"d_space test\" "
+       },
+       {
+               /* test multiple spaces */
+               L"ls multi",
+               "multi",
+               "multi space  test",
+               L"ls multi\\ space\\ \\ test "
+       },
+       {
+               /* test multiple spaces inside single quotes */
+               L"ls 's_multi",
+               "s_multi",
+               "s_multi space  test",
+               L"ls 's_multi space  test' "
+       },
+       {
+               /* test multiple spaces inside double quotes */
+               L"ls \"d_multi",
+               "d_multi",
+               "d_multi space  test",
+               L"ls \"d_multi space  test\" "
+       },
+       {
+               /* test double quotes */
+               L"ls doub",
+               "doub",
+               "doub\"quotes",
+               L"ls doub\\\"quotes "
+       },
+       {
+               /* test double quotes inside single quotes */
+               L"ls 's_doub",
+               "s_doub",
+               "s_doub\"quotes",
+               L"ls 's_doub\"quotes' "
+       },
+       {
+               /* test double quotes inside double quotes */
+               L"ls \"d_doub",
+               "d_doub",
+               "d_doub\"quotes",
+               L"ls \"d_doub\\\"quotes\" "
+       },
+       {
+               /* test multiple double quotes */
+               L"ls mud",
+               "mud",
+               "mud\"qu\"otes\"",
+               L"ls mud\\\"qu\\\"otes\\\" "
+       },
+       {
+               /* test multiple double quotes inside single quotes */
+               L"ls 'smud",
+               "smud",
+               "smud\"qu\"otes\"",
+               L"ls 'smud\"qu\"otes\"' "
+       },
+       {
+               /* test multiple double quotes inside double quotes */
+               L"ls \"dmud",
+               "dmud",
+               "dmud\"qu\"otes\"",
+               L"ls \"dmud\\\"qu\\\"otes\\\"\" "
+       },
+       {
+               /* test one single quote */
+               L"ls sing",
+               "sing",
+               "single'quote",
+               L"ls single\\'quote "
+       },
+       {
+               /* test one single quote inside single quote */
+               L"ls 'ssing",
+               "ssing",
+               "ssingle'quote",
+               L"ls 'ssingle'\\''quote' "
+       },
+       {
+               /* test one single quote inside double quote */
+               L"ls \"dsing",
+               "dsing",
+               "dsingle'quote",
+               L"ls \"dsingle'quote\" "
+       },
+       {
+               /* test multiple single quotes */
+               L"ls mu_sing",
+               "mu_sing",
+               "mu_single''quotes''",
+               L"ls mu_single\\'\\'quotes\\'\\' "
+       },
+       {
+               /* test multiple single quotes inside single quote */
+               L"ls 'smu_sing",
+               "smu_sing",
+               "smu_single''quotes''",
+               L"ls 'smu_single'\\'''\\''quotes'\\\'''\\''' "
+       },
+       {
+               /* test multiple single quotes inside double quote */
+               L"ls \"dmu_sing",
+               "dmu_sing",
+               "dmu_single''quotes''",
+               L"ls \"dmu_single''quotes''\" "
+       },
+       {
+               /* test parenthesis */
+               L"ls paren",
+               "paren",
+               "paren(test)",
+               L"ls paren\\(test\\) "
+       },
+       {
+               /* test parenthesis inside single quote */
+               L"ls 'sparen",



Home | Main Index | Thread Index | Old Index