2 // Copyright (C) 2011 Suguru Kawamoto
\r
3 // マルチバイト文字ワイド文字APIラッパー
\r
4 // マルチバイト文字はUTF-8、ワイド文字はUTF-16であるものとする
\r
5 // 全ての制御用の文字はASCIIの範囲であるため、Shift_JISとUTF-8間の変換は不要
\r
13 #include <windows.h>
\r
14 #include <commctrl.h>
\r
16 #include <htmlhelp.h>
\r
18 #define DO_NOT_REPLACE
\r
19 #include "mbswrapper.h"
\r
21 // マルチバイト文字列からワイド文字列へ変換
\r
22 int MtoW(LPWSTR pDst, int size, LPCSTR pSrc, int count)
\r
24 if(pSrc < (LPCSTR)0x00010000 || pSrc == (LPCSTR)~0)
\r
27 return MultiByteToWideChar(CP_UTF8, 0, pSrc, count, pDst, size);
\r
28 return MultiByteToWideChar(CP_UTF8, 0, pSrc, count, NULL, 0);
\r
31 // ワイド文字列からマルチバイト文字列へ変換
\r
32 int WtoM(LPSTR pDst, int size, LPCWSTR pSrc, int count)
\r
34 if(pSrc < (LPCWSTR)0x00010000 || pSrc == (LPCWSTR)~0)
\r
37 return WideCharToMultiByte(CP_UTF8, 0, pSrc, count, pDst, size, NULL, NULL);
\r
38 return WideCharToMultiByte(CP_UTF8, 0, pSrc, count, NULL, 0, NULL, NULL);
\r
41 // Shift_JIS文字列からワイド文字列へ変換
\r
42 int AtoW(LPWSTR pDst, int size, LPCSTR pSrc, int count)
\r
44 if(pSrc < (LPCSTR)0x00010000 || pSrc == (LPCSTR)~0)
\r
47 return MultiByteToWideChar(CP_ACP, 0, pSrc, count, pDst, size);
\r
48 return MultiByteToWideChar(CP_ACP, 0, pSrc, count, NULL, 0);
\r
51 // ワイド文字列からShift_JIS文字列へ変換
\r
52 int WtoA(LPSTR pDst, int size, LPCWSTR pSrc, int count)
\r
54 if(pSrc < (LPCWSTR)0x00010000 || pSrc == (LPCWSTR)~0)
\r
57 return WideCharToMultiByte(CP_ACP, 0, pSrc, count, pDst, size, NULL, NULL);
\r
58 return WideCharToMultiByte(CP_ACP, 0, pSrc, count, NULL, 0, NULL, NULL);
\r
61 // マルチバイト文字列バッファ終端を強制的にNULLで置換
\r
62 int TerminateStringM(LPSTR lpString, int size)
\r
65 if(lpString < (LPSTR)0x00010000 || lpString == (LPSTR)~0)
\r
67 for(i = 0; i < size; i++)
\r
69 if(lpString[i] == '\0')
\r
77 // ワイド文字列バッファ終端を強制的にNULLで置換
\r
78 int TerminateStringW(LPWSTR lpString, int size)
\r
81 if(lpString < (LPWSTR)0x00010000 || lpString == (LPWSTR)~0)
\r
83 for(i = 0; i < size; i++)
\r
85 if(lpString[i] == L'\0')
\r
89 lpString[i] = L'\0';
\r
93 // Shift_JIS文字列バッファ終端を強制的にNULLで置換
\r
94 int TerminateStringA(LPSTR lpString, int size)
\r
97 if(lpString < (LPSTR)0x00010000 || lpString == (LPSTR)~0)
\r
99 for(i = 0; i < size; i++)
\r
101 if(lpString[i] == '\0')
\r
105 lpString[i] = '\0';
\r
109 // NULL区切り複数マルチバイト文字列の長さを取得
\r
110 size_t GetMultiStringLengthM(LPCSTR lpString)
\r
113 if(lpString < (LPCSTR)0x00010000 || lpString == (LPCSTR)~0)
\r
116 while(lpString[i] != '\0' || lpString[i + 1] != '\0')
\r
124 // NULL区切り複数ワイド文字列の長さを取得
\r
125 size_t GetMultiStringLengthW(LPCWSTR lpString)
\r
128 if(lpString < (LPCWSTR)0x00010000 || lpString == (LPCWSTR)~0)
\r
131 while(lpString[i] != L'\0' || lpString[i + 1] != L'\0')
\r
139 // NULL区切り複数Shift_JIS文字列の長さを取得
\r
140 size_t GetMultiStringLengthA(LPCSTR lpString)
\r
143 if(lpString < (LPCSTR)0x00010000 || lpString == (LPCSTR)~0)
\r
146 while(lpString[i] != '\0' || lpString[i + 1] != '\0')
\r
154 // NULL区切りマルチバイト文字列からワイド文字列へ変換
\r
155 int MtoWMultiString(LPWSTR pDst, int size, LPCSTR pSrc)
\r
158 if(pSrc < (LPCSTR)0x00010000 || pSrc == (LPCSTR)~0)
\r
161 return GetMultiStringLengthM(pSrc);
\r
163 while(*pSrc != '\0')
\r
165 i += MultiByteToWideChar(CP_UTF8, 0, pSrc, -1, pDst + i, size - i - 1);
\r
166 pSrc += strlen(pSrc) + 1;
\r
172 // NULL区切りワイド文字列からマルチバイト文字列へ変換
\r
173 int WtoMMultiString(LPSTR pDst, int size, LPCWSTR pSrc)
\r
176 if(pSrc < (LPCWSTR)0x00010000 || pSrc == (LPCWSTR)~0)
\r
179 return GetMultiStringLengthW(pSrc);
\r
181 while(*pSrc != L'\0')
\r
183 i += WideCharToMultiByte(CP_UTF8, 0, pSrc, -1, pDst + i, size - i - 1, NULL, NULL);
\r
184 pSrc += wcslen(pSrc) + 1;
\r
190 // NULL区切りShift_JIS文字列からワイド文字列へ変換
\r
191 int AtoWMultiString(LPWSTR pDst, int size, LPCSTR pSrc)
\r
194 if(pSrc < (LPCSTR)0x00010000 || pSrc == (LPCSTR)~0)
\r
197 return GetMultiStringLengthA(pSrc);
\r
199 while(*pSrc != '\0')
\r
201 i += MultiByteToWideChar(CP_ACP, 0, pSrc, -1, pDst + i, size - i - 1);
\r
202 pSrc += strlen(pSrc) + 1;
\r
208 // NULL区切りワイド文字列からShift_JIS文字列へ変換
\r
209 int WtoAMultiString(LPSTR pDst, int size, LPCWSTR pSrc)
\r
212 if(pSrc < (LPCWSTR)0x00010000 || pSrc == (LPCWSTR)~0)
\r
215 return GetMultiStringLengthW(pSrc);
\r
217 while(*pSrc != L'\0')
\r
219 i += WideCharToMultiByte(CP_ACP, 0, pSrc, -1, pDst + i, size - i - 1, NULL, NULL);
\r
220 pSrc += wcslen(pSrc) + 1;
\r
226 // マルチバイト文字列用のメモリを確保
\r
227 char* AllocateStringM(int size)
\r
230 // 0が指定される場合があるため1文字分追加
\r
231 p = (char*)malloc(sizeof(char) * (size + 1));
\r
232 // 念のため先頭にNULL文字を代入
\r
239 wchar_t* AllocateStringW(int size)
\r
242 // 0が指定される場合があるため1文字分追加
\r
243 p = (wchar_t*)malloc(sizeof(wchar_t) * (size + 1));
\r
244 // 念のため先頭にNULL文字を代入
\r
250 // Shift_JIS文字列用のメモリを確保
\r
251 char* AllocateStringA(int size)
\r
254 // 0が指定される場合があるため1文字分追加
\r
255 p = (char*)malloc(sizeof(char) * (size + 1));
\r
256 // 念のため先頭にNULL文字を代入
\r
262 // メモリを確保してマルチバイト文字列からワイド文字列へ変換
\r
264 wchar_t* DuplicateMtoW(LPCSTR lpString, int c)
\r
268 if(lpString < (LPCSTR)0x00010000 || lpString == (LPCSTR)~0)
\r
269 return (wchar_t*)lpString;
\r
271 c = strlen(lpString);
\r
272 p = AllocateStringW(MtoW(NULL, 0, lpString, c) + 1);
\r
275 i = MtoW(p, 65535, lpString, c);
\r
281 // 指定したサイズのメモリを確保してマルチバイト文字列からワイド文字列へ変換
\r
283 wchar_t* DuplicateMtoWBuffer(LPCSTR lpString, int c, int size)
\r
287 if(lpString < (LPCSTR)0x00010000 || lpString == (LPCSTR)~0)
\r
288 return (wchar_t*)lpString;
\r
290 c = strlen(lpString);
\r
291 p = AllocateStringW(size);
\r
294 i = MtoW(p, size, lpString, c);
\r
300 // メモリを確保してNULL区切りマルチバイト文字列からワイド文字列へ変換
\r
302 wchar_t* DuplicateMtoWMultiString(LPCSTR lpString)
\r
306 if(lpString < (LPCSTR)0x00010000 || lpString == (LPCSTR)~0)
\r
307 return (wchar_t*)lpString;
\r
308 count = GetMultiStringLengthM(lpString) + 1;
\r
309 p = AllocateStringW(count);
\r
311 MtoW(p, count, lpString, count);
\r
315 // 指定したサイズのメモリを確保してNULL区切りマルチバイト文字列からワイド文字列へ変換
\r
317 wchar_t* DuplicateMtoWMultiStringBuffer(LPCSTR lpString, int size)
\r
321 if(lpString < (LPCSTR)0x00010000 || lpString == (LPCSTR)~0)
\r
322 return (wchar_t*)lpString;
\r
323 count = GetMultiStringLengthM(lpString) + 1;
\r
324 p = AllocateStringW(size);
\r
327 MtoW(p, size, lpString, count);
\r
328 p[size - 2] = L'\0';
\r
329 p[size - 1] = L'\0';
\r
334 // メモリを確保してワイド文字列からマルチバイト文字列へ変換
\r
336 char* DuplicateWtoM(LPCWSTR lpString, int c)
\r
340 if(lpString < (LPCWSTR)0x00010000 || lpString == (LPCWSTR)~0)
\r
341 return (char*)lpString;
\r
343 c = wcslen(lpString);
\r
344 p = AllocateStringM(WtoM(NULL, 0, lpString, c) + 1);
\r
347 i = WtoM(p, 65535, lpString, c);
\r
353 // メモリを確保してShift_JIS文字列からワイド文字列へ変換
\r
355 wchar_t* DuplicateAtoW(LPCSTR lpString, int c)
\r
359 if(lpString < (LPCSTR)0x00010000 || lpString == (LPCSTR)~0)
\r
360 return (wchar_t*)lpString;
\r
362 c = strlen(lpString);
\r
363 p = AllocateStringW(AtoW(NULL, 0, lpString, c) + 1);
\r
366 i = AtoW(p, 65535, lpString, c);
\r
372 // メモリを確保してワイド文字列からShift_JIS文字列へ変換
\r
374 char* DuplicateWtoA(LPCWSTR lpString, int c)
\r
378 if(lpString < (LPCWSTR)0x00010000 || lpString == (LPCWSTR)~0)
\r
379 return (char*)lpString;
\r
381 c = wcslen(lpString);
\r
382 p = AllocateStringA(WtoA(NULL, 0, lpString, c) + 1);
\r
385 i = WtoA(p, 65535, lpString, c);
\r
391 // マルチバイト文字列からコードポイントと次のポインタを取得
\r
392 // エンコードが不正な場合は0x80000000を返す
\r
393 DWORD GetNextCharM(LPCSTR lpString, LPCSTR pLimit, LPCSTR* ppNext)
\r
400 pLimit = (LPCSTR)(~0);
\r
401 if(lpString < pLimit)
\r
403 if((*lpString & 0xfe) == 0xfc)
\r
406 Code |= (DWORD)*lpString & 0x01;
\r
408 else if((*lpString & 0xfc) == 0xf8)
\r
411 Code |= (DWORD)*lpString & 0x03;
\r
413 else if((*lpString & 0xf8) == 0xf0)
\r
416 Code |= (DWORD)*lpString & 0x07;
\r
418 else if((*lpString & 0xf0) == 0xe0)
\r
421 Code |= (DWORD)*lpString & 0x0f;
\r
423 else if((*lpString & 0xe0) == 0xc0)
\r
426 Code |= (DWORD)*lpString & 0x1f;
\r
428 else if((*lpString & 0x80) == 0x00)
\r
431 Code |= (DWORD)*lpString & 0x7f;
\r
434 while(lpString < pLimit && i > 0 && (*lpString & 0xc0) == 0x80)
\r
438 Code |= (DWORD)*lpString & 0x3f;
\r
445 *ppNext = lpString;
\r
449 // マルチバイト文字列へコードポイントの文字を追加して次のポインタを取得
\r
451 int PutNextCharM(LPSTR lpString, LPSTR pLimit, LPSTR* ppNext, DWORD Code)
\r
458 pLimit = (LPSTR)(~0);
\r
459 if(lpString < pLimit)
\r
461 if(Code & 0x7c000000)
\r
464 *lpString = 0xfc | ((CHAR)(Code >> 30) & 0x01);
\r
466 else if(Code & 0x03e00000)
\r
469 *lpString = 0xf8 | ((CHAR)(Code >> 24) & 0x03);
\r
471 else if(Code & 0x001f0000)
\r
474 *lpString = 0xf0 | ((CHAR)(Code >> 18) & 0x07);
\r
476 else if(Code & 0x0000f800)
\r
479 *lpString = 0xe0 | ((CHAR)(Code >> 12) & 0x0f);
\r
481 else if(Code & 0x00000780)
\r
484 *lpString = 0xc0 | ((CHAR)(Code >> 6) & 0x1f);
\r
489 *lpString = (CHAR)Code & 0x7f;
\r
493 while(lpString < pLimit && i > 0)
\r
496 *lpString = 0x80 | ((CHAR)(Code >> (i * 6)) & 0x3f);
\r
503 *ppNext = lpString;
\r
507 // ワイド文字列からコードポイントと次のポインタを取得
\r
508 // エンコードが不正な場合は0x80000000を返す
\r
509 DWORD GetNextCharW(LPCWSTR lpString, LPCWSTR pLimit, LPCWSTR* ppNext)
\r
514 pLimit = (LPCWSTR)(~0);
\r
515 if(lpString < pLimit)
\r
517 if((*lpString & 0xf800) == 0xd800)
\r
519 if((*lpString & 0x0400) == 0x0400)
\r
521 Code = (DWORD)*lpString & 0x03ff;
\r
523 if(lpString < pLimit)
\r
525 if((*lpString & 0x0400) == 0x0000)
\r
527 Code |= ((DWORD)*lpString & 0x03ff) << 10;
\r
539 Code = (DWORD)*lpString;
\r
544 *ppNext = lpString;
\r
548 // ワイド文字列へコードポイントの文字を追加して次のポインタを取得
\r
550 int PutNextCharW(LPWSTR lpString, LPWSTR pLimit, LPWSTR* ppNext, DWORD Code)
\r
555 pLimit = (LPWSTR)(~0);
\r
556 if(lpString < pLimit)
\r
558 if((Code & 0x7fff0000) || (Code & 0x0000f800) == 0x0000d800)
\r
560 *lpString = 0xdc00 | ((WCHAR)Code & 0x03ff);
\r
562 if(lpString < pLimit)
\r
564 *lpString = 0xd800 | ((WCHAR)(Code >> 10) & 0x03ff);
\r
571 *lpString = (WCHAR)Code;
\r
577 *ppNext = lpString;
\r
581 // マルチバイト文字列の冗長表現を修正
\r
583 // 修正後の文字列の長さは元の文字列の長さ以下のためpDstとpSrcに同じ値を指定可能
\r
584 BOOL FixStringM(LPSTR pDst, LPCSTR pSrc)
\r
593 while(*pSrc != '\0')
\r
595 Code = GetNextCharM(pSrc, NULL, &pSrc);
\r
596 if(Code & 0x80000000)
\r
598 else if(Code & 0x7c000000)
\r
601 c = (char)(0xfc | (Code >> (6 * i)));
\r
603 else if(Code & 0x03e00000)
\r
606 c = (char)(0xf8 | (Code >> (6 * i)));
\r
608 else if(Code & 0x001f0000)
\r
611 c = (char)(0xf0 | (Code >> (6 * i)));
\r
613 else if(Code & 0x0000f800)
\r
616 c = (char)(0xe0 | (Code >> (6 * i)));
\r
618 else if(Code & 0x00000780)
\r
621 c = (char)(0xc0 | (Code >> (6 * i)));
\r
636 c = (char)(0x80 | ((Code >> (6 * i)) & 0x3f));
\r
650 // NULL区切りマルチバイト文字列の冗長表現を修正
\r
652 // 修正後の文字列の長さは元の文字列の長さ以下のためpDstとpSrcに同じ値を指定可能
\r
653 BOOL FixMultiStringM(LPSTR pDst, LPCSTR pSrc)
\r
658 while(*pSrc != '\0')
\r
660 Length = strlen(pSrc) + 1;
\r
661 bResult = bResult | FixStringM(pDst, pSrc);
\r
663 pDst += strlen(pDst) + 1;
\r
669 // マルチバイト文字列の冗長表現を確認
\r
671 BOOL CheckStringM(LPCSTR lpString)
\r
676 p = AllocateStringM(strlen(lpString) + 1);
\r
679 bResult = FixStringM(p, lpString);
\r
680 FreeDuplicatedString(p);
\r
685 // NULL区切りマルチバイト文字列の冗長表現を確認
\r
687 BOOL CheckMultiStringM(LPCSTR lpString)
\r
692 p = AllocateStringM(GetMultiStringLengthM(lpString) + 1);
\r
695 bResult = FixMultiStringM(p, lpString);
\r
696 FreeDuplicatedString(p);
\r
703 void FreeDuplicatedString(void* p)
\r
705 if(p < (void*)0x00010000 || p == (void*)~0)
\r
710 // マルチバイト文字列からワイド文字列へ変換
\r
711 // UTF-8からUTF-16 LEへの変換専用
\r
712 int MultiByteToWideCharAlternative(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar)
\r
715 LPCSTR pMultiLimit;
\r
719 if(CodePage != CP_UTF8 || dwFlags != 0)
\r
720 return MultiByteToWideChar(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, lpWideCharStr, cchWideChar);
\r
722 if(cbMultiByte == -1)
\r
723 pMultiLimit = lpMultiByteStr + strlen(lpMultiByteStr) + 1;
\r
725 pMultiLimit = lpMultiByteStr + cbMultiByte;
\r
726 pWideLimit = lpWideCharStr + cchWideChar;
\r
727 while(lpMultiByteStr < pMultiLimit)
\r
729 Code = GetNextCharM(lpMultiByteStr, pMultiLimit, &lpMultiByteStr);
\r
730 if(Code == 0x80000000)
\r
734 WideCount += PutNextCharW(lpWideCharStr, pWideLimit, &lpWideCharStr, Code);
\r
735 if(lpWideCharStr >= pWideLimit)
\r
742 WideCount += PutNextCharW(Temp, NULL, NULL, Code);
\r
747 // ワイド文字列からマルチバイト文字列へ変換
\r
748 // UTF-16 LEからUTF-8への変換専用
\r
749 int WideCharToMultiByteAlternative(UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar)
\r
752 LPCWSTR pWideLimit;
\r
756 if(CodePage != CP_UTF8 || dwFlags != 0)
\r
757 return WideCharToMultiByte(CodePage, dwFlags, lpWideCharStr, cchWideChar, lpMultiByteStr, cbMultiByte, lpDefaultChar, lpUsedDefaultChar);
\r
759 if(cchWideChar == -1)
\r
760 pWideLimit = lpWideCharStr + wcslen(lpWideCharStr) + 1;
\r
762 pWideLimit = lpWideCharStr + cchWideChar;
\r
763 pMultiLimit = lpMultiByteStr + cbMultiByte;
\r
764 while(lpWideCharStr < pWideLimit)
\r
766 Code = GetNextCharW(lpWideCharStr, pWideLimit, &lpWideCharStr);
\r
767 if(Code == 0x80000000)
\r
771 MultiCount += PutNextCharM(lpMultiByteStr, pMultiLimit, &lpMultiByteStr, Code);
\r
772 if(lpMultiByteStr >= pMultiLimit)
\r
779 MultiCount += PutNextCharM(Temp, NULL, NULL, Code);
\r
781 if(lpUsedDefaultChar)
\r
782 *lpUsedDefaultChar = FALSE;
\r
789 // マルチバイト文字バッファ pm%d
\r
792 #pragma warning(disable:4102)
\r
793 #define START_ROUTINE do{
\r
794 #define END_ROUTINE }while(0);end_of_routine:
\r
795 #define QUIT_ROUTINE goto end_of_routine;
\r
797 HANDLE CreateFileM(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
\r
799 HANDLE r = INVALID_HANDLE_VALUE;
\r
800 wchar_t* pw0 = NULL;
\r
802 pw0 = DuplicateMtoW(lpFileName, -1);
\r
803 r = CreateFileW(pw0, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
\r
805 FreeDuplicatedString(pw0);
\r
809 HANDLE FindFirstFileM(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData)
\r
811 HANDLE r = INVALID_HANDLE_VALUE;
\r
812 wchar_t* pw0 = NULL;
\r
813 WIN32_FIND_DATAW a0;
\r
815 pw0 = DuplicateMtoW(lpFileName, -1);
\r
816 r = FindFirstFileW(pw0, &a0);
\r
817 if(r != INVALID_HANDLE_VALUE)
\r
819 lpFindFileData->dwFileAttributes = a0.dwFileAttributes;
\r
820 lpFindFileData->ftCreationTime = a0.ftCreationTime;
\r
821 lpFindFileData->ftLastAccessTime = a0.ftLastAccessTime;
\r
822 lpFindFileData->ftLastWriteTime = a0.ftLastWriteTime;
\r
823 lpFindFileData->nFileSizeHigh = a0.nFileSizeHigh;
\r
824 lpFindFileData->nFileSizeLow = a0.nFileSizeLow;
\r
825 lpFindFileData->dwReserved0 = a0.dwReserved0;
\r
826 lpFindFileData->dwReserved1 = a0.dwReserved1;
\r
827 WtoM(lpFindFileData->cFileName, sizeof(lpFindFileData->cFileName), a0.cFileName, -1);
\r
828 WtoM(lpFindFileData->cAlternateFileName, sizeof(lpFindFileData->cAlternateFileName), a0.cAlternateFileName, -1);
\r
831 FreeDuplicatedString(pw0);
\r
835 BOOL FindNextFileM(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData)
\r
838 WIN32_FIND_DATAW a0;
\r
840 r = FindNextFileW(hFindFile, &a0);
\r
843 lpFindFileData->dwFileAttributes = a0.dwFileAttributes;
\r
844 lpFindFileData->ftCreationTime = a0.ftCreationTime;
\r
845 lpFindFileData->ftLastAccessTime = a0.ftLastAccessTime;
\r
846 lpFindFileData->ftLastWriteTime = a0.ftLastWriteTime;
\r
847 lpFindFileData->nFileSizeHigh = a0.nFileSizeHigh;
\r
848 lpFindFileData->nFileSizeLow = a0.nFileSizeLow;
\r
849 lpFindFileData->dwReserved0 = a0.dwReserved0;
\r
850 lpFindFileData->dwReserved1 = a0.dwReserved1;
\r
851 WtoM(lpFindFileData->cFileName, sizeof(lpFindFileData->cFileName), a0.cFileName, -1);
\r
852 WtoM(lpFindFileData->cAlternateFileName, sizeof(lpFindFileData->cAlternateFileName), a0.cAlternateFileName, -1);
\r
858 DWORD GetCurrentDirectoryM(DWORD nBufferLength, LPSTR lpBuffer)
\r
861 wchar_t* pw0 = NULL;
\r
863 // TODO: バッファが不十分な場合に必要なサイズを返す
\r
864 pw0 = AllocateStringW(nBufferLength * 4);
\r
865 GetCurrentDirectoryW(nBufferLength * 4, pw0);
\r
866 WtoM(lpBuffer, nBufferLength, pw0, -1);
\r
867 r = TerminateStringM(lpBuffer, nBufferLength);
\r
869 FreeDuplicatedString(pw0);
\r
873 BOOL SetCurrentDirectoryM(LPCSTR lpPathName)
\r
876 wchar_t* pw0 = NULL;
\r
878 pw0 = DuplicateMtoW(lpPathName, -1);
\r
879 r = SetCurrentDirectoryW(pw0);
\r
881 FreeDuplicatedString(pw0);
\r
885 DWORD GetTempPathM(DWORD nBufferLength, LPSTR lpBuffer)
\r
888 wchar_t* pw0 = NULL;
\r
890 pw0 = AllocateStringW(nBufferLength * 4);
\r
891 GetTempPathW(nBufferLength * 4, pw0);
\r
892 WtoM(lpBuffer, nBufferLength, pw0, -1);
\r
893 r = TerminateStringM(lpBuffer, nBufferLength);
\r
895 FreeDuplicatedString(pw0);
\r
899 DWORD GetFileAttributesM(LPCSTR lpFileName)
\r
902 wchar_t* pw0 = NULL;
\r
904 pw0 = DuplicateMtoW(lpFileName, -1);
\r
905 r = GetFileAttributesW(pw0);
\r
907 FreeDuplicatedString(pw0);
\r
911 DWORD GetModuleFileNameM(HMODULE hModule, LPCH lpFilename, DWORD nSize)
\r
914 wchar_t* pw0 = NULL;
\r
916 pw0 = AllocateStringW(nSize * 4);
\r
917 GetModuleFileNameW(hModule, pw0, nSize * 4);
\r
918 WtoM(lpFilename, nSize, pw0, -1);
\r
919 r = TerminateStringM(lpFilename, nSize);
\r
921 FreeDuplicatedString(pw0);
\r
925 BOOL CopyFileM(LPCSTR lpExistingFileName, LPCSTR lpNewFileName, BOOL bFailIfExists)
\r
928 wchar_t* pw0 = NULL;
\r
929 wchar_t* pw1 = NULL;
\r
931 pw0 = DuplicateMtoW(lpExistingFileName, -1);
\r
932 pw1 = DuplicateMtoW(lpNewFileName, -1);
\r
933 r = CopyFileW(pw0, pw1, bFailIfExists);
\r
935 FreeDuplicatedString(pw0);
\r
936 FreeDuplicatedString(pw1);
\r
940 BOOL MoveFileM(LPCSTR lpExistingFileName, LPCSTR lpNewFileName)
\r
943 wchar_t* pw0 = NULL;
\r
944 wchar_t* pw1 = NULL;
\r
946 pw0 = DuplicateMtoW(lpExistingFileName, -1);
\r
947 pw1 = DuplicateMtoW(lpNewFileName, -1);
\r
948 r = MoveFileW(pw0, pw1);
\r
950 FreeDuplicatedString(pw0);
\r
951 FreeDuplicatedString(pw1);
\r
955 int mkdirM(const char * _Path)
\r
958 wchar_t* pw0 = NULL;
\r
960 pw0 = DuplicateMtoW(_Path, -1);
\r
963 FreeDuplicatedString(pw0);
\r
967 int _mkdirM(const char * _Path)
\r
970 wchar_t* pw0 = NULL;
\r
972 pw0 = DuplicateMtoW(_Path, -1);
\r
975 FreeDuplicatedString(pw0);
\r
979 int rmdirM(const char * _Path)
\r
982 wchar_t* pw0 = NULL;
\r
984 pw0 = DuplicateMtoW(_Path, -1);
\r
987 FreeDuplicatedString(pw0);
\r
991 int _rmdirM(const char * _Path)
\r
994 wchar_t* pw0 = NULL;
\r
996 pw0 = DuplicateMtoW(_Path, -1);
\r
999 FreeDuplicatedString(pw0);
\r
1003 int removeM(const char * _Filename)
\r
1006 wchar_t* pw0 = NULL;
\r
1008 pw0 = DuplicateMtoW(_Filename, -1);
\r
1009 r = _wremove(pw0);
\r
1011 FreeDuplicatedString(pw0);
\r
1015 int _removeM(const char * _Filename)
\r
1018 wchar_t* pw0 = NULL;
\r
1020 pw0 = DuplicateMtoW(_Filename, -1);
\r
1021 r = _wremove(pw0);
\r
1023 FreeDuplicatedString(pw0);
\r
1027 int _unlinkM(const char * _Filename)
\r
1030 wchar_t* pw0 = NULL;
\r
1032 pw0 = DuplicateMtoW(_Filename, -1);
\r
1033 r = _wunlink(pw0);
\r
1035 FreeDuplicatedString(pw0);
\r
1039 size_t _mbslenM(const unsigned char * _Str)
\r
1043 while(GetNextCharM(_Str, NULL, &_Str) > 0)
\r
1051 unsigned char * _mbschrM(const unsigned char * _Str, unsigned int _Ch)
\r
1053 unsigned char* r = NULL;
\r
1057 while((c = GetNextCharM(_Str, NULL, &p)) > 0)
\r
1064 r = (unsigned char*)_Str;
\r
1069 unsigned char * _mbsrchrM(const unsigned char * _Str, unsigned int _Ch)
\r
1071 unsigned char* r = NULL;
\r
1075 while((c = GetNextCharM(_Str, NULL, &p)) > 0)
\r
1078 r = (unsigned char*)_Str;
\r
1082 r = (unsigned char*)_Str;
\r
1087 unsigned char * _mbsstrM(const unsigned char * _Str, const unsigned char * _Substr)
\r
1089 unsigned char* r = NULL;
\r
1091 r = strstr(_Str, _Substr);
\r
1096 int _mbscmpM(const unsigned char * _Str1, const unsigned char * _Str2)
\r
1100 r = strcmp(_Str1, _Str2);
\r
1105 int _mbsicmpM(const unsigned char * _Str1, const unsigned char * _Str2)
\r
1109 r = _stricmp(_Str1, _Str2);
\r
1114 int _mbsncmpM(const unsigned char * _Str1, const unsigned char * _Str2, size_t _MaxCount)
\r
1122 while(_MaxCount > 0)
\r
1124 c1 = GetNextCharM(_Str1, NULL, &_Str1);
\r
1125 c2 = GetNextCharM(_Str2, NULL, &_Str2);
\r
1129 if(c1 == 0 || c2 == 0)
\r
1137 unsigned char * _mbslwrM(unsigned char * _String)
\r
1139 unsigned char* r = NULL;
\r
1141 r = _strlwr(_String);
\r
1146 unsigned char * _mbsuprM(unsigned char * _String)
\r
1148 unsigned char* r = NULL;
\r
1150 r = _strupr(_String);
\r
1155 unsigned char * _mbsnincM(const unsigned char * _Str, size_t _Count)
\r
1157 unsigned char* r = NULL;
\r
1159 while(_Count > 0 && GetNextCharM(_Str, NULL, &_Str) > 0)
\r
1163 r = (unsigned char*)_Str;
\r
1168 FILE * fopenM(const char * _Filename, const char * _Mode)
\r
1171 wchar_t* pw0 = NULL;
\r
1172 wchar_t* pw1 = NULL;
\r
1174 pw0 = DuplicateMtoW(_Filename, -1);
\r
1175 pw1 = DuplicateMtoW(_Mode, -1);
\r
1176 r = _wfopen(pw0, pw1);
\r
1178 FreeDuplicatedString(pw0);
\r
1179 FreeDuplicatedString(pw1);
\r