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