diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | ruby.c | 54 |
2 files changed, 48 insertions, 11 deletions
@@ -1,8 +1,11 @@ -Sun May 1 09:13:23 2005 Nobuyoshi Nakada <nobu@ruby-lang.org> +Sun May 1 09:58:11 2005 Nobuyoshi Nakada <nobu@ruby-lang.org> * ruby.c (process_sflag): replace '-' in variable names with '_'. [ruby-dev:26107] + * ruby.c (set_arg0): use also environment variable space for setting + $0. [ruby-core:04774] + Wed Apr 27 23:42:22 2005 Nobuyoshi Nakada <nobu@ruby-lang.org> * win32/Makefile.sub (OPTFLAGS): default global optimization to @@ -968,6 +968,33 @@ VALUE rb_progname; VALUE rb_argv; VALUE rb_argv0; +#if !defined(PSTAT_SETCMD) && !defined(HAVE_SETPROCTITLE) && !defined(DOSISH) +static struct { + char *begin, *end; +} envspace; +extern char **environ; + +static void +set_arg0space() +{ + char *s; + int i; + + if (!environ || (s = environ[0]) == NULL) return; + envspace.begin = s; + s += strlen(s); + for (i = 1; environ[i]; i++) { + if (environ[i] == s + 1) { + s++; + s += strlen(s); /* this one is ok too */ + } + } + envspace.end = s; +} +#else +#define set_arg0space() ((void)0) +#endif + static void set_arg0(val, id) VALUE val; @@ -981,19 +1008,19 @@ set_arg0(val, id) StringValue(val); s = RSTRING(val)->ptr; i = RSTRING(val)->len; -#ifdef __hpux +#if defined(PSTAT_SETCMD) if (i >= PST_CLEN) { - union pstun j; - j.pst_command = s; - i = PST_CLEN; - RSTRING(val)->len = i; - *(s + i) = '\0'; - pstat(PSTAT_SETCMD, j, PST_CLEN, 0, 0); + union pstun j; + j.pst_command = s; + i = PST_CLEN; + RSTRING(val)->len = i; + *(s + i) = '\0'; + pstat(PSTAT_SETCMD, j, PST_CLEN, 0, 0); } else { - union pstun j; - j.pst_command = s; - pstat(PSTAT_SETCMD, j, i, 0, 0); + union pstun j; + j.pst_command = s; + pstat(PSTAT_SETCMD, j, i, 0, 0); } rb_progname = rb_tainted_str_new(s, i); #elif defined(HAVE_SETPROCTITLE) @@ -1015,6 +1042,12 @@ set_arg0(val, id) break; } } +#ifndef DOSISH + if (s + 1 == envspace.begin) { + s = envspace.end; + ruby_setenv("", NULL); /* duplicate environ vars */ + } +#endif len = s - origargv[0]; } @@ -1150,6 +1183,7 @@ ruby_process_options(argc, argv) #if defined(USE_DLN_A_OUT) dln_argv0 = argv[0]; #endif + set_arg0space(); proc_options(argc, argv); if (do_check && ruby_nerrs == 0) { |