Mercurial > hg > vamp-plugin-load-checker
comparison src/knownplugins.cpp @ 36:ae74d39e9e4e plugin-path-config
Wide-char environment variable lookup
author | Chris Cannam |
---|---|
date | Fri, 08 Jun 2018 11:28:51 +0100 |
parents | 4154894d638c |
children |
comparison
equal
deleted
inserted
replaced
35:4154894d638c | 36:ae74d39e9e4e |
---|---|
27 dealings in this Software without prior written authorization. | 27 dealings in this Software without prior written authorization. |
28 */ | 28 */ |
29 | 29 |
30 #include "knownplugins.h" | 30 #include "knownplugins.h" |
31 | 31 |
32 #include <iostream> | |
33 | |
32 using namespace std; | 34 using namespace std; |
33 | 35 |
34 #if defined(_WIN32) | 36 #if defined(_WIN32) |
37 #include <windows.h> | |
35 #define PATH_SEPARATOR ';' | 38 #define PATH_SEPARATOR ';' |
36 #else | 39 #else |
37 #define PATH_SEPARATOR ':' | 40 #define PATH_SEPARATOR ':' |
38 #endif | 41 #endif |
42 | |
43 static bool | |
44 getEnvUtf8(std::string variable, std::string &value) | |
45 { | |
46 value = ""; | |
47 | |
48 #ifdef _WIN32 | |
49 int wvarlen = MultiByteToWideChar(CP_UTF8, 0, | |
50 variable.c_str(), int(variable.length()), | |
51 0, 0); | |
52 if (wvarlen < 0) { | |
53 cerr << "WARNING: Unable to convert environment variable name " | |
54 << variable << " to wide characters" << endl; | |
55 return false; | |
56 } | |
57 | |
58 wchar_t *wvarbuf = new wchar_t[wvarlen + 1]; | |
59 (void)MultiByteToWideChar(CP_UTF8, 0, | |
60 variable.c_str(), int(variable.length()), | |
61 wvarbuf, wvarlen); | |
62 wvarbuf[wvarlen] = L'\0'; | |
63 | |
64 wchar_t *wvalue = _wgetenv(wvarbuf); | |
65 | |
66 delete[] wvarbuf; | |
67 | |
68 if (!wvalue) { | |
69 return false; | |
70 } | |
71 | |
72 int wvallen = int(wcslen(wvalue)); | |
73 int vallen = WideCharToMultiByte(CP_UTF8, 0, | |
74 wvalue, wvallen, | |
75 0, 0, 0, 0); | |
76 if (vallen < 0) { | |
77 cerr << "WARNING: Unable to convert environment value to UTF-8" << endl; | |
78 return false; | |
79 } | |
80 | |
81 char *val = new char[vallen + 1]; | |
82 (void)WideCharToMultiByte(CP_UTF8, 0, | |
83 wvalue, wvallen, | |
84 val, vallen, 0, 0); | |
85 val[vallen] = '\0'; | |
86 | |
87 value = val; | |
88 | |
89 delete[] val; | |
90 return true; | |
91 | |
92 #else | |
93 | |
94 char *val = getenv(variable.c_str()); | |
95 if (!val) { | |
96 return false; | |
97 } | |
98 | |
99 value = val; | |
100 return true; | |
101 | |
102 #endif | |
103 } | |
39 | 104 |
40 KnownPlugins::KnownPlugins(BinaryFormat format) : | 105 KnownPlugins::KnownPlugins(BinaryFormat format) : |
41 m_format(format) | 106 m_format(format) |
42 { | 107 { |
43 string variableSuffix = ""; | 108 string variableSuffix = ""; |
128 | 193 |
129 if (path == "") { | 194 if (path == "") { |
130 return path; | 195 return path; |
131 } | 196 } |
132 | 197 |
133 char *home = getenv("HOME"); | 198 string home; |
134 if (home) { | 199 if (getEnvUtf8("HOME", home)) { |
135 string::size_type f; | 200 string::size_type f; |
136 while ((f = path.find("$HOME")) != string::npos && | 201 while ((f = path.find("$HOME")) != string::npos && |
137 f < path.length()) { | 202 f < path.length()) { |
138 path.replace(f, 5, home); | 203 path.replace(f, 5, home); |
139 } | 204 } |
140 } | 205 } |
141 | 206 |
142 #ifdef _WIN32 | 207 #ifdef _WIN32 |
143 const char *pfiles = 0; | 208 string pfiles, pfiles32; |
144 const char *pfiles32 = 0; | 209 if (!getEnvUtf8("ProgramFiles", pfiles)) { |
145 | |
146 pfiles = getenv("ProgramFiles"); | |
147 if (!pfiles) { | |
148 pfiles = "C:\\Program Files"; | 210 pfiles = "C:\\Program Files"; |
149 } | 211 } |
150 | 212 if (!getEnvUtf8("ProgramFiles(x86)", pfiles32)) { |
151 pfiles32 = getenv("ProgramFiles(x86)"); | |
152 if (!pfiles32) { | |
153 pfiles32 = "C:\\Program Files (x86)"; | 213 pfiles32 = "C:\\Program Files (x86)"; |
154 } | 214 } |
155 | 215 |
156 string::size_type f; | 216 string::size_type f; |
157 while ((f = path.find("%ProgramFiles%")) != string::npos && | 217 while ((f = path.find("%ProgramFiles%")) != string::npos && |
187 vector<string> | 247 vector<string> |
188 KnownPlugins::expandConventionalPath(PluginType type, string var) | 248 KnownPlugins::expandConventionalPath(PluginType type, string var) |
189 { | 249 { |
190 string path; | 250 string path; |
191 | 251 |
192 char *cpath = getenv(var.c_str()); | 252 if (!getEnvUtf8(var, path)) { |
193 if (cpath) path = cpath; | |
194 if (path == "") { | |
195 path = getDefaultPathString(type); | 253 path = getDefaultPathString(type); |
196 } | 254 } |
197 | 255 |
198 return expandPathString(path); | 256 return expandPathString(path); |
199 } | 257 } |