Coverity: ast module resource leaks fixed
[scilab.git] / scilab / modules / ast / src / cpp / system_env / sci_path.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 #include <stdlib.h>
17
18 #include "configvariable.hxx"
19
20 #include "string.hxx"
21 #include "context.hxx"
22
23 extern "C"
24 {
25 #include "sci_malloc.h"
26 #include "sci_path.h"
27 #include "os_string.h"
28 #include "charEncoding.h"
29 #include "PATH_MAX.h"
30 #include "setenvc.h"
31 #include "getenvc.h"
32 #include "setenvvar.h"
33 #include "getshortpathname.h"
34 }
35
36 char *getSCI(void)
37 {
38     return wide_string_to_UTF8(ConfigVariable::getSCIPath().c_str());
39 }
40
41 /*--------------------------------------------------------------------------*/
42 wchar_t *getSCIW(void)
43 {
44     return os_wcsdup(ConfigVariable::getSCIPath().c_str());
45 }
46
47 /*--------------------------------------------------------------------------*/
48 void setSCIW(const wchar_t* _sci_path)
49 {
50     char* pstPath = wide_string_to_UTF8(_sci_path);
51     setSCI(pstPath);
52     FREE(pstPath);
53 }
54 /*--------------------------------------------------------------------------*/
55 void setSCI(const char* _sci_path)
56 {
57     //
58     char *ShortPath = NULL;
59     char *pstSlash = new char[strlen(_sci_path) + 1];
60     BOOL bConvertOK = FALSE;
61     ShortPath = getshortpathname(_sci_path, &bConvertOK);
62     AntislashToSlash(ShortPath, pstSlash);
63
64
65     //SCI
66     wchar_t* pwstSCI = to_wide_string(pstSlash);
67     types::String *pSSCI = new types::String(pwstSCI);
68     symbol::Context::getInstance()->put(symbol::Symbol(L"SCI"), pSSCI);
69
70     //WSCI
71     wchar_t* pwstWSCI = NULL;
72 #ifdef _MSC_VER
73     char *pstBackSlash = NULL;
74     pstBackSlash = new char[strlen(_sci_path) + 1];
75     SlashToAntislash(_sci_path, pstBackSlash);
76     pwstWSCI = to_wide_string(pstBackSlash);
77     types::String *pSWSCI = new types::String(pwstWSCI);
78     symbol::Context::getInstance()->put(symbol::Symbol(L"WSCI"), pSWSCI);
79     delete[] pstBackSlash;
80 #else
81     pwstWSCI = to_wide_string(_sci_path);
82 #endif
83
84     std::wstring wst(pwstWSCI);
85     ConfigVariable::setSCIPath(wst);
86
87     FREE(pwstWSCI);
88     FREE(pwstSCI);
89     if (pstSlash)
90     {
91         delete[] pstSlash;
92     }
93     if (ShortPath)
94     {
95         FREE(ShortPath);
96     }
97 }
98 /*--------------------------------------------------------------------------*/
99 void putenvSCIW(const wchar_t* _sci_path)
100 {
101     char* pstTemp = wide_string_to_UTF8(_sci_path);
102     putenvSCI(pstTemp);
103     FREE(pstTemp);
104     return;
105 }
106 /*--------------------------------------------------------------------------*/
107 void putenvSCI(const char* _sci_path)
108 {
109     char *ShortPath = NULL;
110     char *CopyOfDefaultPath = NULL;
111
112     /* to be sure that it's unix 8.3 format */
113     /* c:/progra~1/scilab-5.0 */
114     BOOL bConvertOK = FALSE;
115     ShortPath = getshortpathname(_sci_path, &bConvertOK);
116
117     CopyOfDefaultPath = new char[strlen(_sci_path) + 1];
118     //GetShortPathName(_sci_path,ShortPath,PATH_MAX);
119     AntislashToSlash(ShortPath, CopyOfDefaultPath);
120
121     setenvc("SCI", ShortPath);
122
123     delete[] CopyOfDefaultPath;
124     FREE(ShortPath);
125 }
126 /*--------------------------------------------------------------------------*/
127 wchar_t* getenvSCIW()
128 {
129     char *SciPath = getenvSCI();
130     wchar_t* pstTemp = to_wide_string(SciPath);
131     delete[] SciPath;
132     return pstTemp;
133 }
134 /*--------------------------------------------------------------------------*/
135 char* getenvSCI()
136 {
137     int ierr, iflag = 0;
138     int lbuf = PATH_MAX;
139     char *SciPath = new char[PATH_MAX];
140
141     if (SciPath)
142     {
143         getenvc(&ierr, "SCI", SciPath, &lbuf, &iflag);
144
145         if (ierr == 1)
146         {
147             delete[] SciPath;
148             return NULL;
149         }
150     }
151
152     return SciPath;
153 }
154 /*--------------------------------------------------------------------------*/
155 wchar_t* computeSCIW()
156 {
157     char* pstTemp = computeSCI();
158     wchar_t* pstReturn = to_wide_string(pstTemp);
159     delete[] pstTemp;
160     return pstReturn;
161 }
162 /*--------------------------------------------------------------------------*/
163 //windows : find main DLL and extract path
164 //linux and macos : scilab script fill SCI env variable
165 #ifdef _MSC_VER
166 char* computeSCI()
167 {
168     char ScilabModuleName[MAX_PATH + 1];
169     char drive[_MAX_DRIVE];
170     char dir[_MAX_DIR];
171     char fname[_MAX_FNAME];
172     char ext[_MAX_EXT];
173     char SciPathName[_MAX_DRIVE + _MAX_DIR + 5];
174
175     char *DirTmp = NULL;
176
177     if (!GetModuleFileNameA((HINSTANCE)GetModuleHandleA("core"), ScilabModuleName, MAX_PATH))
178     {
179         return NULL;
180     }
181
182     os_splitpath(ScilabModuleName, drive, dir, fname, ext);
183
184     if (dir[strlen(dir) - 1] == '\\')
185     {
186         dir[strlen(dir) - 1] = '\0';
187     }
188
189     DirTmp = strrchr(dir, '\\');
190     if (strlen(dir) - strlen(DirTmp) > 0)
191     {
192         dir[strlen(dir) - strlen(DirTmp)] = '\0';
193     }
194     else
195     {
196         return NULL;
197     }
198
199     os_makepath(SciPathName, drive, dir, NULL, NULL);
200
201     for (int i = 0 ; i < static_cast<int>(strlen(SciPathName)) ; i++)
202     {
203         if (SciPathName[i] == '\\')
204         {
205             SciPathName[i] = '/';
206         }
207     }
208     SciPathName[strlen(SciPathName) - 1] = '\0';
209     return os_strdup(SciPathName);
210 }
211 #else
212 char* computeSCI()
213 {
214     int ierr, iflag = 0;
215     int lbuf = PATH_MAX;
216     char *SciPathName = new char[PATH_MAX];
217
218     if (SciPathName)
219     {
220         getenvc(&ierr, "SCI", SciPathName, &lbuf, &iflag);
221
222         if (ierr == 1)
223         {
224             std::cerr << "SCI environment variable not defined." << std::endl;
225             exit(1);
226         }
227     }
228
229     return SciPathName;
230 }
231 #endif
232 /*--------------------------------------------------------------------------*/
233 void defineSCI()
234 {
235     wchar_t* sci_path = computeSCIW();
236     setSCIW(sci_path);
237     putenvSCIW(sci_path);
238     FREE(sci_path);
239 }
240