Merge remote-tracking branch 'origin/master' into windows
[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 char* getHOME(void)
38 {
39     return os_strdup(ConfigVariable::getHOME().c_str());
40 }
41 /*--------------------------------------------------------------------------*/
42 void setHOME(const char* _home)
43 {
44     //add SCI value in context as variable
45     types::String *pS = new types::String(_home);
46     symbol::Context::getInstance()->put(symbol::Symbol("home"), pS);
47
48     ConfigVariable::setHOME(_home);
49 }
50 /*--------------------------------------------------------------------------*/
51 char* computeHOME(void)
52 {
53     char *pstHOME = getenvHOME();
54     if (pstHOME == NULL)
55     {
56         int ierr, iflag = 0;
57         int lbuf = PATH_MAX;
58         char *pstUserProfile = new char[PATH_MAX];
59         getenvc(&ierr, "USERPROFILE", pstUserProfile, &lbuf, &iflag);
60         if (ierr != 1)
61         {
62             return pstUserProfile;
63         }
64         else
65         {
66             /* if USERPROFILE is not defined , we use default profile */
67             getenvc(&ierr, "ALLUSERSPROFILE", pstUserProfile, &lbuf, &iflag);
68             if (ierr != 1)
69             {
70                 return pstUserProfile;
71             }
72             else
73             {
74                 delete[] pstUserProfile;
75                 return NULL;
76             }
77         }
78     }
79     return pstHOME;
80 }
81 /*--------------------------------------------------------------------------*/
82 char* getenvHOME(void)
83 {
84     int ierr, iflag = 0;
85     int lbuf = PATH_MAX;
86     char *Home = new char[PATH_MAX];
87
88     if (Home)
89     {
90         getenvc(&ierr, "HOME", Home, &lbuf, &iflag);
91
92         if (ierr == 1)
93         {
94             delete[] Home;
95             return NULL;
96         }
97     }
98     return Home;
99 }
100 /*--------------------------------------------------------------------------*/
101 void putenvHOME(const char* _home)
102 {
103     char *ShortPath = NULL;
104     char *CopyOfDefaultPath = NULL;
105
106     /* to be sure that it's unix 8.3 format */
107     /* c:/progra~1/scilab-5.0 */
108     BOOL bConvertOK = FALSE;
109     ShortPath = getshortpathname(_home, &bConvertOK);
110
111     CopyOfDefaultPath = new char[strlen(_home) + 1];
112     AntislashToSlash(ShortPath, CopyOfDefaultPath);
113
114     setenvc("HOME", ShortPath);
115
116     delete[] CopyOfDefaultPath;
117     FREE(ShortPath);
118 }
119
120 /*--------------------------------------------------------------------------*/
121 void defineHOME()
122 {
123     char* home = computeHOME();
124     setHOME(home);
125     putenvHOME(home);
126     FREE(home);
127 }