emscriptenのファイルIO

emscriptenのファイルIOってどうなってるんじゃと思って調べてみた。

手順的にはこんな感じ。
1. file IOを行うcファイル(file.c)を作る
2. emscriptenで生成したファイルが事前に読み込むjsファイル(pre.js)を作る
3. ラップする(header.js, footer.js)

まずはc言語で簡単なファイルIOを行うプログラムを書いてみる。inputというファイルからデータを読み取りoutputというファイルにデータを書き込む。
#include <stdio.h>

int main(void){
FILE *i, *o;
int c;

i = fopen("input", "r");
o = fopen("output", "w");

while((c = fgetc(i)) != EOF) fputc(c, o);
fclose(i);
fclose(o);

return 0;
}


次にpre.js。emscriptenではファイルシステムAPIを用いて仮想のファイルシステムにアクセスできる。そのAPIを用いてinput,outputにアクセスする。詳しくはFilesystem Guide ・ kripken/emscripten Wikiをみてね。
Module['preRun'] = function(){
FS.createDataFile(
'/',
'input',
Module['input'], //引数から入力できるようにするためのもの
true,
true
);
FS.createDataFile(
'/',
'output',
null,
true,
true
);
Module['ret'] = function(){
return FS.findObject("/output").contents; //最終的に返り値になる
};
};

最後にラップしてようやくブラウザから使える。こんな感じ。なんとなくわかるよね。
header.js
function fileio(input){
var Module = { //さきにModule作っちゃう
input: input //pre.jsで読み込まれる
};
arguments = [];//こうしないとmain関数のargvとして読み込まれるので注意

footer.js
return Module.ret();
}

最後に生成しておわり。
emcc -O2 file.c -o file.raw.js --pre-js pre.js
cat header.js file.raw.js footer.js > file.js

使い方:
var xhr = new XMLHttpRequest;
xhr.open("GET", url);
xhr.responseType = "arratbuffer";
xhr.onload = function(){
var a = fileio(new Uint8Array(xhr.response));
//なにか処理
};
xhr.send();

参考:
azakai: HOWTO: Port a C/C++ Library to JavaScript (xml.js)





posted by 右京 | javascript
blog comments powered by Disqus
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。