summaryrefslogtreecommitdiff
path: root/system/ksh/patches/00_completion.diff
diff options
context:
space:
mode:
Diffstat (limited to 'system/ksh/patches/00_completion.diff')
-rw-r--r--system/ksh/patches/00_completion.diff117
1 files changed, 117 insertions, 0 deletions
diff --git a/system/ksh/patches/00_completion.diff b/system/ksh/patches/00_completion.diff
new file mode 100644
index 0000000000..ee843032ca
--- /dev/null
+++ b/system/ksh/patches/00_completion.diff
@@ -0,0 +1,117 @@
+Index: bin/ksh/edit.c
+===================================================================
+RCS file: /cvs/src/bin/ksh/edit.c,v
+retrieving revision 1.34
+diff -u -r1.34 edit.c
+--- ksh/edit.c 20 May 2010 01:13:07 -0000 1.34
++++ ksh/edit.c 9 May 2011 19:44:06 -0000
+@@ -357,20 +357,6 @@
+
+ toglob = add_glob(str, slen);
+
+- /* remove all escaping backward slashes */
+- escaping = 0;
+- for (i = 0, idx = 0; toglob[i]; i++) {
+- if (toglob[i] == '\\' && !escaping) {
+- escaping = 1;
+- continue;
+- }
+-
+- toglob[idx] = toglob[i];
+- idx++;
+- if (escaping) escaping = 0;
+- }
+- toglob[idx] = '\0';
+-
+ /*
+ * Convert "foo*" (toglob) to an array of strings (words)
+ */
+@@ -378,7 +364,7 @@
+ s = pushs(SWSTR, ATEMP);
+ s->start = s->str = toglob;
+ source = s;
+- if (yylex(ONEWORD) != LWORD) {
++ if (yylex(ONEWORD|RMBKSLSH) != LWORD) {
+ source = sold;
+ internal_errorf(0, "fileglob: substitute error");
+ return 0;
+@@ -394,6 +380,20 @@
+ if (nwords == 1) {
+ struct stat statb;
+
++ /* remove all escaping backward slashes (see below) */
++ escaping = 0;
++ for (i = 0, idx = 0; toglob[i]; i++) {
++ if (toglob[i] == '\\' && !escaping) {
++ escaping = 1;
++ continue;
++ }
++
++ toglob[idx] = toglob[i];
++ idx++;
++ if (escaping) escaping = 0;
++ }
++ toglob[idx] = '\0';
++
+ /* Check if globbing failed (returned glob pattern),
+ * but be careful (E.g. toglob == "ab*" when the file
+ * "ab*" exists is not an error).
+@@ -821,7 +821,7 @@
+ int rval = 0;
+
+ for (add = 0, wlen = len; wlen - add > 0; add++) {
+- if (strchr("\"#$&'()*;<=>?[\\]`{|}", s[add]) ||
++ if (strchr(ESCAPEDCHARS, s[add]) ||
+ strchr(ifs, s[add])) {
+ if (putbuf_func(s, add) != 0) {
+ rval = -1;
+Index: bin/ksh/lex.c
+===================================================================
+RCS file: /cvs/src/bin/ksh/lex.c,v
+retrieving revision 1.45
+diff -u -r1.45 lex.c
+--- ksh/lex.c 9 Mar 2011 09:30:39 -0000 1.45
++++ ksh/lex.c 9 May 2011 19:44:07 -0000
+@@ -299,6 +299,10 @@
+ }
+ /* FALLTHROUGH */
+ default:
++ if ((cf & RMBKSLSH) && strchr(" " ESCAPEDCHARS, c)) {
++ *wp++ = QCHAR, *wp++ = c;
++ break;
++ }
+ Xcheck(ws, wp);
+ if (c) { /* trailing \ is lost */
+ *wp++ = CHAR, *wp++ = '\\';
+Index: bin/ksh/lex.h
+===================================================================
+RCS file: /cvs/src/bin/ksh/lex.h,v
+retrieving revision 1.11
+diff -u -r1.11 lex.h
+--- ksh/lex.h 29 May 2006 18:22:24 -0000 1.11
++++ ksh/lex.h 9 May 2011 19:44:07 -0000
+@@ -113,6 +113,7 @@
+ #define CMDWORD BIT(8) /* parsing simple command (alias related) */
+ #define HEREDELIM BIT(9) /* parsing <<,<<- delimiter */
+ #define HEREDOC BIT(10) /* parsing heredoc */
++#define RMBKSLSH BIT(11) /* remove backslashes */
+
+ #define HERES 10 /* max << in line */
+
+Index: bin/ksh/sh.h
+===================================================================
+RCS file: /cvs/src/bin/ksh/sh.h,v
+retrieving revision 1.30
+diff -u -r1.30 sh.h
+--- ksh/sh.h 4 Jan 2010 18:07:11 -0000 1.30
++++ ksh/sh.h 9 May 2011 19:44:07 -0000
+@@ -398,6 +398,9 @@
+ #define OBRACE '{'
+ #define CBRACE '}'
+
++/* Characters to be escaped */
++#define ESCAPEDCHARS "\"#$&'()*;<=>?[\\]`{|}"
++
+ /* Determine the location of the system (common) profile */
+ #define KSH_SYSTEM_PROFILE "/etc/profile"
+