如何将Facebook / Warp输出变成字符串?

时间:2014-05-06 15:52:20

标签: d dmd

好的,所以这基本上就是我所需要的:

  • 我试图将Warp(https://github.com/facebook/warp)整合到我的D项目中
  • 我需要将(预处理的)输出变成一个字符串,而不是一个文件(就像现在一样)

我已经很好地了解了消息来源,但不是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
`);
}

1 个答案:

答案 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;

或类似的东西。