前提
mruby-ioが組み込まれたmrubyである事が必要です。
Rubyだと
puts File.realpath("./foo.txt")
やってみた
mrb_module_getとmrb_class_getの使い分けが実行時に怒られるか怒られないかで
体で覚えてる段階です。
#include <stdio.h>
#include "mruby.h"
#include "mruby/compile.h"
#include "mruby/string.h"
void main() {
mrb_state *mrb;
mrb_value val;
char *filepath = "./foo.txt";
mrb = mrb_open();
val = mrb_funcall(mrb, mrb_obj_value(mrb_class_get(mrb, "File")), "realpath", 1,
mrb_str_new_cstr(mrb, filepath));
char *fullpath = mrb_string_value_ptr(mrb, val);
printf("%s\n", fullpath);
}
必要になったmrubyのAPI
- mrb_open
- mrb_funcall
- mrb_obj_value
- mrb_class_get
- mrb_str_new_cstr
- mrb_string_value_ptr
ビルド
mrubyにもpkg-config風のmruby-configがあるので、意外と簡単。
gcc mrubyFile.c `mruby/bin/mruby-config --cflags --ldflags --libs --ldflags-before-libs`
関連投稿
- mrubyでC言語のソースにrubyスクリプトを埋め込むには - Qiita
- mrubyにCで追加したメソッドで文字列を返すには - Qiita
- mrbgemsでC++のAPIを呼ぶgemを作るには - Qiita