restore locale after opening windows file

This commit is contained in:
Bruce MacDonald 2024-03-07 17:27:02 -05:00
parent accdc9bb23
commit 2c65d77583

30
ggml.c
View file

@ -20283,23 +20283,37 @@ struct gguf_context * gguf_init_empty(void) {
return ctx; return ctx;
} }
struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_params params) {
#ifdef _WIN32 #ifdef _WIN32
static FILE *open_file(const char *fname) {
char* oldLocale = setlocale(LC_ALL, NULL);
if(oldLocale) {
oldLocale = strdup(oldLocale); // duplicate since setlocale returns a pointer to internal memory which might be altered by subsequent setlocale calls
}
setlocale(LC_ALL, ""); setlocale(LC_ALL, "");
FILE *file = NULL;
size_t size = mbstowcs(NULL, fname, 0) + 1; size_t size = mbstowcs(NULL, fname, 0) + 1;
wchar_t *wfname = malloc(size * sizeof(wchar_t)); wchar_t *wfname = malloc(size * sizeof(wchar_t));
if (!wfname) { if (wfname && mbstowcs(wfname, fname, size) != (size_t)-1) {
return NULL; file = _wfopen(wfname, L"rb");
} }
if (mbstowcs(wfname, fname, size) == (size_t)-1) {
free(wfname); free(wfname);
return NULL;
if (oldLocale) {
setlocale(LC_ALL, oldLocale);
free(oldLocale);
}
return file;
} }
FILE * file = _wfopen(wfname, L"rb");
free(wfname);
#else #else
FILE * file = fopen(fname, "rb"); static FILE *open_file(const char *fname) {
return fopen(fname, "rb");
}
#endif #endif
struct gguf_context * gguf_init_from_file(const char * fname, struct gguf_init_params params) {
FILE *file = open_file(fname);
if (!file) { if (!file) {
return NULL; return NULL;
} }