31 # define sysTextMode 't'
32 # define sysBinaryMode 'b'
33 # define sysFileno(fp) _fileno(fp)
34 # define sysFstat _fstat64
35 # define sysGetCwd() ::_wgetcwd(0, FILENAME_MAX)
38 using DirUniquePtr = std::unique_ptr<wchar_t, decltype(free)*>;
42 # define sysTextMode '\0'
43 # define sysBinaryMode 'b'
44 # define sysFileno(fp) fileno(fp)
45 # define sysFstat fstat
46 # define sysGetCwd() ::getcwd(0, FILENAME_MAX)
54 #define strOK(ss) ((nullptr != ss) && ('\0' != ss[0]))
55 #define chrAPPEND(p,c) ((nullptr != p) ? (*p++ = c) : 0)
57 #define isMODE(allBits,modeBits) (((allBits) & (modeBits)) == modeBits)
59 #if !defined(FILENAME_MAX)
60 # define FILENAME_MAX 512
67 utf8ToU16(
const char *s)
73 len = ::strlen(s) + 1;
74 result = (
wchar_t *)::malloc(len *
sizeof(
wchar_t));
88 unsigned char c = (
unsigned char)*s;
92 result[element] = (wchar_t)c;
99 if (0x80 == (*(s + 1) & 0xC0)) {
100 result[element] = (wchar_t)(
101 ((c & 0x1F) << 6) | (*(s + 1) & 0x3F));
106 result[element] = (wchar_t)c;
113 if (0x80 == (*(s + 1) & 0xC0) && 0x80 == (*(s + 2) & 0xC0)) {
114 result[element] = (wchar_t)(((c & 0x0F) << 12) |
115 ((*(s + 1) & 0x3F) << 6) | (*(s + 2) & 0x3F));
121 result[element] = (wchar_t)c;
128 result[element] = (wchar_t)c;
136 result = (
wchar_t *)::malloc(
sizeof(
wchar_t));
145 utf8ToU16Old(
const char *s)
151 len = ::strlen(s) + 1;
152 result = (
wchar_t *)::malloc(len *
sizeof(
wchar_t));
166 unsigned char c = (
unsigned char)*s;
169 result[element] = (wchar_t)c;
175 if (0x80 == (*(s + 1) & 0xC0)) {
176 result[element] = (wchar_t)(
177 (c & 0x1F) << 6 | (*(s + 1) & 0x3F));
182 result[element] = (wchar_t)c;
189 if (0x80 == (*(s + 1) & 0xC0) && 0x80 == (*(s + 2) & 0xC)) {
190 result[element] = (wchar_t)(((c & 0x0F) << 12) |
191 ((*(s + 1) & 0x3F) << 6) | (*(s + 2) & 0x3F));
197 result[element] = (wchar_t)c;
204 result[element] = (wchar_t)c;
211 result = (
wchar_t *)::malloc(
sizeof(
wchar_t));
223 return ((
nullptr != dir) && (0 == ::_wchdir(dir))) ? 0 : -1;
233 while (
strOK(filename)) {
234 char modeStr[4] = {0,0,0,0};
251 if (
isMODE(mode, pwpPlus_)) {
269 if (wname && wmode) {
270 ret = ::_wfopen(wname.get(), wmode.get());
276 ret = fopen(filename, modeStr);
298 return fp ? feof(fp) : 0;
305 return fp ? fflush(fp) : -1;
314 ret = fgetpos(fp, pos);
325 ret = fsetpos(fp, pos);
338 if (0 == fp || 0 == size) {
346 *size = (size_t)buf.st_size;
356 if (0 == filename || 0 == size) {
363 if (
nullptr == wname) {
367 if (0 != ::_wstat64(wname.get(), &buf)) {
372 *size = (size_t)buf.st_size;
377 if (0 != stat(filename, &buf)) {
382 *size = (size_t)buf.st_size;
394 if (buf && size && count && fp) {
395 ret = fread(buf, size, count, fp);
405 if (buf && size && count && fp) {
406 ret = fwrite(buf, size, count, fp);
432 if (
strOK(filename)) {
435 if (
nullptr == wname) {
439 ret = ::_wunlink(wname.get());
442 ret = unlink(filename);
455 return (
nullptr != dir) ? chdir(dir) : -1;
463 static std::vector<DirUniquePtr> dirStack;
470 dirStack.push_back(std::move(curDir));
475 else if (!dirStack.empty()) {