[前][次][番号順一覧][スレッド一覧]

ruby-changes:15008

From: nobu <ko1@a...>
Date: Fri, 12 Mar 2010 07:25:41 +0900 (JST)
Subject: [ruby-changes:15008] Ruby:r26883 (trunk): * win32/win32.c (init_env): get rid of alloca() for outer string.

nobu	2010-03-12 07:25:22 +0900 (Fri, 12 Mar 2010)

  New Revision: 26883

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=26883

  Log:
    * win32/win32.c (init_env): get rid of alloca() for outer string.

  Modified files:
    trunk/ChangeLog
    trunk/win32/win32.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 26882)
+++ ChangeLog	(revision 26883)
@@ -1,3 +1,7 @@
+Fri Mar 12 07:25:16 2010  Nobuyoshi Nakada  <nobu@r...>
+
+	* win32/win32.c (init_env): get rid of alloca() for outer string.
+
 Fri Mar 12 07:17:15 2010  Nobuyoshi Nakada  <nobu@r...>
 
 	* ext/racc/cparse/cparse.c: suppressed warnings for shortening on
Index: win32/win32.c
===================================================================
--- win32/win32.c	(revision 26882)
+++ win32/win32.c	(revision 26883)
@@ -434,11 +434,19 @@
 init_env(void)
 {
     static const WCHAR TMPDIR[] = L"TMPDIR";
-    WCHAR env[_MAX_PATH];
-    WCHAR *buf;
+    struct {WCHAR name[6], eq, val[_MAX_PATH];} wk;
     DWORD len;
     BOOL f;
+#define env wk.val
+#define set_env_val(vname) do { \
+	typedef char namesizecheck[numberof(wk.name) < numberof(vname) - 1 ? -1 : 1]; \
+	WCHAR *const buf = wk.name + numberof(wk.name) - numberof(vname); \
+	MEMCPY(buf, vname, WCHAR, numberof(vname) - 1); \
+	_wputenv(buf); \
+    } while (0)
 
+    wk.eq = L'=';
+
     if (!GetEnvironmentVariableW(L"HOME", env, numberof(env))) {
 	f = FALSE;
 	if (GetEnvironmentVariableW(L"HOMEDRIVE", env, numberof(env)))
@@ -459,9 +467,7 @@
 	}
 	if (f) {
 	    regulate_path(env);
-	    buf = ALLOCA_N(WCHAR, 5 + lstrlenW(env) + 1);
-	    wsprintfW(buf, L"HOME=%s", env);
-	    _wputenv(buf);
+	    set_env_val(L"HOME");
 	}
     }
 
@@ -471,9 +477,7 @@
 	    NTLoginName = "<Unknown>";
 	    return;
 	}
-	buf = ALLOCA_N(WCHAR, 5 + lstrlenW(env) + 1);
-	wsprintfW(buf, L"USER=%s", env);
-	_wputenv(buf);
+	set_env_val(L"USER");
     }
     NTLoginName = strdup(rb_w32_getenv("USER"));
 
@@ -487,11 +491,12 @@
 	if (*(p - 1) != L'/') *p++ = L'/';
 	if (p - env + numberof(temp) < numberof(env)) {
 	    memcpy(p, temp, sizeof(temp));
-	    buf = ALLOCA_N(WCHAR, lstrlenW(TMPDIR) + 1 + lstrlenW(env) + 1);
-	    wsprintfW(buf, L"%s=%s", TMPDIR, env);
-	    _wputenv(buf);
+	    set_env_val(TMPDIR);
 	}
     }
+
+#undef env
+#undef set_env_val
 }
 
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]