javascript – 为一个emscripten HTML程序提供stdin?

我有一个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);
  }
};
上一篇:javascript – 我可以以某种方式构建webassembly代码*而不使用* emscripten“glue”吗?


下一篇:javascript-在asm.js中的函数之间传递双精度数组