Fix test on win 64b : test_run(io, getenv)
[scilab.git] / scilab / modules / io / src / c / setenvc.c
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2005 - INRIA - Allan CORNET
4 *
5 * This file must be used under the terms of the CeCILL.
6 * This source file is licensed as described in the file COPYING, which
7 * you should have received as part of this distribution.  The terms
8 * are also available at
9 * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10 *
11 */
12
13 #ifdef _MSC_VER
14 #include <windows.h>
15 #endif
16 #include <stdlib.h>
17 #include <stdio.h>
18 #include <string.h>
19 #include "setenvc.h"
20 #include "../../../core/src/c/dynamic_tclsci.h"
21 #include "MALLOC.h" /* MALLOC */
22 #include "charEncoding.h"
23 /*--------------------------------------------------------------------------*/
24 BOOL setenvc(char *stringIn,char *valueIn)
25 {
26     BOOL ret = TRUE;
27     int len_env = 0;
28     wchar_t* env;
29 #ifdef _MSC_VER
30     {
31         /*
32         On Windows :
33         each process has two copies of the environment variables,
34         one managed by the OS and one managed by the C library. We set
35         the value in both locations, so that other software that looks in
36         one place or the other is guaranteed to see the value.
37         */
38
39         #define ENV_FORMAT L"%s=%s"
40         wchar_t* wstringIn = to_wide_string(stringIn);
41         wchar_t* wvalueIn = to_wide_string(valueIn);
42
43         len_env = (int) (wcslen(wstringIn) + wcslen(wvalueIn) + wcslen(ENV_FORMAT)) + 1;
44         if (len_env < _MAX_ENV)
45         {
46
47             if (SetEnvironmentVariableW(wstringIn,wvalueIn) == 0)
48             {
49                 ret = FALSE;
50             }
51
52             env = (wchar_t*) MALLOC(len_env * sizeof(wchar_t));
53             if (env)
54             {
55                 swprintf(env, len_env, L"%s=%s", wstringIn, wvalueIn);
56                 if(_wputenv(env))
57                 {
58                     ret = FALSE;
59                 }
60
61                 FREE(env);env = NULL;
62             }
63         }
64         else ret = FALSE;
65     }
66 #else
67     /* linux and Mac OS X */
68     /* setenv() function is strongly preferred to putenv() */
69     /* http://developer.apple.com/documentation/Darwin/Reference/ManPages/man3/setenv.3.html */
70
71 #ifndef _MAX_ENV 
72 #define _MAX_ENV 32767
73 #endif
74
75     len_env = (int)(strlen(stringIn) + strlen(valueIn) + 1);
76     if (len_env < _MAX_ENV)
77     {
78         if ( setenv(stringIn, valueIn, 1) ) 
79         {
80             ret = FALSE;
81         }
82     }
83     else ret = FALSE;
84
85 #endif
86
87     if(ret)
88     {
89         dynamic_setenvtcl(stringIn,valueIn);
90     }
91
92     return ret;
93 }
94 /*--------------------------------------------------------------------------*/