]>
Commit | Line | Data |
---|---|---|
26ac5fad | 1 | /////////////////////////////////////////////////////////////////////////////// |
80fdcdb9 | 2 | // Name: wx/confbase.h |
26ac5fad | 3 | // Purpose: declaration of the base class of all config implementations |
19d40bab | 4 | // (see also: fileconf.h and msw/regconf.h and iniconf.h) |
9d55bfef | 5 | // Author: Karsten Ballueder & Vadim Zeitlin |
26ac5fad JS |
6 | // Modified by: |
7 | // Created: 07.04.98 (adapted from appconf.h) | |
9d55bfef | 8 | // Copyright: (c) 1997 Karsten Ballueder Ballueder@usa.net |
26ac5fad | 9 | // Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> |
65571936 | 10 | // Licence: wxWindows licence |
26ac5fad JS |
11 | /////////////////////////////////////////////////////////////////////////////// |
12 | ||
d7e918b5 VZ |
13 | #ifndef _WX_CONFBASE_H_ |
14 | #define _WX_CONFBASE_H_ | |
26ac5fad | 15 | |
ac57418f | 16 | #include "wx/defs.h" |
8cb172b4 | 17 | #include "wx/string.h" |
d7e918b5 | 18 | #include "wx/object.h" |
5814e8ba | 19 | #include "wx/base64.h" |
2da2f941 | 20 | |
b5dbe15d | 21 | class WXDLLIMPEXP_FWD_BASE wxArrayString; |
ac57418f | 22 | |
26ac5fad JS |
23 | // ---------------------------------------------------------------------------- |
24 | // constants | |
25 | // ---------------------------------------------------------------------------- | |
26 | ||
27 | /// shall we be case sensitive in parsing variable names? | |
28 | #ifndef wxCONFIG_CASE_SENSITIVE | |
ad1b0610 | 29 | #define wxCONFIG_CASE_SENSITIVE 0 |
26ac5fad JS |
30 | #endif |
31 | ||
32 | /// separates group and entry names (probably shouldn't be changed) | |
33 | #ifndef wxCONFIG_PATH_SEPARATOR | |
9a83f860 | 34 | #define wxCONFIG_PATH_SEPARATOR wxT('/') |
26ac5fad JS |
35 | #endif |
36 | ||
37 | /// introduces immutable entries | |
38 | // (i.e. the ones which can't be changed from the local config file) | |
39 | #ifndef wxCONFIG_IMMUTABLE_PREFIX | |
9a83f860 | 40 | #define wxCONFIG_IMMUTABLE_PREFIX wxT('!') |
26ac5fad JS |
41 | #endif |
42 | ||
21709999 JS |
43 | #if wxUSE_CONFIG |
44 | ||
16193c2b | 45 | /// should we use registry instead of configuration files under Windows? |
26ac5fad | 46 | // (i.e. whether wxConfigBase::Create() will create a wxFileConfig (if it's |
68379eaf | 47 | // false) or wxRegConfig (if it's true and we're under Win32)) |
16193c2b VZ |
48 | #ifndef wxUSE_CONFIG_NATIVE |
49 | #define wxUSE_CONFIG_NATIVE 1 | |
26ac5fad JS |
50 | #endif |
51 | ||
f9bb777f VZ |
52 | // not all compilers can deal with template Read/Write() methods, define this |
53 | // symbol if the template functions are available | |
54 | #if (!defined(__VISUALC__) || __VISUALC__ > 1200) && \ | |
55 | !defined( __VMS ) && \ | |
7e08bc5a | 56 | !(defined(__HP_aCC) && defined(__hppa)) && \ |
f9bb777f VZ |
57 | !defined (__DMC__) |
58 | #define wxHAS_CONFIG_TEMPLATE_RW | |
59 | #endif | |
60 | ||
18244936 | 61 | // Style flags for constructor style parameter |
9869734d VZ |
62 | enum |
63 | { | |
64 | wxCONFIG_USE_LOCAL_FILE = 1, | |
944ac903 | 65 | wxCONFIG_USE_GLOBAL_FILE = 2, |
8dce54c9 | 66 | wxCONFIG_USE_RELATIVE_PATH = 4, |
04af2f5c VZ |
67 | wxCONFIG_USE_NO_ESCAPE_CHARACTERS = 8, |
68 | wxCONFIG_USE_SUBDIR = 16 | |
9869734d | 69 | }; |
18244936 | 70 | |
26ac5fad | 71 | // ---------------------------------------------------------------------------- |
8bbe427f | 72 | // abstract base class wxConfigBase which defines the interface for derived |
26ac5fad JS |
73 | // classes |
74 | // | |
1582a1db | 75 | // wxConfig organizes the items in a tree-like structure (modelled after the |
26ac5fad JS |
76 | // Unix/Dos filesystem). There are groups (directories) and keys (files). |
77 | // There is always one current group given by the current path. | |
78 | // | |
79 | // Keys are pairs "key_name = value" where value may be of string or integer | |
9869734d | 80 | // (long) type (TODO doubles and other types such as wxDate coming soon). |
26ac5fad | 81 | // ---------------------------------------------------------------------------- |
886dd7d2 | 82 | |
412b97cc | 83 | class WXDLLIMPEXP_BASE wxConfigBase : public wxObject |
26ac5fad JS |
84 | { |
85 | public: | |
19d40bab VZ |
86 | // constants |
87 | // the type of an entry | |
88 | enum EntryType | |
89 | { | |
61ba49f2 VZ |
90 | Type_Unknown, |
91 | Type_String, | |
92 | Type_Boolean, | |
93 | Type_Integer, // use Read(long *) | |
94 | Type_Float // use Read(double *) | |
19d40bab VZ |
95 | }; |
96 | ||
26ac5fad JS |
97 | // static functions |
98 | // sets the config object, returns the previous pointer | |
99 | static wxConfigBase *Set(wxConfigBase *pConfig); | |
100 | // get the config object, creates it on demand unless DontCreateOnDemand | |
101 | // was called | |
68379eaf | 102 | static wxConfigBase *Get(bool createOnDemand = true) |
eee786e9 | 103 | { if ( createOnDemand && (!ms_pConfig) ) Create(); return ms_pConfig; } |
26ac5fad JS |
104 | // create a new config object: this function will create the "best" |
105 | // implementation of wxConfig available for the current platform, see | |
16193c2b | 106 | // comments near definition wxUSE_CONFIG_NATIVE for details. It returns |
26ac5fad JS |
107 | // the created object and also sets it as ms_pConfig. |
108 | static wxConfigBase *Create(); | |
109 | // should Get() try to create a new log object if the current one is NULL? | |
68379eaf | 110 | static void DontCreateOnDemand() { ms_bAutoCreate = false; } |
26ac5fad | 111 | |
9869734d VZ |
112 | // ctor & virtual dtor |
113 | // ctor (can be used as default ctor too) | |
114 | // | |
61ba49f2 VZ |
115 | // Not all args will always be used by derived classes, but including |
116 | // them all in each class ensures compatibility. If appName is empty, | |
117 | // uses wxApp name | |
118 | wxConfigBase(const wxString& appName = wxEmptyString, | |
119 | const wxString& vendorName = wxEmptyString, | |
120 | const wxString& localFilename = wxEmptyString, | |
121 | const wxString& globalFilename = wxEmptyString, | |
e96ddf25 | 122 | long style = 0); |
18244936 | 123 | |
26ac5fad | 124 | // empty but ensures that dtor of all derived classes is virtual |
5e233068 | 125 | virtual ~wxConfigBase(); |
26ac5fad JS |
126 | |
127 | // path management | |
128 | // set current path: if the first character is '/', it's the absolute path, | |
129 | // otherwise it's a relative path. '..' is supported. If the strPath | |
130 | // doesn't exist it is created. | |
131 | virtual void SetPath(const wxString& strPath) = 0; | |
132 | // retrieve the current path (always as absolute path) | |
133 | virtual const wxString& GetPath() const = 0; | |
134 | ||
135 | // enumeration: all functions here return false when there are no more items. | |
136 | // you must pass the same lIndex to GetNext and GetFirst (don't modify it) | |
137 | // enumerate subgroups | |
138 | virtual bool GetFirstGroup(wxString& str, long& lIndex) const = 0; | |
139 | virtual bool GetNextGroup (wxString& str, long& lIndex) const = 0; | |
140 | // enumerate entries | |
141 | virtual bool GetFirstEntry(wxString& str, long& lIndex) const = 0; | |
142 | virtual bool GetNextEntry (wxString& str, long& lIndex) const = 0; | |
143 | // get number of entries/subgroups in the current group, with or without | |
144 | // it's subgroups | |
68379eaf WS |
145 | virtual size_t GetNumberOfEntries(bool bRecursive = false) const = 0; |
146 | virtual size_t GetNumberOfGroups(bool bRecursive = false) const = 0; | |
26ac5fad JS |
147 | |
148 | // tests of existence | |
68379eaf | 149 | // returns true if the group by this name exists |
26ac5fad JS |
150 | virtual bool HasGroup(const wxString& strName) const = 0; |
151 | // same as above, but for an entry | |
152 | virtual bool HasEntry(const wxString& strName) const = 0; | |
68379eaf | 153 | // returns true if either a group or an entry with a given name exist |
26ac5fad JS |
154 | bool Exists(const wxString& strName) const |
155 | { return HasGroup(strName) || HasEntry(strName); } | |
156 | ||
19d40bab VZ |
157 | // get the entry type |
158 | virtual EntryType GetEntryType(const wxString& name) const | |
159 | { | |
160 | // by default all entries are strings | |
61ba49f2 | 161 | return HasEntry(name) ? Type_String : Type_Unknown; |
19d40bab VZ |
162 | } |
163 | ||
68379eaf | 164 | // key access: returns true if value was really read, false if default used |
26ac5fad | 165 | // (and if the key is not found the default value is returned.) |
18244936 | 166 | |
2ba41305 VZ |
167 | // read a string from the key |
168 | bool Read(const wxString& key, wxString *pStr) const; | |
169 | bool Read(const wxString& key, wxString *pStr, const wxString& defVal) const; | |
18244936 | 170 | |
2ba41305 VZ |
171 | // read a number (long) |
172 | bool Read(const wxString& key, long *pl) const; | |
173 | bool Read(const wxString& key, long *pl, long defVal) const; | |
18244936 | 174 | |
3e1512cd | 175 | // read an int (wrapper around `long' version) |
2ba41305 VZ |
176 | bool Read(const wxString& key, int *pi) const; |
177 | bool Read(const wxString& key, int *pi, int defVal) const; | |
18244936 | 178 | |
2ba41305 VZ |
179 | // read a double |
180 | bool Read(const wxString& key, double* val) const; | |
181 | bool Read(const wxString& key, double* val, double defVal) const; | |
dfad0599 | 182 | |
384859f8 VZ |
183 | // read a float |
184 | bool Read(const wxString& key, float* val) const; | |
185 | bool Read(const wxString& key, float* val, float defVal) const; | |
186 | ||
2ba41305 VZ |
187 | // read a bool |
188 | bool Read(const wxString& key, bool* val) const; | |
189 | bool Read(const wxString& key, bool* val, bool defVal) const; | |
dfad0599 | 190 | |
434e2903 | 191 | #if wxUSE_BASE64 |
5814e8ba VZ |
192 | // read a binary data block |
193 | bool Read(const wxString& key, wxMemoryBuffer* data) const | |
434e2903 | 194 | { return DoReadBinary(key, data); } |
5814e8ba | 195 | // no default version since it does not make sense for binary data |
434e2903 | 196 | #endif // wxUSE_BASE64 |
5814e8ba | 197 | |
f9bb777f | 198 | #ifdef wxHAS_CONFIG_TEMPLATE_RW |
3e1512cd VZ |
199 | // read other types, for which wxFromString is defined |
200 | template <typename T> | |
201 | bool Read(const wxString& key, T* value) const | |
202 | { | |
203 | wxString s; | |
204 | if ( !Read(key, &s) ) | |
205 | return false; | |
206 | return wxFromString(s, value); | |
207 | } | |
208 | ||
209 | template <typename T> | |
210 | bool Read(const wxString& key, T* value, const T& defVal) const | |
211 | { | |
212 | const bool found = Read(key, value); | |
213 | if ( !found ) | |
214 | { | |
215 | if (IsRecordingDefaults()) | |
216 | ((wxConfigBase *)this)->Write(key, defVal); | |
217 | *value = defVal; | |
218 | } | |
219 | return found; | |
220 | } | |
f9bb777f | 221 | #endif // wxHAS_CONFIG_TEMPLATE_RW |
3e1512cd | 222 | |
03647350 | 223 | // convenience functions returning directly the value |
2ba41305 VZ |
224 | wxString Read(const wxString& key, |
225 | const wxString& defVal = wxEmptyString) const | |
226 | { wxString s; (void)Read(key, &s, defVal); return s; } | |
18244936 | 227 | |
3e1512cd VZ |
228 | // we have to provide a separate version for C strings as otherwise the |
229 | // template Read() would be used | |
230 | wxString Read(const wxString& key, const char* defVal) const | |
231 | { return Read(key, wxString(defVal)); } | |
3e1512cd VZ |
232 | wxString Read(const wxString& key, const wchar_t* defVal) const |
233 | { return Read(key, wxString(defVal)); } | |
3e1512cd | 234 | |
56601ff2 | 235 | long ReadLong(const wxString& key, long defVal) const |
2ba41305 | 236 | { long l; (void)Read(key, &l, defVal); return l; } |
26ac5fad | 237 | |
56601ff2 VZ |
238 | double ReadDouble(const wxString& key, double defVal) const |
239 | { double d; (void)Read(key, &d, defVal); return d; } | |
240 | ||
241 | bool ReadBool(const wxString& key, bool defVal) const | |
242 | { bool b; (void)Read(key, &b, defVal); return b; } | |
243 | ||
244 | template <typename T> | |
245 | T ReadObject(const wxString& key, T const& defVal) const | |
246 | { T t; (void)Read(key, &t, defVal); return t; } | |
247 | ||
248 | // for compatibility with wx 2.8 | |
249 | long Read(const wxString& key, long defVal) const | |
250 | { return ReadLong(key, defVal); } | |
251 | ||
252 | ||
253 | // write the value (return true on success) | |
2ba41305 VZ |
254 | bool Write(const wxString& key, const wxString& value) |
255 | { return DoWriteString(key, value); } | |
256 | ||
257 | bool Write(const wxString& key, long value) | |
258 | { return DoWriteLong(key, value); } | |
259 | ||
2ba41305 VZ |
260 | bool Write(const wxString& key, double value) |
261 | { return DoWriteDouble(key, value); } | |
262 | ||
263 | bool Write(const wxString& key, bool value) | |
264 | { return DoWriteBool(key, value); } | |
18244936 | 265 | |
434e2903 | 266 | #if wxUSE_BASE64 |
5814e8ba VZ |
267 | bool Write(const wxString& key, const wxMemoryBuffer& buf) |
268 | { return DoWriteBinary(key, buf); } | |
434e2903 | 269 | #endif // wxUSE_BASE64 |
5814e8ba | 270 | |
68275b85 VZ |
271 | // we have to provide a separate version for C strings as otherwise they |
272 | // would be converted to bool and not to wxString as expected! | |
1c8c9146 | 273 | bool Write(const wxString& key, const char *value) |
2ba41305 | 274 | { return Write(key, wxString(value)); } |
3e1512cd VZ |
275 | bool Write(const wxString& key, const unsigned char *value) |
276 | { return Write(key, wxString(value)); } | |
1c8c9146 VS |
277 | bool Write(const wxString& key, const wchar_t *value) |
278 | { return Write(key, wxString(value)); } | |
68275b85 | 279 | |
3e1512cd VZ |
280 | |
281 | // we also have to provide specializations for other types which we want to | |
282 | // handle using the specialized DoWriteXXX() instead of the generic template | |
283 | // version below | |
fafb2b05 VZ |
284 | bool Write(const wxString& key, char value) |
285 | { return DoWriteLong(key, value); } | |
286 | ||
287 | bool Write(const wxString& key, unsigned char value) | |
288 | { return DoWriteLong(key, value); } | |
289 | ||
3e1512cd VZ |
290 | bool Write(const wxString& key, short value) |
291 | { return DoWriteLong(key, value); } | |
292 | ||
293 | bool Write(const wxString& key, unsigned short value) | |
294 | { return DoWriteLong(key, value); } | |
295 | ||
296 | bool Write(const wxString& key, unsigned int value) | |
297 | { return DoWriteLong(key, value); } | |
298 | ||
299 | bool Write(const wxString& key, int value) | |
300 | { return DoWriteLong(key, value); } | |
301 | ||
302 | bool Write(const wxString& key, unsigned long value) | |
303 | { return DoWriteLong(key, value); } | |
304 | ||
305 | bool Write(const wxString& key, float value) | |
306 | { return DoWriteDouble(key, value); } | |
307 | ||
934960d1 | 308 | // Causes ambiguities in VC++ 6 and OpenVMS (at least) |
fbbac935 | 309 | #if ( (!defined(__VISUALC__) || __VISUALC__ > 1200) && !defined( __VMS ) && !defined (__DMC__)) |
3e1512cd VZ |
310 | // for other types, use wxToString() |
311 | template <typename T> | |
312 | bool Write(const wxString& key, T const& value) | |
313 | { return Write(key, wxToString(value)); } | |
f81e22cf | 314 | #endif |
3e1512cd | 315 | |
68275b85 | 316 | // permanently writes all changes |
68379eaf | 317 | virtual bool Flush(bool bCurrentOnly = false) = 0; |
26ac5fad | 318 | |
68379eaf | 319 | // renaming, all functions return false on failure (probably because the new |
5d1902d6 VZ |
320 | // name is already taken by an existing entry) |
321 | // rename an entry | |
322 | virtual bool RenameEntry(const wxString& oldName, | |
323 | const wxString& newName) = 0; | |
324 | // rename a group | |
325 | virtual bool RenameGroup(const wxString& oldName, | |
326 | const wxString& newName) = 0; | |
327 | ||
26ac5fad JS |
328 | // delete entries/groups |
329 | // deletes the specified entry and the group it belongs to if | |
330 | // it was the last key in it and the second parameter is true | |
18244936 | 331 | virtual bool DeleteEntry(const wxString& key, |
68379eaf | 332 | bool bDeleteGroupIfEmpty = true) = 0; |
26ac5fad | 333 | // delete the group (with all subgroups) |
18244936 | 334 | virtual bool DeleteGroup(const wxString& key) = 0; |
26ac5fad | 335 | // delete the whole underlying object (disk file, registry key, ...) |
35c4b4da | 336 | // primarily for use by uninstallation routine. |
26ac5fad JS |
337 | virtual bool DeleteAll() = 0; |
338 | ||
339 | // options | |
340 | // we can automatically expand environment variables in the config entries | |
341 | // (this option is on by default, you can turn it on/off at any time) | |
342 | bool IsExpandingEnvVars() const { return m_bExpandEnvVars; } | |
68379eaf | 343 | void SetExpandEnvVars(bool bDoIt = true) { m_bExpandEnvVars = bDoIt; } |
26ac5fad | 344 | // recording of default values |
68379eaf | 345 | void SetRecordDefaults(bool bDoIt = true) { m_bRecordDefaults = bDoIt; } |
26ac5fad JS |
346 | bool IsRecordingDefaults() const { return m_bRecordDefaults; } |
347 | // does expansion only if needed | |
6164d85e | 348 | wxString ExpandEnvVars(const wxString& str) const; |
26ac5fad | 349 | |
18244936 | 350 | // misc accessors |
19d40bab VZ |
351 | wxString GetAppName() const { return m_appName; } |
352 | wxString GetVendorName() const { return m_vendorName; } | |
f6bcfd97 | 353 | |
8f19c916 JS |
354 | // Used wxIniConfig to set members in constructor |
355 | void SetAppName(const wxString& appName) { m_appName = appName; } | |
356 | void SetVendorName(const wxString& vendorName) { m_vendorName = vendorName; } | |
18244936 | 357 | |
19d40bab VZ |
358 | void SetStyle(long style) { m_style = style; } |
359 | long GetStyle() const { return m_style; } | |
18244936 | 360 | |
26ac5fad | 361 | protected: |
18244936 | 362 | static bool IsImmutable(const wxString& key) |
995de2b4 | 363 | { return !key.IsEmpty() && key[0] == wxCONFIG_IMMUTABLE_PREFIX; } |
18244936 | 364 | |
35c4b4da VZ |
365 | // return the path without trailing separator, if any: this should be called |
366 | // to sanitize paths referring to the group names before passing them to | |
367 | // wxConfigPathChanger as "/foo/bar/" should be the same as "/foo/bar" and it | |
368 | // isn't interpreted in the same way by it (and this can't be changed there | |
369 | // as it's not the same for the entries names) | |
370 | static wxString RemoveTrailingSeparator(const wxString& key); | |
371 | ||
2ba41305 VZ |
372 | // do read/write the values of different types |
373 | virtual bool DoReadString(const wxString& key, wxString *pStr) const = 0; | |
374 | virtual bool DoReadLong(const wxString& key, long *pl) const = 0; | |
2ba41305 VZ |
375 | virtual bool DoReadDouble(const wxString& key, double* val) const; |
376 | virtual bool DoReadBool(const wxString& key, bool* val) const; | |
434e2903 | 377 | #if wxUSE_BASE64 |
5814e8ba | 378 | virtual bool DoReadBinary(const wxString& key, wxMemoryBuffer* buf) const = 0; |
434e2903 | 379 | #endif // wxUSE_BASE64 |
2ba41305 VZ |
380 | |
381 | virtual bool DoWriteString(const wxString& key, const wxString& value) = 0; | |
382 | virtual bool DoWriteLong(const wxString& key, long value) = 0; | |
2ba41305 VZ |
383 | virtual bool DoWriteDouble(const wxString& key, double value); |
384 | virtual bool DoWriteBool(const wxString& key, bool value); | |
434e2903 | 385 | #if wxUSE_BASE64 |
5814e8ba | 386 | virtual bool DoWriteBinary(const wxString& key, const wxMemoryBuffer& buf) = 0; |
434e2903 | 387 | #endif // wxUSE_BASE64 |
2ba41305 | 388 | |
18244936 JS |
389 | private: |
390 | // are we doing automatic environment variable expansion? | |
391 | bool m_bExpandEnvVars; | |
392 | // do we record default values? | |
393 | bool m_bRecordDefaults; | |
8bbe427f | 394 | |
18244936 JS |
395 | // static variables |
396 | static wxConfigBase *ms_pConfig; | |
397 | static bool ms_bAutoCreate; | |
398 | ||
399 | // Application name and organisation name | |
400 | wxString m_appName; | |
401 | wxString m_vendorName; | |
402 | ||
403 | // Style flag | |
404 | long m_style; | |
412b97cc VZ |
405 | |
406 | DECLARE_ABSTRACT_CLASS(wxConfigBase) | |
18244936 | 407 | }; |
26ac5fad | 408 | |
2ba41305 VZ |
409 | // a handy little class which changes current path to the path of given entry |
410 | // and restores it in dtor: so if you declare a local variable of this type, | |
411 | // you work in the entry directory and the path is automatically restored | |
412 | // when the function returns | |
413 | // Taken out of wxConfig since not all compilers can cope with nested classes. | |
bddd7a8d | 414 | class WXDLLIMPEXP_BASE wxConfigPathChanger |
2ba41305 VZ |
415 | { |
416 | public: | |
9c92620c | 417 | // ctor/dtor do path changing/restoring of the path |
2ba41305 VZ |
418 | wxConfigPathChanger(const wxConfigBase *pContainer, const wxString& strEntry); |
419 | ~wxConfigPathChanger(); | |
420 | ||
421 | // get the key name | |
422 | const wxString& Name() const { return m_strName; } | |
423 | ||
9c92620c VZ |
424 | // this method must be called if the original path (i.e. the current path at |
425 | // the moment of creation of this object) could have been deleted to prevent | |
426 | // us from restoring the not existing (any more) path | |
427 | // | |
428 | // if the original path doesn't exist any more, the path will be restored to | |
429 | // the deepest still existing component of the old path | |
430 | void UpdateIfDeleted(); | |
431 | ||
2ba41305 VZ |
432 | private: |
433 | wxConfigBase *m_pContainer; // object we live in | |
434 | wxString m_strName, // name of entry (i.e. name only) | |
435 | m_strOldPath; // saved path | |
436 | bool m_bChanged; // was the path changed? | |
22f3361e | 437 | |
c0c133e1 | 438 | wxDECLARE_NO_COPY_CLASS(wxConfigPathChanger); |
2ba41305 | 439 | }; |
26ac5fad | 440 | |
26ac5fad | 441 | |
d427503c VZ |
442 | #endif // wxUSE_CONFIG |
443 | ||
d427503c VZ |
444 | /* |
445 | Replace environment variables ($SOMETHING) with their values. The format is | |
446 | $VARNAME or ${VARNAME} where VARNAME contains alphanumeric characters and | |
447 | '_' only. '$' must be escaped ('\$') in order to be taken literally. | |
8cb172b4 JS |
448 | */ |
449 | ||
bddd7a8d | 450 | WXDLLIMPEXP_BASE wxString wxExpandEnvVars(const wxString &sz); |
d427503c VZ |
451 | |
452 | /* | |
453 | Split path into parts removing '..' in progress | |
454 | */ | |
86501081 | 455 | WXDLLIMPEXP_BASE void wxSplitPath(wxArrayString& aParts, const wxString& path); |
21709999 | 456 | |
d7e918b5 | 457 | #endif // _WX_CONFBASE_H_ |
26ac5fad | 458 |