summaryrefslogtreecommitdiff
path: root/win32
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-11-09 22:20:12 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-11-09 22:20:12 +0000
commit536e266e58e6fda550e781d7a88317fdfe149cfa (patch)
tree5f8b7d80d8817989496ab5eb36cd1c64815de0be /win32
parent5ddcc93a3f9ffaeed5a78aa0fa7a847880102600 (diff)
* 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-xwin32/mkexports.rb1
-rw-r--r--win32/stub.c42
2 files changed, 43 insertions, 0 deletions
diff --git a/win32/mkexports.rb b/win32/mkexports.rb
index e96f933..f6d40f8 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 0000000..fc82d73
--- /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;
+}
+