diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-11-09 22:20:12 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-11-09 22:20:12 +0000 |
commit | 536e266e58e6fda550e781d7a88317fdfe149cfa (patch) | |
tree | 5f8b7d80d8817989496ab5eb36cd1c64815de0be /win32 | |
parent | 5ddcc93a3f9ffaeed5a78aa0fa7a847880102600 (diff) | |
download | ruby-536e266e58e6fda550e781d7a88317fdfe149cfa.tar.gz |
* cygwin/GNUmakefile.in (scriptbin): make executable file from
scripts with stub.
* ruby.c (load_file_internal): assume xflag for exe file as well
as no-shebang file.
* tool/rbinstall.rb: install script programs.
* win32/mkexports.rb (Exports#initialize): alias ruby_sysinit for
stub.
* win32/stub.c: stub for scripts. [EXPERIMENTAL]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29738 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'win32')
-rwxr-xr-x | win32/mkexports.rb | 1 | ||||
-rw-r--r-- | win32/stub.c | 42 |
2 files changed, 43 insertions, 0 deletions
diff --git a/win32/mkexports.rb b/win32/mkexports.rb index e96f9339d0..f6d40f8cfb 100755 --- a/win32/mkexports.rb +++ b/win32/mkexports.rb @@ -36,6 +36,7 @@ class Exports def initialize(objs) syms = {} winapis = {} + syms["ruby_sysinit_real"] = "ruby_sysinit" each_export(objs) do |internal, export| syms[internal] = export winapis[$1] = internal if /^_?(rb_w32_\w+)(?:@\d+)?$/ =~ internal diff --git a/win32/stub.c b/win32/stub.c new file mode 100644 index 0000000000..fc82d73e2c --- /dev/null +++ b/win32/stub.c @@ -0,0 +1,42 @@ +#include <ruby.h> +static void stub_sysinit(int *argc, char ***argv); +#define ruby_sysinit stub_sysinit +#include <main.c> +#undef ruby_sysinit + +void +stub_sysinit(int *argc, char ***argv) +{ + char exename[4096]; + size_t lenexe, len0, lenall; + int i, ac; + char **av, *p; + + lenexe = (size_t)GetModuleFileName(NULL, exename, sizeof exename); + ruby_sysinit(argc, argv); + ac = *argc; + av = *argv; + len0 = strlen(av[0]) + 1; + lenall = 0; + for (i = 1; i < ac; ++i) { + lenall += strlen(av[i]) + 1; + } + *argv = av = realloc(av, lenall + (lenexe + 1) * 2 + sizeof(char *) * (i + 2)); + *argc = ++ac; + p = (char *)(av + i + 2); + memmove(p + (lenexe + 1) * 2, (char *)(av + ac) + len0, lenall); + memcpy(p, exename, lenexe); + p[lenexe] = '\0'; + *av++ = p; + p += lenexe + 1; + memcpy(p, exename, lenexe); + p[lenexe] = '\0'; + *av++ = p; + p += lenexe + 1; + while (--i) { + *av++ = p; + p += strlen(p) + 1; + } + *av = NULL; +} + |