Possible bug in std.path?
Hugo via Digitalmars-d
digitalmars-d at puremagic.com
Sun Jun 19 19:29:15 PDT 2016
On Sunday, 19 June 2016 at 23:01:26 UTC, Adam D. Ruppe wrote:
> On Sunday, 19 June 2016 at 15:36:08 UTC, Hugo wrote:
>> I thought the proper way to call GetCommandLineW was precisely
>> through CommandLineToArgvW, now I am lost.
>
> Typically, yes, but you are saying you don't like what
> CommandLineToArgvW does (it is responsible for handling quotes
> and backslash escapes), so I'm saying you can do it some other
> way.
>
> GetCommandLineW will give you a raw string of what the user
> typed. From there, you can treat it all as one argument or
> split it up however you like.
>
> One potentially simple option would be to preprocess it by
> doing a .replace(`\"`, `\\"`) then pass to CommandLineToArgvW
> to hack in the extra slash... or you could do a simple little
> splitter yourself, something along the lines of:
>
> ---
> bool inQuote;
> size_t startIdx;
> string[] args;
>
> foreach(idx, ch; your_command_line) {
> if(ch == '"')
> inQuote = !inQuote;
> else if(ch == ' ') {
> if(!inQuote) {
> args ~= to!string(your_command_line[startIdx .. idx];
> startIdx = idx + 1;
> }
> }
> }
>
> if(startIdx != your_command_line.length)
> args ~= to!string(your_command_line[startIdx .. $];
> ---
>
> or something along those lines, I didn't actually test that.
>
> (btw the to!string is optional, you could just leave them as
> wstrings)
>
>
> But the idea is to just split on space unless you are inside
> quotes, doing nothing special on backslashes. That'd be what
> you want (I think).
Thanks for the ideas, actually I was trying to do a function
similar to your splitter (but still having some problems with it):
void cleanArgs(in string cmdline, ref string[] args) {
uint argc = 0;
bool inQuotedMode = false;
bool lastCharIsBlank = false;
foreach(char c; cmdline) {
if(c == '"') inQuotedMode = !inQuotedMode;
if(inQuotedMode || (!inQuotedMode && c!=' ')) args[argc] ~= c;
if(!inQuotedMode && c==' ' && !lastCharIsBlank) {
argc++;
lastCharIsBlank = true;
}
}
}
More information about the Digitalmars-d
mailing list