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 <[email protected]> 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>


_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits

Reply via email to