Coverity: ast module resource leaks fixed
[scilab.git] / scilab / modules / ast / src / cpp / system_env / home.cpp
1 /*
2 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 *  Copyright (C) 2010 - DIGITEO - Antoine ELIAS
4 *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13 *
14 */
15
16
17 #include "configvariable.hxx"
18 #include "string.hxx"
19 #include "context.hxx"
20
21 extern "C"
22 {
23 #include "home.h"
24 #include "sci_malloc.h"
25 #include "os_string.h"
26 #include "charEncoding.h"
27 #include "PATH_MAX.h"
28 #include "machine.h"
29 #include "version.h"
30 #include "setenvc.h"
31 #include "getenvc.h"
32 #include "setenvvar.h"
33 #include "getshortpathname.h"
34 }
35
36 /*--------------------------------------------------------------------------*/
37 wchar_t* getHOMEW(void)
38 {
39     return os_wcsdup(ConfigVariable::getHOME().c_str());
40 }
41 /*--------------------------------------------------------------------------*/
42 char* getHOME(void)
43 {
44     return wide_string_to_UTF8(ConfigVariable::getHOME().c_str());
45 }
46 /*--------------------------------------------------------------------------*/
47 void setHOME(const char* _home)
48 {
49     wchar_t* pstTemp = to_wide_string(_home);
50     setHOMEW(pstTemp);
51     FREE(pstTemp);
52 }
53 /*--------------------------------------------------------------------------*/
54 void setHOMEW(const wchar_t* _home)
55 {
56     //add SCI value in context as variable
57     types::String *pS = new types::String(_home);
58     symbol::Context::getInstance()->put(symbol::Symbol(L"home"), pS);
59
60     std::wstring home(_home);
61     ConfigVariable::setHOME(home);
62 }
63
64 /*--------------------------------------------------------------------------*/
65 wchar_t* computeHOMEW(void)
66 {
67     char* pstTemp = computeHOME();
68     wchar_t* pstReturn = to_wide_string(pstTemp);
69     delete[] pstTemp;
70     return pstReturn;
71 }
72 /*--------------------------------------------------------------------------*/
73 char* computeHOME(void)
74 {
75     char *pstHOME = getenvHOME();
76     if (pstHOME == NULL)
77     {
78         int ierr, iflag = 0;
79         int lbuf = PATH_MAX;
80         char *pstUserProfile = new char[PATH_MAX];
81         getenvc(&ierr, "USERPROFILE", pstUserProfile, &lbuf, &iflag);
82         if (ierr != 1)
83         {
84             return pstUserProfile;
85         }
86         else
87         {
88             /* if USERPROFILE is not defined , we use default profile */
89             getenvc(&ierr, "ALLUSERSPROFILE", pstUserProfile, &lbuf, &iflag);
90             if (ierr != 1)
91             {
92                 return pstUserProfile;
93             }
94             else
95             {
96                 delete[] pstUserProfile;
97                 return NULL;
98             }
99         }
100     }
101     return pstHOME;
102 }
103 /*--------------------------------------------------------------------------*/
104 char* getenvHOME(void)
105 {
106     int ierr, iflag = 0;
107     int lbuf = PATH_MAX;
108     char *Home = new char[PATH_MAX];
109
110     if (Home)
111     {
112         getenvc(&ierr, "HOME", Home, &lbuf, &iflag);
113
114         if (ierr == 1)
115         {
116             delete[] Home;
117             return NULL;
118         }
119     }
120     return Home;
121 }
122 /*--------------------------------------------------------------------------*/
123 wchar_t* getenvHOMEW(void)
124 {
125     char *Home = getenvHOME();
126     wchar_t* pstTemp = to_wide_string(Home);
127     delete[] Home;
128     return pstTemp;
129 }
130 /*--------------------------------------------------------------------------*/
131 void putenvHOMEW(const wchar_t* _home)
132 {
133     char* pstTemp = wide_string_to_UTF8(_home);
134     putenvHOME(pstTemp);
135     FREE(pstTemp);
136     return;
137 }
138
139 void putenvHOME(const char* _home)
140 {
141     char *ShortPath = NULL;
142     char *CopyOfDefaultPath = NULL;
143
144     /* to be sure that it's unix 8.3 format */
145     /* c:/progra~1/scilab-5.0 */
146     BOOL bConvertOK = FALSE;
147     ShortPath = getshortpathname(_home, &bConvertOK);
148
149     CopyOfDefaultPath = new char[strlen(_home) + 1];
150     AntislashToSlash(ShortPath, CopyOfDefaultPath);
151
152     setenvc("HOME", ShortPath);
153
154     delete[] CopyOfDefaultPath;
155     FREE(ShortPath);
156 }
157
158 /*--------------------------------------------------------------------------*/
159 void defineHOME()
160 {
161     wchar_t* home = computeHOMEW();
162     setHOMEW(home);
163     putenvHOMEW(home);
164     FREE(home);
165 }