summaryrefslogtreecommitdiff
path: root/jni/ruby/win32/stub.c
diff options
context:
space:
mode:
authorJari Vetoniemi <jari.vetoniemi@indooratlas.com>2020-03-16 18:49:26 +0900
committerJari Vetoniemi <jari.vetoniemi@indooratlas.com>2020-03-30 00:39:06 +0900
commitfcbf63e62c627deae76c1b8cb8c0876c536ed811 (patch)
tree64cb17de3f41a2b6fef2368028fbd00349946994 /jni/ruby/win32/stub.c
Fresh start
Diffstat (limited to 'jni/ruby/win32/stub.c')
-rw-r--r--jni/ruby/win32/stub.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/jni/ruby/win32/stub.c b/jni/ruby/win32/stub.c
new file mode 100644
index 0000000..fc82d73
--- /dev/null
+++ b/jni/ruby/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;
+}
+