int ConvertString(char *buf, size_t nBytes, UINT cpFrom, UINT cpTo, LPCSTR lpDefaultChar) { int n = (int)lstrlen(buf); if (cpFrom != cpTo) { WCHAR *pWBuf = (WCHAR *)malloc(sizeof(WCHAR)*nBytes); if (!pWBuf) { errno = ENOMEM; return -1; } n = MultiByteToWideChar(cpFrom, /* CodePage, (CP_ACP, CP_OEMCP, CP_UTF8, ...) */ 0, /* dwFlags, */ buf, /* lpMultiByteStr, */ n+1, /* cbMultiByte, +1 to copy the final NUL */ pWBuf, /* lpWideCharStr, */ (int)nBytes /* cchWideChar, */ ); n = WideCharToMultiByte(cpTo, /* CodePage, (CP_ACP, CP_OEMCP, CP_UTF8, ...) */ 0, /* dwFlags, */ pWBuf, /* lpWideCharStr, */ n, /* cchWideChar, */ buf, /* lpMultiByteStr, */ (int)nBytes, /* cbMultiByte, */ lpDefaultChar, /* lpDefaultChar, */ NULL /* lpUsedDefaultChar */ ); free(pWBuf); if (!n) { errno = Win32ErrorToErrno(); return -1; } n -= 1; /* Output string size, not counting the final NUL */ } return n; }
int CountCharacters(const char *string, UINT cp) { int n; WCHAR *pWBuf; n = (int)lstrlen(string); if (!n) return 0; pWBuf = (WCHAR *)malloc(sizeof(WCHAR)*n); if (!pWBuf) { errno = ENOMEM; return -1; } n = MultiByteToWideChar(cp, /* CodePage, (CP_ACP, CP_OEMCP, CP_UTF8, ...) */ 0, /* dwFlags, */ string, /* lpMultiByteStr, */ n, /* cbMultiByte, */ pWBuf, /* lpWideCharStr, */ n /* cchWideChar, */ ); free(pWBuf); if (!n) { errno = Win32ErrorToErrno(); return -1; } return n; }
/* Get the Reparse Point Tag for a mount point - MultiByte char version */ DWORD GetReparseTagM(const char *path, UINT cp) { WCHAR wszPath[PATH_MAX]; int n; /* Convert the pathname to a unicode string, with the proper extension prefixes if it's longer than 260 bytes */ n = MultiByteToWidePath(cp, /* CodePage, (CP_ACP, CP_OEMCP, CP_UTF8, ...) */ path, /* lpMultiByteStr, */ wszPath, /* lpWideCharStr, */ COUNTOF(wszPath) /* cchWideChar, */ ); if (!n) { errno = Win32ErrorToErrno(); DEBUG_PRINTF(("GetReparseTagM(\"%s\", %d); // Conversion to Unicode failed. errno=%d - %s\n", path, cp, errno, strerror(errno))); return 0; } return GetReparseTagW(wszPath); }
int _accessU(const char *pszName, int iMode) { WCHAR wszName[PATH_MAX]; int n; /* Convert the pathname to a unicode string, with the proper extension prefixes if it's longer than 260 bytes */ n = MultiByteToWidePath(CP_UTF8, /* CodePage, (CP_ACP, CP_OEMCP, CP_UTF8, ...) */ pszName, /* lpMultiByteStr, */ wszName, /* lpWideCharStr, */ COUNTOF(wszName) /* cchWideChar, */ ); if (!n) { errno = Win32ErrorToErrno(); return -1; } return _waccess(wszName, iMode); }
int chdirU(const char *pszDir) { WCHAR wszDir[PATH_MAX]; BOOL bDone; int n; DEBUG_PRINTF(("chdir(\"%s\");\n", pszDir)); /* Convert the pathname to a unicode string, with the proper extension prefixes if it's longer than 260 bytes */ n = MultiByteToWidePath(CP_UTF8, /* CodePage, (CP_ACP, CP_OEMCP, CP_UTF8, ...) */ pszDir, /* lpMultiByteStr, */ wszDir, /* lpWideCharStr, */ COUNTOF(wszDir) /* cchWideChar, */ ); bDone = SetCurrentDirectoryW(wszDir); if (!bDone) { errno = Win32ErrorToErrno(); } return bDone ? 0 : -1; }
int chdirM(const char *pszDir, UINT cp) { WCHAR *pwszDir; BOOL bDone; int iErr = 0; DEBUG_ENTER(("chdir(\"%s\");\n", pszDir)); /* Convert the pathname to a unicode string, with the proper extension prefixes if it's longer than 260 bytes */ pwszDir = MultiByteToNewWidePath(cp, pszDir); if (!pwszDir) return -1; bDone = SetCurrentDirectoryW(pwszDir); if (!bDone) { errno = Win32ErrorToErrno(); iErr = -1; } free(pwszDir); DEBUG_QUIET_LEAVE(); return iErr; }