Thanks for working on this :)

On Saturday, 26 March 2016 at 22:37:53 UTC, Johannes Pfau wrote:
I didn't realize response file parsing is that important for windows, thanks for letting me know ;-) I guess there's no proper documentation for response files or any test files?

It uses the CommandLineToArgvW syntax.

That's pretty much all there is to it.

There are some open questions:

* Are escape sequences allowed outside of quoted strings?

Apparently, though rdmd will never generate such response files.

* Which characters end a comment?

There are no comments in response files (as far as I know).

* How does this parse: foo\"bar

foo"bar

* Or this: foo"bar

foobar

I suggest writing a small program to experiment, e.g.

void main(string[] args) { args.each!writeln(); }

BTW:
The DMD implementation is using the backend license, so I
certainly couldn't copy it. It tried to follow clean-room design
principles when reimplementing it (writing a spec first, then using the spec to implement the new parser) and choose a completely different parsing approach (parsing/unescaping separated, range based) so I hope
it's different enough to avoid copyright or licensing issues....

I'm not sure this approach is the best - I think unescaping and splitting should be done in one pass. Essentially, I think arguments are separated by an unescaped space.

If you have a Windows machine, you can verify it yourself by comparing the results with CommandLineToArgvW.

https://github.com/D-Programming-GDC/GDMD/commit/0e2b0744a13a69f9dae90cf5db8c689ccca82f10
It'd be great if you could have a look at the unittests and tell me if
the parsing is correct ;-)

The unit tests *look* OK, but I can't say for sure without having a way to verify them.

I suggest you have a look at the escaping code and tests from std.process. There should be no licensing conflict with Boost, I think. I went to great lengths to ensure that code is correct, there is even a test which brute-forces special character combinations and another that tries random strings to find bugs in the escaping code.

IIRC the simple regex that was in the Perl version of gdmd was also sufficient for parsing the response files generated by rdmd.

Now I still have to generate a response file for passing arguments to GDC. First have to check whether GCC even uses the windows escaping rules though. Do you know how many characters can be passed without response files?

rdmd uses a limit of 1024, but I think that's lower than the OS limit.

Reply via email to