好的,所以这基本上就是我所需要的:
我已经很好地了解了消息来源,但不是D大师,我想我可能会遗漏一些明显的东西。
密钥可能在main.d
:
auto foutr = fout.lockingTextWriter(); // has destructor
context.localStart(sf, &foutr);
context.preprocess();
context.localFinish();
context.localStart()
期望alias typeof(File.lockingTextWriter()) R;
作为第二个参数(输出流?)。
然而,我简单无法在文档中的任何地方发现。
有什么想法吗?
更新
我想我非常关闭;一旦我100%肯定,我会发布一个完整的解决方案。但这是我在context.d
中发现的(单位测试是找到有用代码的好地方,当然!哈哈)
version (unittest)
{
void testPreprocess(const Params params, string src, string result)
{
uchar[100] tmpbuf = void;
auto outbuf = Textbuf!uchar(tmpbuf);
auto context = Context!(Textbuf!uchar)(params);
// Create a fake source file with contents
auto sf = SrcFile.lookup("test.c");
sf.contents = cast(ustring)src;
context.localStart(sf, &outbuf);
context.preprocess();
context.expanded.finish();
if (outbuf[] != result)
writefln("output = |%s|", outbuf[]);
assert(outbuf[] == result);
}
}
version (all)
{
unittest
{
const Params params;
testPreprocess(params,
"asdf\r
asd\\\r
ff\r
",
`# 2 "test.c"
asdf
# 3 "test.c"
asdff
`);
}
答案 0 :(得分:2)
我实际上没有看过这段代码,但是lockingTextWriter
是D所谓的输出范围。
它只是一个带有名为put
的方法的结构,它接受一个字符串作为参数。因此,您可以通过执行以下操作将信息作为字符串获取:
struct StringSink {
string result;
void put(in char[] s) { result ~= s; }
}
StringSink sink;
context.localStart(sf, &sink);
.....
string result = sink.result;
或类似的东西。