diff --git a/tools/mtmd/clip.cpp b/tools/mtmd/clip.cpp index d1423b67f..c3348427f 100644 --- a/tools/mtmd/clip.cpp +++ b/tools/mtmd/clip.cpp @@ -24,6 +24,13 @@ #include #include +#ifdef _WIN32 +#ifndef NOMINMAX +#define NOMINMAX +#endif +#include +#endif + // TODO: allow to pass callback from user code struct clip_logger_state g_logger_state = {GGML_LOG_LEVEL_CONT, clip_log_callback_default, NULL}; @@ -3244,7 +3251,21 @@ struct clip_model_loader { { std::vector read_buf; +#ifdef _WIN32 + // Convert UTF-8 to UTF-16 for Windows + int wlen = MultiByteToWideChar(CP_UTF8, 0, fname.c_str(), -1, NULL, 0); + if (!wlen) { + throw std::runtime_error(string_format("%s: failed to convert filename to UTF-16: %s\n", __func__, fname.c_str())); + } + std::vector wfname(wlen); + wlen = MultiByteToWideChar(CP_UTF8, 0, fname.c_str(), -1, wfname.data(), wlen); + if (!wlen) { + throw std::runtime_error(string_format("%s: failed to convert filename to UTF-16: %s\n", __func__, fname.c_str())); + } + auto fin = std::ifstream(wfname.data(), std::ios::binary); +#else auto fin = std::ifstream(fname, std::ios::binary); +#endif if (!fin) { throw std::runtime_error(string_format("%s: failed to open %s\n", __func__, fname.c_str())); } diff --git a/tools/mtmd/mtmd-cli.cpp b/tools/mtmd/mtmd-cli.cpp index 3e19e9595..3ba655972 100644 --- a/tools/mtmd/mtmd-cli.cpp +++ b/tools/mtmd/mtmd-cli.cpp @@ -291,6 +291,9 @@ int main(int argc, char ** argv) { int n_predict = params.n_predict < 0 ? INT_MAX : params.n_predict; + console::init(params.simple_io, params.use_color); + atexit([]() { console::cleanup(); }); + // Ctrl+C handling { #if defined (__unix__) || (defined (__APPLE__) && defined (__MACH__)) diff --git a/tools/mtmd/mtmd-helper.cpp b/tools/mtmd/mtmd-helper.cpp index 686f42f39..e55a4843b 100644 --- a/tools/mtmd/mtmd-helper.cpp +++ b/tools/mtmd/mtmd-helper.cpp @@ -437,13 +437,38 @@ mtmd_bitmap * mtmd_helper_bitmap_init_from_buf(mtmd_context * ctx, const unsigne } mtmd_bitmap * mtmd_helper_bitmap_init_from_file(mtmd_context * ctx, const char * fname) { - std::vector buf; +#ifdef _WIN32 + // Convert UTF-8 to UTF-16 for Windows + int wlen = MultiByteToWideChar(CP_UTF8, 0, fname, -1, NULL, 0); + if (!wlen) { + LOG_ERR("Unable to convert filename to UTF-16: %s\n", fname); + return nullptr; + } + + std::vector wfname(wlen); + wlen = MultiByteToWideChar(CP_UTF8, 0, fname, -1, wfname.data(), wlen); + if (!wlen) { + LOG_ERR("Unable to convert filename to UTF-16: %s\n", fname); + return nullptr; + } + + // Open file with UTF-16 filename + FILE * f = _wfopen(wfname.data(), L"rb"); + if (!f) { + LOG_ERR("Unable to open file %s: %s\n", fname, strerror(errno)); + return nullptr; + } +#else + // On non-Windows platforms, use fopen directly FILE * f = fopen(fname, "rb"); if (!f) { LOG_ERR("Unable to open file %s: %s\n", fname, strerror(errno)); return nullptr; } +#endif + // Read file content + std::vector buf; fseek(f, 0, SEEK_END); long file_size = ftell(f); fseek(f, 0, SEEK_SET); @@ -451,8 +476,9 @@ mtmd_bitmap * mtmd_helper_bitmap_init_from_file(mtmd_context * ctx, const char * size_t n_read = fread(buf.data(), 1, file_size, f); fclose(f); + if (n_read != (size_t)file_size) { - LOG_ERR("Failed to read entire file %s", fname); + LOG_ERR("Failed to read entire file %s\n", fname); return nullptr; }