allow to setenv under Windows to exceed 32767 characters, remove calls to putenv... 57/11057/2
Antoine ELIAS [Wed, 27 Mar 2013 14:17:24 +0000 (15:17 +0100)]
Change-Id: I2da75379223ffab4f7e5ec5da7d00cf9474d83a8

scilab/modules/io/src/c/getenvc.c
scilab/modules/io/src/c/setenvc.c
scilab/modules/io/tests/unit_tests/getenv.dia.ref
scilab/modules/io/tests/unit_tests/getenv.tst

index d14061e..b09bc8f 100644 (file)
@@ -34,55 +34,46 @@ static void searchenv_others(const char *filename, const char *varname,
 void C2F(getenvc)(int *ierr, char *var, char *buf, int *buflen, int *iflag)
 {
 #ifdef _MSC_VER
-
-
-    BOOL bMalloc = FALSE;
+    wchar_t* wbuf = NULL;
     wchar_t *wvar = to_wide_string(var);
-    wchar_t *wbuf = _wgetenv(wvar);
+    char* temp = NULL;
+    DWORD iLen = GetEnvironmentVariableW(wvar, NULL, 0);
 
     *ierr = 0;
-    if (wbuf == NULL)
+
+    if (iLen == 0)
     {
-        DWORD iLen = GetEnvironmentVariableW(wvar, NULL, 0);
-        bMalloc = TRUE;
-        if (iLen == 0)
+        if (*iflag == 1)
         {
-            if ( *iflag == 1 )
-            {
-                sciprint(_("Undefined environment variable %s.\n"), var);
-            }
-            *ierr = 1;
+            sciprint(_("Undefined environment variable %s.\n"), var);
         }
-        else
+
+        *ierr = 1;
+        return;
+    }
+    else
+    {
+        wbuf = (wchar_t*)MALLOC(sizeof(wchar_t) * iLen);
+        if (GetEnvironmentVariableW(wvar, wbuf, iLen) == 0)
         {
-            *buflen = iLen;
-            wbuf = (wchar_t*)MALLOC(sizeof(wchar_t) * *buflen);
-            if (GetEnvironmentVariableW(wvar, wbuf, (DWORD)*buflen) == 0)
+            if (*iflag == 1)
             {
-                if ( *iflag == 1 )
-                {
-                    sciprint(_("Undefined environment variable %s.\n"), var);
-                }
-                *ierr = 1;
+                sciprint(_("Undefined environment variable %s.\n"), var);
             }
-        }
-    }
 
-    if (*ierr != 1)
-    {
-        *buflen = (int)wcslen(wbuf);
-        if (buf)
-        {
-            char* temp = wide_string_to_UTF8(wbuf);
-            strcpy(buf, temp);
-            *ierr = 0;
+            *ierr = 1;
+            return;
         }
     }
 
-    if (bMalloc)
+    temp = wide_string_to_UTF8(wbuf);
+    *buflen = (int)strlen(temp);
+    if (buf)
     {
-        FREE(wbuf);
+        strcpy(buf, temp);
     }
+
+    FREE(temp);
 #else
     char *locale = NULL;
     locale = getenv(var);
index c960fa5..4044765 100644 (file)
 #include "MALLOC.h" /* MALLOC */
 #include "charEncoding.h"
 /*--------------------------------------------------------------------------*/
-BOOL setenvc(char *stringIn,char *valueIn)
+BOOL setenvc(char *stringIn, char *valueIn)
 {
     BOOL ret = TRUE;
     int len_env = 0;
     wchar_t* env;
 #ifdef _MSC_VER
     {
-        /*
-        On Windows :
-        each process has two copies of the environment variables,
-        one managed by the OS and one managed by the C library. We set
-        the value in both locations, so that other software that looks in
-        one place or the other is guaranteed to see the value.
-        */
-
-        #define ENV_FORMAT L"%s=%s"
         wchar_t* wstringIn = to_wide_string(stringIn);
         wchar_t* wvalueIn = to_wide_string(valueIn);
-
-        len_env = (int) (wcslen(wstringIn) + wcslen(wvalueIn) + wcslen(ENV_FORMAT)) + 1;
-        if (len_env < _MAX_ENV)
-        {
-
-            if (SetEnvironmentVariableW(wstringIn,wvalueIn) == 0)
-            {
-                ret = FALSE;
-            }
-
-            env = (wchar_t*) MALLOC(len_env * sizeof(wchar_t));
-            if (env)
-            {
-                swprintf(env, len_env, L"%s=%s", wstringIn, wvalueIn);
-                if(_wputenv(env))
-                {
-                    ret = FALSE;
-                }
-
-                FREE(env);env = NULL;
-            }
-        }
-        else ret = FALSE;
+        ret = SetEnvironmentVariableW(wstringIn, wvalueIn);
+        FREE(wstringIn);
+        FREE(wvalueIn);
     }
 #else
     /* linux and Mac OS X */
     /* setenv() function is strongly preferred to putenv() */
     /* http://developer.apple.com/documentation/Darwin/Reference/ManPages/man3/setenv.3.html */
 
-#ifndef _MAX_ENV 
+#ifndef _MAX_ENV
 #define _MAX_ENV 32767
 #endif
 
     len_env = (int)(strlen(stringIn) + strlen(valueIn) + 1);
     if (len_env < _MAX_ENV)
     {
-        if ( setenv(stringIn, valueIn, 1) ) 
+        if ( setenv(stringIn, valueIn, 1) )
         {
             ret = FALSE;
         }
     }
-    else ret = FALSE;
+    else
+    {
+        ret = FALSE;
+    }
 
 #endif
 
-    if(ret)
+    if (ret)
     {
-        dynamic_setenvtcl(stringIn,valueIn);
+        dynamic_setenvtcl(stringIn, valueIn);
     }
 
     return ret;
index 75c3111..3a3223e 100644 (file)
@@ -25,10 +25,16 @@ ierr = execstr("b = getenv(4,3);","errcatch");
 if ierr <> 999 then bugmes();quit;end
 ierr = execstr("b = getenv(''FOO'');","errcatch");
 if ierr <> 999 then bugmes();quit;end
-if getenv('FOO','foo')  <> 'foo' then bugmes();quit;end
+if getenv('FOO','foo') <> 'foo' then bugmes();quit;end
 A = 1:100000;
 B = strcat(string(A),'');
 ierr = execstr('r = setenv(''TEST_FOO'',B);','errcatch');
 if ierr <> 0 then bugmes();quit;end
-if r <> %F then bugmes();quit;end
-if getenv('TEST_FOO','')<> '' then bugmes();quit;end
+//SetEnvironmentVaraible ( setenv on windows ) is able to set variable > 32767 ( _MAX_ENV )
+if getos() <> "Windows" then
+    if r <> %F then bugmes();quit;end
+    if getenv('TEST_FOO','') <> '' then bugmes();quit;end
+else
+    if r <> %T then bugmes();quit;end
+    if getenv('TEST_FOO','') <> B then bugmes();quit;end
+end
index 0b00e4b..a22f46a 100644 (file)
@@ -35,13 +35,21 @@ if ierr <> 999 then pause,end
  
 ierr = execstr("b = getenv(''FOO'');","errcatch");
 if ierr <> 999 then pause,end
-if getenv('FOO','foo')  <> 'foo' then pause,end
+if getenv('FOO','foo') <> 'foo' then pause,end
 
 A = 1:100000;
 B = strcat(string(A),'');
+
 ierr = execstr('r = setenv(''TEST_FOO'',B);','errcatch');
 if ierr <> 0 then pause,end
-if r <> %F then pause,end
 
-if getenv('TEST_FOO','')<> '' then pause,end
+//SetEnvironmentVaraible ( setenv on windows ) is able to set variable > 32767 ( _MAX_ENV )
+if getos() <> "Windows" then
+    if r <> %F then pause,end
+    if getenv('TEST_FOO','') <> '' then pause,end
+else
+    if r <> %T then pause,end
+    if getenv('TEST_FOO','') <> B then pause,end
+end
+
  
\ No newline at end of file