summaryrefslogtreecommitdiff
path: root/mini_builtin.c
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2019-11-09 06:55:38 +0900
committerKoichi Sasada <ko1@atdot.net>2019-11-09 06:57:58 +0900
commitdfac2e9eb3d697e56d91151584f1d3cf9d2c79c9 (patch)
tree156ddf1a1a70223dfbd4f73737dce57e4f4d082a /mini_builtin.c
parent3b6954f8b9189f599e1f17636f8667a95ee94193 (diff)
don't embed full-path.
miniruby load *.rb from srcdir. To specify file path, tool/mk_builtin_loader.rb embed full path of each *.rb file. However it prevent to pre-generation of required files for tarball. This patch generate srcdir/*.rb from __FILE__ information.
Diffstat (limited to 'mini_builtin.c')
-rw-r--r--mini_builtin.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/mini_builtin.c b/mini_builtin.c
index dc95919da2..060c955fcb 100644
--- a/mini_builtin.c
+++ b/mini_builtin.c
@@ -36,12 +36,23 @@ read_file(const char *fname, size_t *psize)
}
static struct st_table *loaded_builtin_table;
+static char srcdir[0x200];
+static const char fname[] = "mini_builtin.c";
+
+static const char *
+feature_path(const char *name)
+{
+ static char path[0x200];
+ snprintf(path, 0x200-1, "%s%s.rb", srcdir, name);
+ // fprintf(stderr, "srcdir:%s, path:%s, PATH_SEP_CHAR:%c\n", srcdir, path, PATH_SEP_CHAR);
+ return path;
+}
void
-rb_load_with_builtin_functions(const char *feature_name, const char *fname, const struct rb_builtin_function *table)
+rb_load_with_builtin_functions(const char *feature_name, const struct rb_builtin_function *table)
{
size_t fsize;
- const char *code = read_file(fname, &fsize);
+ const char *code = read_file(feature_path(feature_name), &fsize);
VALUE code_str = rb_utf8_str_new_static(code, fsize);
VALUE name_str = rb_sprintf("<internal:%s>", feature_name);
rb_obj_hide(code_str);
@@ -86,4 +97,15 @@ Init_builtin(void)
{
rb_define_singleton_method(rb_cRubyVM, "each_builtin", each_builtin, 0);
loaded_builtin_table = st_init_strtable();
+
+ // check srcdir
+ // assume __FILE__ encoding is ASCII compatible.
+ int pos = strlen(__FILE__) - strlen(fname);
+ if (pos < 0) rb_bug("strlen(%s) - strlen(%s) < 0", __FILE__, fname);
+
+ if (strcmp(__FILE__ + pos, fname) != 0) {
+ rb_bug("%s does not terminate with %s\n", __FILE__, fname);
+ }
+ strncpy(srcdir, __FILE__, 0x200-1);
+ srcdir[pos] = 0;
}