Хорошо, так что это в основном то, что мне нужно:
- Я пытаюсь интегрировать 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
`);
}
Textbuf
, вероятно, является выходным диапазоном, аналогичным тому, который я описал в своей статье. Похоже, он использует opSplice вместо .result, чтобы получить строку ответа. - person Adam D. Ruppe   schedule 06.05.2014