On 1/8/19 3:50 PM, a...@freakout.de wrote:
> Configuration Information [Automatically generated, do not change]:
> Machine: i686
> OS: linux-gnu
> Compiler: gcc
> Compilation CFLAGS: -fstack-protector -Wno-parentheses -Wno-format-security
> uname output: Linux bongo 2.6.32-042stab134.8 #1 SMP Fri Dec 7 17:16:09 MSK 
> 2018 i686 i686 i386 GNU/Linux
> Machine Type: i686-pc-linux-gnu
> 
> Bash Version: 5.0
> Patch Level: 0
> Release Status: release
> 
> Description:
> This script "weirdbackslashes":
> 
> $ cat weirdbackslashes
> #===begin
> PRE='\/'
> echo 'define'${PRE}'\
> /'
> #===end
> 
> produces with bash4:
> $ bash weirdbackslashes
> define\/\
> /
> 
> and with bash5:
> $ bash5 weirdbackslashes
> \d\e\f\i\n\e\/\\\
> /

This was literally the last change I made. I guess I'll have to do it a
different way. The attached patch will fix it.

Chet

-- 
``The lyf so short, the craft so long to lerne.'' - Chaucer
                 ``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, UTech, CWRU    c...@case.edu    http://tiswww.cwru.edu/~chet/
*** ../bash-5.0/bashline.c      2018-11-27 13:20:16.000000000 -0500
--- bashline.c  2019-01-09 09:44:26.000000000 -0500
***************
*** 232,235 ****
--- 232,236 ----
  static int bash_possible_command_completions __P((int, int));
  
+ static int completion_glob_pattern __P((const char *));
  static char *glob_complete_word __P((const char *, int));
  static int bash_glob_completion_internal __P((int));
***************
*** 1742,1746 ****
    /* This could be a globbing pattern, so try to expand it using pathname
       expansion. */
!   if (!matches && glob_pattern_p (text))
      {
        matches = rl_completion_matches (text, glob_complete_word);
--- 1743,1747 ----
    /* This could be a globbing pattern, so try to expand it using pathname
       expansion. */
!   if (!matches && completion_glob_pattern (text))
      {
        matches = rl_completion_matches (text, glob_complete_word);
***************
*** 1851,1855 ****
        }
  
!       globpat = glob_pattern_p (hint_text);
  
        /* If this is an absolute program name, do not check it against
--- 1852,1856 ----
        }
  
!       globpat = completion_glob_pattern (hint_text);
  
        /* If this is an absolute program name, do not check it against
***************
*** 3714,3717 ****
--- 3715,3773 ----
  }
  
+ static int
+ completion_glob_pattern (string)
+      const char *string;
+ {
+   register int c;
+   char *send;
+   int open;
+ 
+   DECLARE_MBSTATE;
+ 
+   open = 0;
+   send = string + strlen (string);
+ 
+   while (c = *string++)
+     {
+       switch (c)
+       {
+       case '?':
+       case '*':
+         return (1);
+ 
+       case '[':
+         open++;
+         continue;
+ 
+       case ']':
+         if (open)
+           return (1);
+         continue;
+ 
+       case '+':
+       case '@':
+       case '!':
+         if (*string == '(')   /*)*/
+           return (1);
+         continue;
+ 
+       case '\\':
+         if (*string == 0)
+           return (0);           
+       }
+ 
+       /* Advance one fewer byte than an entire multibyte character to
+        account for the auto-increment in the loop above. */
+ #ifdef HANDLE_MULTIBYTE
+       string--;
+       ADVANCE_CHAR_P (string, send - string);
+       string++;
+ #else
+       ADVANCE_CHAR_P (string, send - string);
+ #endif
+     }
+   return (0);
+ }
+ 
  static char *globtext;
  static char *globorig;
***************
*** 3878,3882 ****
      }      
  
!   if (t && glob_pattern_p (t) == 0)
      rl_explicit_arg = 1;      /* XXX - force glob_complete_word to append `*' 
*/
    FREE (t);
--- 3934,3938 ----
      }      
  
!   if (t && completion_glob_pattern (t) == 0)
      rl_explicit_arg = 1;      /* XXX - force glob_complete_word to append `*' 
*/
    FREE (t);
*** ../bash-5.0/lib/glob/glob_loop.c    2018-12-31 13:35:15.000000000 -0500
--- lib/glob/glob_loop.c        2019-01-09 09:44:36.000000000 -0500
***************
*** 55,59 ****
  
        case L('\\'):
- #if 0
        /* Don't let the pattern end in a backslash (GMATCH returns no match
           if the pattern ends in a backslash anyway), but otherwise return 1,
--- 55,58 ----
***************
*** 61,69 ****
           and it can be removed. */
        return (*p != L('\0'));
- #else
-       /* The pattern may not end with a backslash. */
-       if (*p++ == L('\0'))
-         return 0;
- #endif
        }
  
--- 60,63 ----

Reply via email to