8c6f8adcb847b5e5be5de879cc9c7e9f1c0f22bc
[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             return NULL;
148         }
149     }
150
151     return SciPath;
152 }
153 /*--------------------------------------------------------------------------*/
154 wchar_t* computeSCIW()
155 {
156     char* pstTemp = computeSCI();
157     wchar_t* pstReturn = to_wide_string(pstTemp);
158     delete[] pstTemp;
159     return pstReturn;
160 }
161 /*--------------------------------------------------------------------------*/
162 //windows : find main DLL and extract path
163 //linux and macos : scilab script fill SCI env variable
164 #ifdef _MSC_VER
165 char* computeSCI()
166 {
167     char ScilabModuleName[MAX_PATH + 1];
168     char drive[_MAX_DRIVE];
169     char dir[_MAX_DIR];
170     char fname[_MAX_FNAME];
171     char ext[_MAX_EXT];
172     char SciPathName[_MAX_DRIVE + _MAX_DIR + 5];
173
174     char *DirTmp = NULL;
175
176     if (!GetModuleFileNameA((HINSTANCE)GetModuleHandleA("core"), ScilabModuleName, MAX_PATH))
177     {
178         return NULL;
179     }
180
181     os_splitpath(ScilabModuleName, drive, dir, fname, ext);
182
183     if (dir[strlen(dir) - 1] == '\\')
184     {
185         dir[strlen(dir) - 1] = '\0';
186     }
187
188     DirTmp = strrchr(dir, '\\');
189     if (strlen(dir) - strlen(DirTmp) > 0)
190     {
191         dir[strlen(dir) - strlen(DirTmp)] = '\0';
192     }
193     else
194     {
195         return NULL;
196     }
197
198     os_makepath(SciPathName, drive, dir, NULL, NULL);
199
200     for (int i = 0 ; i < static_cast<int>(strlen(SciPathName)) ; i++)
201     {
202         if (SciPathName[i] == '\\')
203         {
204             SciPathName[i] = '/';
205         }
206     }
207     SciPathName[strlen(SciPathName) - 1] = '\0';
208     return os_strdup(SciPathName);
209 }
210 #else
211 char* computeSCI()
212 {
213     int ierr, iflag = 0;
214     int lbuf = PATH_MAX;
215     char *SciPathName = new char[PATH_MAX];
216
217     if (SciPathName)
218     {
219         getenvc(&ierr, "SCI", SciPathName, &lbuf, &iflag);
220
221         if (ierr == 1)
222         {
223             std::cerr << "SCI environment variable not defined." << std::endl;
224             exit(1);
225         }
226     }
227
228     return SciPathName;
229 }
230 #endif
231 /*--------------------------------------------------------------------------*/
232 void defineSCI()
233 {
234     wchar_t* sci_path = computeSCIW();
235     setSCIW(sci_path);
236     putenvSCIW(sci_path);
237     FREE(sci_path);
238 }
239