utf: io 2
[scilab.git] / scilab / modules / io / src / c / getenvc.c
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2006 - INRIA
4 * Copyright (C) 2008 - INRIA - Allan CORNET
5 *
6 * This file must be used under the terms of the CeCILL.
7 * This source file is licensed as described in the file COPYING, which
8 * you should have received as part of this distribution.  The terms
9 * are also available at
10 * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
11 *
12 */
13
14 #include <stdlib.h>
15 #include <string.h> /* strlen */
16 #ifdef _MSC_VER
17 #include <Windows.h> /* GetEnvironmentVariable */
18 #endif
19 #include "os_string.h"
20 #include "sci_malloc.h"
21 #include "getenvc.h"
22 #include "localization.h"
23 #include "sciprint.h"
24 #include "PATH_MAX.h"
25 #include "FileExist.h"
26 #include "charEncoding.h"
27
28 /*--------------------------------------------------------------------------*/
29 #ifndef _MSC_VER
30 static void searchenv_others(const char *filename, const char *varname,
31                              char *pathname);
32 #endif
33 /*--------------------------------------------------------------------------*/
34 void getenvc(int *ierr, const char *var, char *buf, int *buflen, int *iflag)
35 {
36 #ifdef _MSC_VER
37     DWORD iLen = GetEnvironmentVariableA(var, NULL, 0);
38
39     *ierr = 0;
40     char* tmpbuf = NULL;
41
42     if (iLen == 0)
43     {
44         if (*iflag == 1)
45         {
46             sciprint(_("Undefined environment variable %s.\n"), var);
47         }
48
49         *ierr = 1;
50         return;
51     }
52
53     tmpbuf = (char*)MALLOC(sizeof(char) * iLen);
54     if (GetEnvironmentVariableA(var, tmpbuf, iLen) == 0)
55     {
56         if (*iflag == 1)
57         {
58             sciprint(_("Undefined environment variable %s.\n"), var);
59         }
60
61         *ierr = 1;
62         FREE(tmpbuf);
63         return;
64     }
65
66
67     *buflen = (int)strlen(tmpbuf);
68     if (buf)
69     {
70         strcpy(buf, tmpbuf);
71         FREE(tmpbuf)
72     }
73
74 #else
75     char *locale = NULL;
76     locale = getenv(var);
77     if ( locale == NULL )
78     {
79         if ( *iflag == 1 )
80         {
81             sciprint(_("Undefined environment variable %s.\n"), var);
82         }
83         *ierr = 1;
84     }
85     else
86     {
87         // updating the size of char array "buf"
88         *buflen = (int)strlen(locale);
89         if (buf)
90         {
91             // to avoid buffer overflow, we check the size of the source buffer
92             // and the size of the destination buffer
93             if ((int) strlen(locale) <= *buflen)
94             {
95                 // "locale" can be copied entirely to "buf"
96                 strcpy(buf, locale);
97                 *ierr = 0;
98             }
99             else
100             {
101                 *ierr = 2;
102             }
103         }
104     }
105 #endif
106 }
107 /*--------------------------------------------------------------------------*/
108 #ifndef _MSC_VER
109 static void searchenv_others(const char *filename,
110                              const char *varname,
111                              char *pathname)
112 {
113     char *cp = NULL;
114
115     *pathname = '\0';
116
117     if ( filename[0] == DIR_SEPARATOR[0])
118     {
119         strcpy(pathname, filename);
120         return;
121     }
122
123     cp = getenv(varname);
124     if (cp == NULL)
125     {
126         /* environment Variable not defined. */
127         return;
128     }
129
130     while (*cp)
131     {
132         char *concat = NULL;
133         *pathname = '\0';
134         concat = pathname;
135         /* skip PATH_SEPARATOR[0] and empty entries */
136         while ( (*cp) && (*cp == PATH_SEPARATOR[0]) )
137         {
138             cp++;
139         }
140
141         /* copy path */
142         while ( (*cp) && (*cp != PATH_SEPARATOR[0]) )
143         {
144             *concat = *cp;
145             cp++;
146             concat++;
147         }
148
149         if ( concat == pathname )
150         {
151             /* filename not found */
152             *pathname = '\0';
153             return;
154         }
155
156         if ( *(concat - 1) != DIR_SEPARATOR[0] )
157         {
158             /* add directory separator */
159             *concat = DIR_SEPARATOR[0];
160             concat++;
161         }
162
163         /* concatate path & filename */
164         strcpy(concat, filename);
165
166         /* file exists ? */
167         if (FileExist(pathname))
168         {
169             // file found
170             return;
171         }
172     }
173
174     /* file not found */
175     *pathname = '\0';
176 }
177 #endif
178 /*--------------------------------------------------------------------------*/
179 char *searchEnv(const char *name, const char *env_var)
180 {
181     char *buffer = NULL;
182     char fullpath[PATH_MAX];
183
184     strcpy(fullpath, "");
185
186 #if _MSC_VER
187     {
188         char fullpath[PATH_MAX];
189
190         strcpy(fullpath, "");
191
192         _searchenv(name, env_var, fullpath);
193
194         if (strlen(fullpath) > 0)
195         {
196             buffer = os_strdup(fullpath);
197         }
198     }
199 #else
200     searchenv_others(name, env_var, fullpath);
201     if (strlen(fullpath) > 0)
202     {
203         buffer = os_strdup(fullpath);
204     }
205 #endif
206     return buffer;
207 }
208 /*--------------------------------------------------------------------------*/
209