summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYegor Timoshenko <yegortimoshenko@gmail.com>2017-05-21 02:59:42 +0300
committerMichał Górny <mgorny@gentoo.org>2017-06-12 23:27:42 +0200
commite6ffdb6a7e3fb4a8c0e72b1d6b5ae7f6d3b7931a (patch)
tree36f949783983f262d81366369fbb3ed798e764ad /dev-libs/libedit/files
parentsys-apps/nix: bump up to 1.11.10 (diff)
downloadgentoo-e6ffdb6a7e3fb4a8c0e72b1d6b5ae7f6d3b7931a.tar.gz
gentoo-e6ffdb6a7e3fb4a8c0e72b1d6b5ae7f6d3b7931a.tar.bz2
gentoo-e6ffdb6a7e3fb4a8c0e72b1d6b5ae7f6d3b7931a.zip
dev-libs/libedit: bump to 20170329.3.1, #529422
Closes: https://github.com/gentoo/gentoo/pull/4692
Diffstat (limited to 'dev-libs/libedit/files')
-rw-r--r--dev-libs/libedit/files/libedit-20170329.3.1-el_fn_sh_complete.patch249
-rw-r--r--dev-libs/libedit/files/libedit-20170329.3.1-ncursesprivate.patch10
2 files changed, 259 insertions, 0 deletions
diff --git a/dev-libs/libedit/files/libedit-20170329.3.1-el_fn_sh_complete.patch b/dev-libs/libedit/files/libedit-20170329.3.1-el_fn_sh_complete.patch
new file mode 100644
index 000000000000..c54f27600e34
--- /dev/null
+++ b/dev-libs/libedit/files/libedit-20170329.3.1-el_fn_sh_complete.patch
@@ -0,0 +1,249 @@
+--- libedit-20170329-3.1/src/filecomplete.c 2017-03-29 21:15:04.000000000 +0300
++++ libedit-20170329-3.1/src/filecomplete.c 2017-05-21 02:23:16.000000000 +0300
+@@ -51,6 +51,7 @@
+ #include "filecomplete.h"
+
+ static const wchar_t break_chars[] = L" \t\n\"\\'`@$><=;|&{(";
++static const wchar_t extra_quote_chars[] = L")}*?[$\0";
+
+ /********************************/
+ /* completion functions */
+@@ -405,10 +406,14 @@
+ char **(*attempted_completion_function)(const char *, int, int),
+ const wchar_t *word_break, const wchar_t *special_prefixes,
+ const char *(*app_func)(const char *), size_t query_items,
+- int *completion_type, int *over, int *point, int *end)
++ int *completion_type, int *over, int *point, int *end,
++ const char *(*find_word_start_func)(const char *, const char *),
++ char *(*dequoting_func)(const char *),
++ char *(*quoting_func)(const char *))
+ {
+ const LineInfoW *li;
+ wchar_t *temp;
++ char *dequoted_temp;
+ char **matches;
+ const wchar_t *ctemp;
+ size_t len;
+@@ -429,17 +434,28 @@
+
+ /* We now look backwards for the start of a filename/variable word */
+ li = el_wline(el);
++ if (find_word_start_func)
++ ctemp = ct_decode_string(find_word_start_func(ct_encode_string(li->buffer,&el->el_scratch), ct_encode_string(li->cursor,&el->el_scratch)),&el->el_scratch);
++ else {
+ ctemp = li->cursor;
+ while (ctemp > li->buffer
+ && !wcschr(word_break, ctemp[-1])
+ && (!special_prefixes || !wcschr(special_prefixes, ctemp[-1]) ) )
+ ctemp--;
++ }
+
+ len = (size_t)(li->cursor - ctemp);
+ temp = el_malloc((len + 1) * sizeof(*temp));
+ (void)wcsncpy(temp, ctemp, len);
+ temp[len] = '\0';
+
++ if (dequoting_func) {
++ dequoted_temp = dequoting_func(ct_encode_string(temp,&el->el_scratch));
++ if (dequoted_temp == NULL)
++ return retval;
++ } else
++ dequoted_temp = NULL;
++
+ /* these can be used by function called in completion_matches() */
+ /* or (*attempted_completion_function)() */
+ if (point != NULL)
+@@ -450,14 +466,14 @@
+ if (attempted_completion_function) {
+ int cur_off = (int)(li->cursor - li->buffer);
+ matches = (*attempted_completion_function)(
+- ct_encode_string(temp, &el->el_scratch),
++ dequoted_temp? dequoted_temp : ct_encode_string(temp, &el->el_scratch),
+ cur_off - (int)len, cur_off);
+ } else
+ matches = NULL;
+ if (!attempted_completion_function ||
+ (over != NULL && !*over && !matches))
+ matches = completion_matches(
+- ct_encode_string(temp, &el->el_scratch), complet_func);
++ dequoted_temp? dequoted_temp : ct_encode_string(temp, &el->el_scratch), complet_func);
+
+ if (over != NULL)
+ *over = 0;
+@@ -472,9 +488,18 @@
+ * possible matches if there is possible completion.
+ */
+ if (matches[0][0] != '\0') {
++ char *quoted_match;
++ if (quoting_func) {
++ quoted_match = quoting_func(matches[0]);
++ if (quoted_match == NULL)
++ goto free_matches;
++ } else
++ quoted_match = NULL;
++
+ el_deletestr(el, (int) len);
+ el_winsertstr(el,
+- ct_decode_string(matches[0], &el->el_scratch));
++ ct_decode_string(quoted_match? quoted_match : matches[0], &el->el_scratch));
++ free(quoted_match);
+ }
+
+
+@@ -545,12 +570,14 @@
+ retval = CC_NORM;
+ }
+
++free_matches:
+ /* free elements of array and the array itself */
+ for (i = 0; matches[i]; i++)
+ el_free(matches[i]);
+ el_free(matches);
+ matches = NULL;
+ }
++ el_free(dequoted_temp);
+ el_free(temp);
+ return retval;
+ }
+@@ -564,5 +591,102 @@
+ {
+ return (unsigned char)fn_complete(el, NULL, NULL,
+ break_chars, NULL, NULL, (size_t)100,
+- NULL, NULL, NULL, NULL);
++ NULL, NULL, NULL, NULL,
++ NULL, NULL, NULL);
++}
++
++static const char *
++sh_find_word_start(const char *buffer, const char *cursor)
++{
++ const char *word_start = buffer;
++
++ while (buffer < cursor) {
++ if (*buffer == '\\')
++ buffer++;
++ else if (strchr(break_chars, *buffer))
++ word_start = buffer + 1;
++
++ buffer++;
++ }
++
++ return word_start;
++}
++
++
++static char *
++sh_quote(const char *str)
++{
++ const char *src;
++ int extra_len = 0;
++ char *quoted_str, *dst;
++
++ if (*str == '-' || *str == '+')
++ extra_len += 2;
++ for (src = str; *src != '\0'; src++)
++ if (strchr(break_chars, *src) ||
++ strchr(extra_quote_chars, *src))
++ extra_len++;
++
++ quoted_str = malloc(sizeof(*quoted_str) *
++ (strlen(str) + extra_len + 1));
++ if (quoted_str == NULL)
++ return NULL;
++
++ dst = quoted_str;
++ if (*str == '-' || *str == '+')
++ *dst++ = '.', *dst++ = '/';
++ for (src = str; *src != '\0'; src++) {
++ if (strchr(break_chars, *src) ||
++ strchr(extra_quote_chars, *src))
++ *dst++ = '\\';
++ *dst++ = *src;
++ }
++ *dst = '\0';
++
++ return quoted_str;
++}
++
++
++static char *
++sh_dequote(const char *str)
++{
++ char *dequoted_str, *dst;
++
++ /* save extra space to replace \~ with ./~ */
++ dequoted_str = malloc(sizeof(*dequoted_str) * (strlen(str) + 1 + 1));
++ if (dequoted_str == NULL)
++ return NULL;
++
++ dst = dequoted_str;
++
++ /* dequote \~ at start as ./~ */
++ if (*str == '\\' && str[1] == '~') {
++ str++;
++ *dst++ = '.';
++ *dst++ = '/';
++ }
++
++ while (*str) {
++ if (*str == '\\')
++ str++;
++ if (*str)
++ *dst++ = *str++;
++ }
++ *dst = '\0';
++
++ return dequoted_str;
++}
++
++
++/*
++ * completion function using sh quoting rules; for key binding
++ */
++/* ARGSUSED */
++unsigned char
++_el_fn_sh_complete(EditLine *el, int ch __attribute__((__unused__)))
++{
++ return (unsigned char)fn_complete(el, NULL, NULL,
++ break_chars, NULL, NULL, 100,
++ NULL, NULL, NULL, NULL,
++ sh_find_word_start, sh_dequote, sh_quote);
+ }
+
+--- libedit-20170329-3.1/src/readline.c 2017-03-29 21:15:04.000000000 +0300
++++ libedit-20170329-3.1/src/readline.c 2017-05-21 02:24:57.000000000 +0300
+@@ -1869,7 +1869,7 @@
+ _rl_completion_append_character_function,
+ (size_t)rl_completion_query_items,
+ &rl_completion_type, &rl_attempted_completion_over,
+- &rl_point, &rl_end);
++ &rl_point, &rl_end, NULL, NULL, NULL);
+
+
+ }
+
+--- libedit-20170329-3.1/src/histedit.h 2017-03-29 21:08:21.000000000 +0300
++++ libedit-20170329-3.1/src/histedit.h 2017-05-21 02:32:04.000000000 +0300
+@@ -113,6 +113,7 @@
+ int el_set(EditLine *, int, ...);
+ int el_get(EditLine *, int, ...);
+ unsigned char _el_fn_complete(EditLine *, int);
++unsigned char _el_fn_sh_complete(EditLine *, int);
+
+ /*
+ * el_set/el_get parameters
+
+--- libedit-20170329-3.1/src/filecomplete.h 2017-03-29 21:08:21.000000000 +0300
++++ libedit-20170329-3.1/src/filecomplete.h 2017-05-21 02:32:27.000000000 +0300
+@@ -35,7 +35,10 @@
+ char *(*)(const char *, int),
+ char **(*)(const char *, int, int),
+ const wchar_t *, const wchar_t *, const char *(*)(const char *), size_t,
+- int *, int *, int *, int *);
++ int *, int *, int *, int *,
++ const char *(*)(const char *, const char *),
++ char *(*)(const char *),
++ char *(*)(const char *));
+
+ void fn_display_match_list(EditLine *, char **, size_t, size_t);
+ char *fn_tilde_expand(const char *);
diff --git a/dev-libs/libedit/files/libedit-20170329.3.1-ncursesprivate.patch b/dev-libs/libedit/files/libedit-20170329.3.1-ncursesprivate.patch
new file mode 100644
index 000000000000..1d5432fac0be
--- /dev/null
+++ b/dev-libs/libedit/files/libedit-20170329.3.1-ncursesprivate.patch
@@ -0,0 +1,10 @@
+--- libedit-20170329-3.1/libedit.pc.in 2017-03-29 21:08:21.000000000 +0300
++++ libedit-20170329-3.1/libedit.pc.in 2017-05-21 01:28:55.000000000 +0300
+@@ -7,5 +7,6 @@
+ Description: command line editor library provides generic line editing, history, and tokenization functions.
+ Version: @VERSION@
+ Requires:
+-Libs: -L${libdir} -ledit @LIBS@
++Libs: -L${libdir} -ledit
++Libs.private: @LIBS@
+ Cflags: -I${includedir} -I${includedir}/editline