我有一个C程序,它通过命令行接受一个参数(一个char数组/字符串),并从stdin读取.我使用emscripten将其编译为JavaScript.这是成功的,我可以像使用node.js的普通C程序一样运行它:
emcc -O2 translate.c
node translate.js "foo" < bar.txt
如您所见,我提供字符串“foo”作为参数,bar.txt的内容为stdin.现在我希望这是一个自包含的HTML文件.
通过将输出更改为HTML:
emcc -O2 translate.c -o trans.html
我将adding arguments: ['foo'],
的参数提供给var Module中的定义.这按预期工作,程序正确接收参数.
现在,我如何为此程序提供stdin输入?我不需要动态地这样做.只需在HTML中的某个地方声明一个包含所需stdin内容的字符串即可.
编辑
刚刚找到了适合我的解决方案.在生成HTML的JS文件中,有一个默认的输入处理程序,当没有定义其他输入方法时,prompt()是用户.只需编辑变量结果或调用您自己的函数:
} else if (typeof window != 'undefined' &&
typeof window.prompt == 'function') {
// Browser.
// REPLACE THIS CODE:
result = window.prompt('Input: '); // returns null on cancel
if (result !== null) {
result += '\n';
}
解决方法:
一种方法是使用Emscripten Filesystem API,例如在Module preRun函数中调用FS.init,传递用于标准输入,输出和错误的自定义函数.
var Module = {
preRun: function() {
function stdin() {
// Return ASCII code of character, or null if no input
}
function stdout(asciiCode) {
// Do something with the asciiCode
}
function stderr(asciiCode) {
// Do something with the asciiCode
}
FS.init(stdin, stdout, stderr);
}
};
这些函数非常低级:它们每个处理一个字符作为ASCII码.如果您想要传入字符串,则必须自己迭代字符串的字符.我怀疑charCodeAt会有所帮助.要从stdout或stderr输出字符串,我怀疑fromCharCode会有所帮助.
以下是使用各自的示例(未经过很好测试的!)实现.
var input = "This is from the standard input\n";
var i = 0;
var Module = {
preRun: function() {
function stdin() {
if (i < res.length) {
var code = input.charCodeAt(i);
++i;
return code;
} else {
return null;
}
}
var stdoutBuffer = "";
function stdout(code) {
if (code === "\n".charCodeAt(0) && stdoutBuffer !== "") {
console.log(stdoutBuffer);
stdoutBufer = "";
} else {
stdoutBuffer += String.fromCharCode(code);
}
}
var stderrBuffer = "";
function stderr(code) {
if (code === "\n".charCodeAt(0) && stderrBuffer !== "") {
console.log(stderrBuffer);
stderrBuffer = "";
} else {
stderrBuffer += String.fromCharCode(code);
}
}
FS.init(stdin, stdout, stderr);
}
};