183 lines
3.4 KiB
C
183 lines
3.4 KiB
C
/*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
* The Original Code is Copyright (C) 2012 Blender Foundation.
|
|
* All rights reserved.
|
|
*/
|
|
|
|
#ifndef _WIN32_IE
|
|
# define _WIN32_IE 0x0501
|
|
#endif
|
|
|
|
#include "utf_winfunc.h"
|
|
#include "utfconv.h"
|
|
#include <io.h>
|
|
#include <wchar.h>
|
|
#include <windows.h>
|
|
|
|
FILE *ufopen(const char *filename, const char *mode)
|
|
{
|
|
FILE *f = NULL;
|
|
UTF16_ENCODE(filename);
|
|
UTF16_ENCODE(mode);
|
|
|
|
if (filename_16 && mode_16) {
|
|
f = _wfopen(filename_16, mode_16);
|
|
}
|
|
|
|
UTF16_UN_ENCODE(mode);
|
|
UTF16_UN_ENCODE(filename);
|
|
|
|
if (!f) {
|
|
if ((f = fopen(filename, mode))) {
|
|
printf("WARNING: %s is not utf path. Please update it.\n", filename);
|
|
}
|
|
}
|
|
|
|
return f;
|
|
}
|
|
|
|
int uopen(const char *filename, int oflag, int pmode)
|
|
{
|
|
int f = -1;
|
|
UTF16_ENCODE(filename);
|
|
|
|
if (filename_16) {
|
|
f = _wopen(filename_16, oflag, pmode);
|
|
}
|
|
|
|
UTF16_UN_ENCODE(filename);
|
|
|
|
if (f == -1) {
|
|
if ((f = open(filename, oflag, pmode)) != -1) {
|
|
printf("WARNING: %s is not utf path. Please update it.\n", filename);
|
|
}
|
|
}
|
|
|
|
return f;
|
|
}
|
|
|
|
int uaccess(const char *filename, int mode)
|
|
{
|
|
int r = -1;
|
|
UTF16_ENCODE(filename);
|
|
|
|
if (filename_16) {
|
|
r = _waccess(filename_16, mode);
|
|
}
|
|
|
|
UTF16_UN_ENCODE(filename);
|
|
|
|
return r;
|
|
}
|
|
|
|
int urename(const char *oldname, const char *newname)
|
|
{
|
|
int r = -1;
|
|
UTF16_ENCODE(oldname);
|
|
UTF16_ENCODE(newname);
|
|
|
|
if (oldname_16 && newname_16) {
|
|
r = _wrename(oldname_16, newname_16);
|
|
}
|
|
|
|
UTF16_UN_ENCODE(newname);
|
|
UTF16_UN_ENCODE(oldname);
|
|
return r;
|
|
}
|
|
|
|
int umkdir(const char *pathname)
|
|
{
|
|
|
|
BOOL r = 0;
|
|
UTF16_ENCODE(pathname);
|
|
|
|
if (pathname_16) {
|
|
r = CreateDirectoryW(pathname_16, NULL);
|
|
}
|
|
|
|
UTF16_UN_ENCODE(pathname);
|
|
|
|
return r ? 0 : -1;
|
|
}
|
|
|
|
char *u_alloc_getenv(const char *varname)
|
|
{
|
|
char *r = 0;
|
|
wchar_t *str;
|
|
UTF16_ENCODE(varname);
|
|
if (varname_16) {
|
|
str = _wgetenv(varname_16);
|
|
r = alloc_utf_8_from_16(str, 0);
|
|
}
|
|
UTF16_UN_ENCODE(varname);
|
|
|
|
return r;
|
|
}
|
|
void u_free_getenv(char *val)
|
|
{
|
|
free(val);
|
|
}
|
|
|
|
int uput_getenv(const char *varname, char *value, size_t buffsize)
|
|
{
|
|
int r = 0;
|
|
wchar_t *str;
|
|
|
|
if (!buffsize) {
|
|
return r;
|
|
}
|
|
|
|
UTF16_ENCODE(varname);
|
|
if (varname_16) {
|
|
str = _wgetenv(varname_16);
|
|
conv_utf_16_to_8(str, value, buffsize);
|
|
r = 1;
|
|
}
|
|
UTF16_UN_ENCODE(varname);
|
|
|
|
if (!r) {
|
|
value[0] = 0;
|
|
}
|
|
|
|
return r;
|
|
}
|
|
|
|
int uputenv(const char *name, const char *value)
|
|
{
|
|
int r = -1;
|
|
UTF16_ENCODE(name);
|
|
|
|
if (value) {
|
|
/* set */
|
|
UTF16_ENCODE(value);
|
|
|
|
if (name_16 && value_16) {
|
|
r = (SetEnvironmentVariableW(name_16, value_16) != 0) ? 0 : -1;
|
|
}
|
|
UTF16_UN_ENCODE(value);
|
|
}
|
|
else {
|
|
/* clear */
|
|
if (name_16) {
|
|
r = (SetEnvironmentVariableW(name_16, NULL) != 0) ? 0 : -1;
|
|
}
|
|
}
|
|
|
|
UTF16_UN_ENCODE(name);
|
|
|
|
return r;
|
|
}
|