Skip to content
21 changes: 21 additions & 0 deletions tools/mtmd/clip.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,13 @@
#include <array>
#include <functional>

#ifdef _WIN32
#ifndef NOMINMAX
#define NOMINMAX
#endif
#include <windows.h>
#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};

Expand Down Expand Up @@ -3244,7 +3251,21 @@ struct clip_model_loader {
{
std::vector<uint8_t> 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<wchar_t> 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()));
}
Expand Down
3 changes: 3 additions & 0 deletions tools/mtmd/mtmd-cli.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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__))
Expand Down
30 changes: 28 additions & 2 deletions tools/mtmd/mtmd-helper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -437,22 +437,48 @@ 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<unsigned char> 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<wchar_t> 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<unsigned char> buf;
fseek(f, 0, SEEK_END);
long file_size = ftell(f);
fseek(f, 0, SEEK_SET);
buf.resize(file_size);

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;
}

Expand Down