Mercurial > hg > svcore
diff system/System.cpp @ 1475:bd1a2cacd1e7 plugin-path-config
Add provisional utf-8 getenv/putenv implementations
author | Chris Cannam |
---|---|
date | Thu, 07 Jun 2018 15:35:04 +0100 |
parents | c7e68755c7ec |
children | b60cb1637634 |
line wrap: on
line diff
--- a/system/System.cpp Wed Jun 06 15:55:34 2018 +0100 +++ b/system/System.cpp Thu Jun 07 15:35:04 2018 +0100 @@ -4,7 +4,7 @@ Sonic Visualiser An audio file viewer and annotation editor. Centre for Digital Music, Queen Mary, University of London. - This file copyright 2006 Chris Cannam and QMUL. + This file copyright 2006-2018 Chris Cannam and QMUL. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -63,7 +63,7 @@ } #endif - int gettimeofday(struct timeval *tv, void *tz) + int gettimeofday(struct timeval *tv, void * /* tz */) { union { long long ns100; @@ -328,4 +328,110 @@ double princarg(double a) { return mod(a + M_PI, -2 * M_PI) + M_PI; } float princargf(float a) { return float(princarg(a)); } +bool +getEnvUtf8(std::string variable, std::string &value) +{ + value = ""; + +#ifdef _WIN32 + int wvarlen = MultiByteToWideChar(CP_UTF8, 0, + variable.c_str(), int(variable.length()), + 0, 0); + if (wvarlen < 0) { + SVCERR << "WARNING: Unable to convert environment variable name " + << variable << " to wide characters" << endl; + return false; + } + + wchar_t *wvarbuf = new wchar_t[wvarlen + 1]; + (void)MultiByteToWideChar(CP_UTF8, 0, + variable.c_str(), int(variable.length()), + wvarbuf, wvarlen); + wvarbuf[wvarlen] = L'\0'; + + wchar_t *wvalue = _wgetenv(wvarbuf); + delete[] wvarbuf; + + if (!wvalue) { + return false; + } + + int wvallen = int(wcslen(wvarbuf)); + int vallen = WideCharToMultiByte(CP_UTF8, 0, + wvarbuf, wvallen, + 0, 0, 0, 0); + if (vallen < 0) { + SVCERR << "WARNING: Unable to convert environment value to UTF-8" + << endl; + return false; + } + + char *val = new char[vallen + 1]; + (void)WideCharToMultiByte(CP_UTF8, 0, + wvarbuf, wvallen, + val, vallen, 0, 0); + val[vallen] = '\0'; + + value = val; + + delete[] val; + return true; + +#else + + char *val = getenv(variable.c_str()); + if (!val) { + return false; + } + + value = val; + return true; + +#endif +} + +bool +putEnvUtf8(std::string variable, std::string value) +{ + std::string entry = variable + "=" + value; + +#ifdef _WIN32 + int wentlen = MultiByteToWideChar(CP_UTF8, 0, + entry.c_str(), int(entry.length()), + 0, 0); + if (wentlen < 0) { + SVCERR << "WARNING: Unable to convert environment entry to " + << "wide characters" << endl; + return false; + } + + wchar_t *wentbuf = new wchar_t[wentlen + 1]; + (void)MultiByteToWideChar(CP_UTF8, 0, + entry.c_str(), int(entry.length()), + wentbuf, wentlen); + wentbuf[wentlen] = L'\0'; + + int rv = _wputenv(wentbuf); + + delete[] wentbuf; + + if (rv != 0) { + SVCERR << "WARNING: Failed to set environment entry" << endl; + return false; + } + return true; + +#else + + int rv = putenv(entry.c_str()); + + if (rv != 0) { + SVCERR << "WARNING: Failed to set environment entry" << endl; + return false; + } + return true; + +#endif +} +