#include "include/core/SkTypes.h"
#include "src/core/SkOSFile.h"
#include <errno.h>
#include <stdio.h>
#include <sys/stat.h>
#ifdef _WIN32
#include <direct.h>
#include <io.h>
#include <vector>
#include "src/base/SkUTF.h"
#endif
#ifdef SK_BUILD_FOR_IOS
#include "src/ports/SkOSFile_ios.h"
#endif
#ifdef _WIN32
static bool is_ascii(const char* s) {
while (char v = *s++) {
if ((v & 0x80) != 0) {
return false;
}
}
return true;
}
static FILE* fopen_win(const char* utf8path, const char* perm) {
if (is_ascii(utf8path)) {
return fopen(utf8path, perm);
}
const char* ptr = utf8path;
const char* end = utf8path + strlen(utf8path);
size_t n = 0;
while (ptr < end) {
SkUnichar u = SkUTF::NextUTF8(&ptr, end);
if (u < 0) {
return nullptr;
}
n += SkUTF::ToUTF16(u);
}
std::vector<uint16_t> wchars(n + 1);
uint16_t* out = wchars.data();
ptr = utf8path;
while (ptr < end) {
out += SkUTF::ToUTF16(SkUTF::NextUTF8(&ptr, end), out);
}
SkASSERT(out == &wchars[n]);
*out = 0;
wchar_t wperms[4] = {(wchar_t)perm[0], (wchar_t)perm[1], (wchar_t)perm[2], (wchar_t)perm[3]};
return _wfopen((wchar_t*)wchars.data(), wperms);
}
#endif
FILE* sk_fopen(const char path[], SkFILE_Flags flags) { … }
size_t sk_fgetsize(FILE* f) { … }
size_t sk_fwrite(const void* buffer, size_t byteCount, FILE* f) { … }
void sk_fflush(FILE* f) { … }
size_t sk_ftell(FILE* f) { … }
void sk_fclose(FILE* f) { … }
bool sk_isdir(const char *path) { … }
bool sk_mkdir(const char* path) { … }