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.