Emscripten Filesystem API を使用する方法があります。たとえば、モジュールの preRun 関数でFS.initを呼び出し、カスタム関数を標準入力として渡します。
var Module = {
preRun: function() {
function stdin() {
// Return ASCII code of character, or null if no input
}
var stdout = null; // Keep as default
var stderr = null; // Keep as default
FS.init(stdin, stdout, stderr);
}
};
この関数は非常に低レベルです: 一度に 1 文字を処理する必要があります。BLOB からデータを読み取るには、次のようにします。
var data = new Int8Array([1,2,3,4,5]);
var blob = new Blob([array], {type: 'application/octet-binary'});
var reader = new FileReader();
var result;
reader.addEventListener("loadend", function() {
result = new Int8Array(reader.result);
});
var i = 0;
var Module = {
preRun: function() {
function stdin() {
if (if < result.byteLength {
var code = result[i];
++i;
return code;
} else {
return null;
}
}
var stdout = null; // Keep as default
var stderr = null; // Keep as default
FS.init(stdin, stdout, stderr);
}
};
注意してください (示唆したように)、リーダーの非同期の性質により、競合状態が発生する可能性があります。標準入力でデータを期待できるようになる前に、リーダーがロードされている必要があります。実際のケースでは、これを回避するために何らかのメカニズムを実装する必要があるかもしれません。main()
正確な要件に応じて、データを取得するまでEmscripten プログラムが実際に呼び出さないようにすることができます。
var fileRead = false;
var initialised = false;
var result;
var array = new Int8Array([1,2,3,4,5]);
var blob = new Blob([array], {type: 'application/octet-binary'});
var reader = new FileReader();
reader.addEventListener("loadend", function() {
result = new Int8Array(reader.result);
fileRead = true;
runIfCan();
});
reader.readAsArrayBuffer(blob);
var i = 0;
var Module = {
preRun: function() {
function stdin() {
if (i < result.byteLength)
{
var code = result[i];
++i;
return code;
} else{
return null;
}
}
var stdout = null;
var stderr = null;
FS.init(stdin, stdout, stderr);
initialised = true;
runIfCan();
},
noInitialRun: true
};
function runIfCan() {
if (fileRead && initialised) {
// Module.run() doesn't seem to work here
Module.callMain();
}
}
注: これは、emscripten HTML プログラムに stdin を提供していますか?での私の回答のバージョンです。、ただし、標準入力に焦点を当て、Blob からのデータの受け渡しに関する部分を追加します。