summaryrefslogtreecommitdiff
path: root/shells/fd/files/patch-input.c
diff options
context:
space:
mode:
Diffstat (limited to 'shells/fd/files/patch-input.c')
-rw-r--r--shells/fd/files/patch-input.c189
1 files changed, 189 insertions, 0 deletions
diff --git a/shells/fd/files/patch-input.c b/shells/fd/files/patch-input.c
new file mode 100644
index 000000000000..b96651d9f2d9
--- /dev/null
+++ b/shells/fd/files/patch-input.c
@@ -0,0 +1,189 @@
+diff -u ../old/FD-2.00b/input.c ./input.c
+--- ../old/FD-2.00b/input.c Wed Mar 27 00:00:00 2002
++++ ./input.c Fri Apr 12 12:01:19 2002
+@@ -1047,8 +1047,11 @@
+ char *s;
+ int cx, len, plen, max, linemax, comline, cont;
+ {
++# if !MSDOS || !defined (_NOORIGSHELL)
++ int bq;
++# endif
+ char *cp1, *cp2, **argv;
+- int i, l, ins, top, fix, argc, quote, quoted;
++ int i, l, ins, top, fix, argc, quote, quoted, hasmeta;
+
+ if (selectlist && cont > 0) {
+ selectfile(tmpfilepos++, NULL);
+@@ -1056,17 +1059,26 @@
+ return(0);
+ }
+
+- for (i = top = 0, quote = '\0'; i < cx; i++) {
+- if (s[i] == quote) quote = '\0';
++# if !MSDOS || !defined (_NOORIGSHELL)
++ bq = 0;
++# endif
++ quote = '\0';
++ quoted = 0;
++ for (i = top = 0; i < cx; i++) {
++ if (s[i] == quote) {
++ if (quote == '"') quoted = i;
++# if !MSDOS || !defined (_NOORIGSHELL)
++ if (quote == '\'') quoted = i;
++# endif
++ quote = '\0';
++ }
+ else if (iskanji1(s, i)) i++;
+ else if (quote);
+-# if MSDOS && defined (_NOORIGSHELL)
+ else if (s[i] == '"') quote = s[i];
+-# else
+- else if (s[i] == '"' || s[i] == '\'') quote = s[i];
++# if !MSDOS || !defined (_NOORIGSHELL)
++ else if (s[i] == '\'') quote = s[i];
+ else if (s[i] == '`') {
+- top = i + 1;
+- quote = s[i];
++ if ((bq = 1 - bq)) top = i + 1;
+ }
+ # endif
+ else if (s[i] == '=' || strchr(CMDLINE_DELIM, s[i]))
+@@ -1076,13 +1088,6 @@
+ putterm(t_bell);
+ return(0);
+ }
+-# if MSDOS && defined (_NOORIGSHELL)
+- quoted = (!quote && cx > 0 && s[cx - 1] == '"')
+-# else
+- if (quote == '`') quote = '\0';
+- quoted = (!quote && cx > 0 && s[cx - 1] == '"' || s[cx - 1] == '\'')
+-# endif
+- ? s[cx - 1] : '\0';
+ if (comline && top > 0) {
+ for (i = top - 1; i >= 0; i--)
+ if (s[i] != ' ' && s[i] != '\t') break;
+@@ -1092,6 +1097,14 @@
+ cp1 = malloc2(cx - top + 1);
+ strncpy2(cp1, s + top, cx - top);
+ cp1 = evalpath(cp1, 1);
++ hasmeta = 0;
++ for (i = 0; cp1[i]; i++) {
++ if (strchr(METACHAR, cp1[i])) {
++ hasmeta = 1;
++ break;
++ }
++ if (iskanji1(cp1, i)) i++;
++ }
+
+ if (selectlist && cont < 0) {
+ argv = (char **)malloc2(1 * sizeof(char *));
+@@ -1128,13 +1141,11 @@
+ }
+
+ cp1 = findcommon(argc, argv);
+- fix = 0;
+- if (argc == 1 && cp1) {
+- if (isdelim(cp1, (int)strlen(cp1) - 1)) fix--;
+- else fix++;
+- }
++ fix = '\0';
++ if (argc == 1 && cp1)
++ fix = ((cp2 = strrdelim(cp1, 0)) && !*(cp2 + 1)) ? _SC_ : ' ';
+
+- if (!cp1 || ((ins = (int)strlen(cp1) - ins) <= 0 && fix <= 0)) {
++ if (!cp1 || ((ins = (int)strlen(cp1) - ins) <= 0 && fix != ' ')) {
+ if (cont <= 0) {
+ putterm(t_bell);
+ l = 0;
+@@ -1157,12 +1168,25 @@
+ free(argv);
+
+ l = 0;
+- if (!quote && !quoted && len < max) {
+- for (i = 0; cp1[i]; i++) {
+- if (strchr(METACHAR, cp1[i])) break;
+- if (iskanji1(cp1, i)) i++;
++ if (!hasmeta) for (i = 0; cp1[i]; i++) {
++ if (strchr(METACHAR, cp1[i])) {
++ hasmeta = 1;
++ break;
++ }
++ if (iskanji1(cp1, i)) i++;
++ }
++
++ if (hasmeta) {
++ if (quote);
++ else if (quoted) {
++ quote = s[quoted];
++ setcursor(vlen(s, quoted), plen, max, linemax);
++ deletechar(s, quoted, len, plen, max, linemax, 1);
++ delshift(s, quoted, len--, 1);
++ l--;
++ setcursor(vlen(s, --cx), plen, max, linemax);
+ }
+- if (cp1[i]) {
++ else if (len < max) {
+ setcursor(vlen(s, top), plen, max, linemax);
+ insertchar(s, top, len, plen, max, linemax, 1);
+ insshift(s, top, len++, 1);
+@@ -1171,43 +1195,30 @@
+ putch2(quote);
+ setcursor(vlen(s, ++cx), plen, max, linemax);
+ }
++ else hasmeta = 0;
+ }
+
+ cp2 = cp1 + (int)strlen(cp1) - ins;
+- if (quote && fix < 0 && len + 1 < max) {
+- i = insertstr(s, cx, len, plen,
+- max, linemax, cp2, ins - 1, quote);
+- l += i;
++ if (fix == _SC_) {
++ ins--;
++ if (!hasmeta) quote = '\0';
++ }
++ i = insertstr(s, cx, len, plen, max, linemax, cp2, ins, quote);
++ l += i;
++ if (fix && (len += i) < max) {
+ cx += i;
+- insertchar(s, cx, len, plen, max, linemax, 1);
+- insshift(s, cx, len++, 1);
+- l++;
+- s[cx++] = quote;
+- putcursor(quote, 1);
+- insertchar(s, cx, len, plen, max, linemax, 1);
+- insshift(s, cx, len, 1);
+- l++;
+- s[cx] = _SC_;
+- putcursor(_SC_, 1);
+- }
+- else {
+- i = insertstr(s, cx, len, plen, max, linemax, cp2, ins, quote);
+- l += i;
+- if (fix > 0 && (len += i) < max) {
+- cx += i;
+- if (quote && len + 1 < max) {
+- insertchar(s, cx, len, plen, max, linemax, 1);
+- insshift(s, cx, len++, 1);
+- l++;
+- s[cx++] = quote;
+- putcursor(quote, 1);
+- }
++ if (quote && len + 1 < max) {
+ insertchar(s, cx, len, plen, max, linemax, 1);
+- insshift(s, cx, len, 1);
++ insshift(s, cx, len++, 1);
+ l++;
+- s[cx] = ' ';
+- putcursor(' ', 1);
++ s[cx++] = quote;
++ putcursor(quote, 1);
+ }
++ insertchar(s, cx, len, plen, max, linemax, 1);
++ insshift(s, cx, len, 1);
++ l++;
++ s[cx] = fix;
++ putcursor(fix, 1);
+ }
+
+ free(cp1);