/* Windows-specific code for wimlib-imagex. */ #ifndef __WIN32__ # error "This file contains Windows code" #endif #include "imagex-win32.h" #include #include #include #include /* Convert a string from the "current Windows codepage" to UTF-16LE. */ wchar_t * win32_mbs_to_wcs(const char *mbs, size_t mbs_nbytes, size_t *num_wchars_ret) { if (mbs_nbytes > INT_MAX) { fwprintf(stderr, L"ERROR: too much data (%zu bytes)!\n", mbs_nbytes); return NULL; } if (mbs_nbytes == 0) { *num_wchars_ret = 0; return (wchar_t*)mbs; } int len = MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, mbs, mbs_nbytes, NULL, 0); if (len <= 0) goto out_invalid; wchar_t *wcs = malloc(len * sizeof(wchar_t)); if (!wcs) { fwprintf(stderr, L"ERROR: out of memory!\n"); return NULL; } int len2 = MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, mbs, mbs_nbytes, wcs, len); if (len2 != len) { free(wcs); goto out_invalid; } *num_wchars_ret = len; return wcs; out_invalid: fwprintf(stderr, L"ERROR: Invalid multi-byte string in the text file you provided as input!\n" L" Maybe try converting your text file to UTF-16LE?\n" ); return NULL; } static inline bool is_path_separator(wchar_t c) { return c == L'/' || c == L'\\'; } /* basename() (modifying, trailing-slash stripping version) for wide-character * strings. Understands both forward and backward slashes. */ wchar_t * win32_wbasename(wchar_t *path) { wchar_t *p = wcschr(path, L'\0'); p--; while (p >= path && is_path_separator(*p)) *p-- = '\0'; while (p >= path && !is_path_separator(*p)) p--; p++; return p; } /* Set a file descriptor to binary mode. */ void set_fd_to_binary_mode(int fd) { _setmode(fd, _O_BINARY); }