[Lldb-commits] [PATCH] Don't remove backslashes from arguments unless the following char is recognized.

jingham at apple.com jingham at apple.com
Fri Jan 16 14:10:55 PST 2015


If I had a path component that began with a space (dunno if you can do that on Windows) what would I have to do to enter that?

d:\\ foo\bar

?

I guess that's not too horrible...

Jim

> On Jan 16, 2015, at 11:47 AM, Zachary Turner <zturner at google.com> wrote:
> 
> Hi jingham, clayborg,
> 
> This fixes file paths on Windows, as you can now write, for example, d:\foo\bar.txt, but does not break the case that this tokenization logic was originally designed for, which is to allow escaping of things like quotes and double quotes, so that all of the escapable characters can appear in the same string together.
> 
> I think this is a much simpler and more straightforward fix than adding a different tokenizer.  Having only 1 tokenizer means we don't have to worry in the future about tests breaking because someone wrote their test on unix and tried to execute a command with a syntax that wouldn't work on Windows, etc.  So hopefully we can reach an agreement about this fix.
> 
> http://reviews.llvm.org/D7018
> 
> Files:
>  source/Interpreter/Args.cpp
> 
> Index: source/Interpreter/Args.cpp
> ===================================================================
> --- source/Interpreter/Args.cpp
> +++ source/Interpreter/Args.cpp
> @@ -165,7 +165,7 @@
>     if (command && command[0])
>     {
>         static const char *k_space_separators = " \t";
> -        static const char *k_space_separators_with_slash_and_quotes = " \t \\'\"";
> +        static const char *k_escapable_characters = " \t\\'\"";
>         const char *arg_end = nullptr;
>         const char *arg_pos;
>         for (arg_pos = command;
> @@ -201,7 +201,7 @@
> 
>             do
>             {
> -                arg_end = ::strcspn (arg_pos, k_space_separators_with_slash_and_quotes) + arg_pos;
> +                arg_end = ::strcspn (arg_pos, k_escapable_characters) + arg_pos;
> 
>                 switch (arg_end[0])
>                 {
> @@ -215,7 +215,6 @@
>                         arg.append (arg_piece_start);
>                     arg_complete = true;
>                     break;
> -                    
>                 case '\\':
>                     // Backslash character
>                     switch (arg_end[1])
> @@ -227,22 +226,21 @@
>                             break;
> 
>                         default:
> -                            if (quote_char == '\0')
> +                            // Only consider this two-character sequence an escape sequence if we're unquoted and
> +                            // the character after the backslash is a whitelisted escapable character.  Otherwise
> +                            // leave the character sequence untouched.
> +                            if (quote_char == '\0' && (nullptr != strchr(k_escapable_characters, arg_end[1])))
>                             {
>                                 arg.append (arg_piece_start, arg_end - arg_piece_start);
> -                                if (arg_end[1] != '\0')
> -                                {
> -                                    arg.append (arg_end + 1, 1);
> -                                    arg_pos = arg_end + 2;
> -                                    arg_piece_start = arg_pos;
> -                                }
> +                                arg.append (arg_end + 1, 1);
> +                                arg_pos = arg_end + 2;
> +                                arg_piece_start = arg_pos;
>                             }
>                             else
>                                 arg_pos = arg_end + 2;
>                             break;
>                     }
>                     break;
> -                
>                 case '"':
>                 case '\'':
>                 case '`':
> 
> EMAIL PREFERENCES
>  http://reviews.llvm.org/settings/panel/emailpreferences/
> <D7018.18309.patch>





More information about the lldb-commits mailing list