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* ppNext)
\r
398 if((*lpString & 0xfe) == 0xfc)
\r
401 Code |= (DWORD)*lpString & 0x01;
\r
403 else if((*lpString & 0xfc) == 0xf8)
\r
406 Code |= (DWORD)*lpString & 0x03;
\r
408 else if((*lpString & 0xf8) == 0xf0)
\r
411 Code |= (DWORD)*lpString & 0x07;
\r
413 else if((*lpString & 0xf0) == 0xe0)
\r
416 Code |= (DWORD)*lpString & 0x0f;
\r
418 else if((*lpString & 0xe0) == 0xc0)
\r
421 Code |= (DWORD)*lpString & 0x1f;
\r
423 else if((*lpString & 0x80) == 0x00)
\r
426 Code |= (DWORD)*lpString & 0x7f;
\r
431 while((*lpString & 0xc0) == 0x80)
\r
435 Code |= (DWORD)*lpString & 0x3f;
\r
441 *ppNext = lpString;
\r
445 // マルチバイト文字列の冗長表現を修正
\r
447 // 修正後の文字列の長さは元の文字列の長さ以下のためpDstとpSrcに同じ値を指定可能
\r
448 BOOL FixStringM(LPSTR pDst, LPCSTR pSrc)
\r
457 while(*pSrc != '\0')
\r
459 Code = GetNextCharM(pSrc, &pSrc);
\r
460 if(Code & 0x80000000)
\r
462 else if(Code & 0x7c000000)
\r
465 c = (char)(0xfc | (Code >> (6 * i)));
\r
467 else if(Code & 0x03e00000)
\r
470 c = (char)(0xf8 | (Code >> (6 * i)));
\r
472 else if(Code & 0x001f0000)
\r
475 c = (char)(0xf0 | (Code >> (6 * i)));
\r
477 else if(Code & 0x0000f800)
\r
480 c = (char)(0xe0 | (Code >> (6 * i)));
\r
482 else if(Code & 0x00000780)
\r
485 c = (char)(0xc0 | (Code >> (6 * i)));
\r
500 c = (char)(0x80 | ((Code >> (6 * i)) & 0x3f));
\r
514 // NULL区切りマルチバイト文字列の冗長表現を修正
\r
516 // 修正後の文字列の長さは元の文字列の長さ以下のためpDstとpSrcに同じ値を指定可能
\r
517 BOOL FixMultiStringM(LPSTR pDst, LPCSTR pSrc)
\r
522 while(*pSrc != '\0')
\r
524 Length = strlen(pSrc) + 1;
\r
525 bResult = bResult | FixStringM(pDst, pSrc);
\r
527 pDst += strlen(pDst) + 1;
\r
533 // マルチバイト文字列の冗長表現を確認
\r
535 BOOL CheckStringM(LPCSTR lpString)
\r
540 p = AllocateStringM(strlen(lpString) + 1);
\r
543 bResult = FixStringM(p, lpString);
\r
544 FreeDuplicatedString(p);
\r
549 // NULL区切りマルチバイト文字列の冗長表現を確認
\r
551 BOOL CheckMultiStringM(LPCSTR lpString)
\r
556 p = AllocateStringM(GetMultiStringLengthM(lpString) + 1);
\r
559 bResult = FixMultiStringM(p, lpString);
\r
560 FreeDuplicatedString(p);
\r
567 void FreeDuplicatedString(void* p)
\r
569 if(p < (void*)0x00010000 || p == (void*)~0)
\r
577 // マルチバイト文字バッファ pm%d
\r
580 #pragma warning(disable:4102)
\r
581 #define START_ROUTINE do{
\r
582 #define END_ROUTINE }while(0);end_of_routine:
\r
583 #define QUIT_ROUTINE goto end_of_routine;
\r
585 HANDLE CreateFileM(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
\r
587 HANDLE r = INVALID_HANDLE_VALUE;
\r
588 wchar_t* pw0 = NULL;
\r
590 pw0 = DuplicateMtoW(lpFileName, -1);
\r
591 r = CreateFileW(pw0, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
\r
593 FreeDuplicatedString(pw0);
\r
597 HANDLE FindFirstFileM(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData)
\r
599 HANDLE r = INVALID_HANDLE_VALUE;
\r
600 wchar_t* pw0 = NULL;
\r
601 WIN32_FIND_DATAW a0;
\r
603 pw0 = DuplicateMtoW(lpFileName, -1);
\r
604 r = FindFirstFileW(pw0, &a0);
\r
605 if(r != INVALID_HANDLE_VALUE)
\r
607 lpFindFileData->dwFileAttributes = a0.dwFileAttributes;
\r
608 lpFindFileData->ftCreationTime = a0.ftCreationTime;
\r
609 lpFindFileData->ftLastAccessTime = a0.ftLastAccessTime;
\r
610 lpFindFileData->ftLastWriteTime = a0.ftLastWriteTime;
\r
611 lpFindFileData->nFileSizeHigh = a0.nFileSizeHigh;
\r
612 lpFindFileData->nFileSizeLow = a0.nFileSizeLow;
\r
613 lpFindFileData->dwReserved0 = a0.dwReserved0;
\r
614 lpFindFileData->dwReserved1 = a0.dwReserved1;
\r
615 WtoM(lpFindFileData->cFileName, sizeof(lpFindFileData->cFileName), a0.cFileName, -1);
\r
616 WtoM(lpFindFileData->cAlternateFileName, sizeof(lpFindFileData->cAlternateFileName), a0.cAlternateFileName, -1);
\r
619 FreeDuplicatedString(pw0);
\r
623 BOOL FindNextFileM(HANDLE hFindFile, LPWIN32_FIND_DATAA lpFindFileData)
\r
626 WIN32_FIND_DATAW a0;
\r
628 r = FindNextFileW(hFindFile, &a0);
\r
631 lpFindFileData->dwFileAttributes = a0.dwFileAttributes;
\r
632 lpFindFileData->ftCreationTime = a0.ftCreationTime;
\r
633 lpFindFileData->ftLastAccessTime = a0.ftLastAccessTime;
\r
634 lpFindFileData->ftLastWriteTime = a0.ftLastWriteTime;
\r
635 lpFindFileData->nFileSizeHigh = a0.nFileSizeHigh;
\r
636 lpFindFileData->nFileSizeLow = a0.nFileSizeLow;
\r
637 lpFindFileData->dwReserved0 = a0.dwReserved0;
\r
638 lpFindFileData->dwReserved1 = a0.dwReserved1;
\r
639 WtoM(lpFindFileData->cFileName, sizeof(lpFindFileData->cFileName), a0.cFileName, -1);
\r
640 WtoM(lpFindFileData->cAlternateFileName, sizeof(lpFindFileData->cAlternateFileName), a0.cAlternateFileName, -1);
\r
646 DWORD GetCurrentDirectoryM(DWORD nBufferLength, LPSTR lpBuffer)
\r
649 wchar_t* pw0 = NULL;
\r
651 // TODO: バッファが不十分な場合に必要なサイズを返す
\r
652 pw0 = AllocateStringW(nBufferLength * 4);
\r
653 GetCurrentDirectoryW(nBufferLength * 4, pw0);
\r
654 WtoM(lpBuffer, nBufferLength, pw0, -1);
\r
655 r = TerminateStringM(lpBuffer, nBufferLength);
\r
657 FreeDuplicatedString(pw0);
\r
661 BOOL SetCurrentDirectoryM(LPCSTR lpPathName)
\r
664 wchar_t* pw0 = NULL;
\r
666 pw0 = DuplicateMtoW(lpPathName, -1);
\r
667 r = SetCurrentDirectoryW(pw0);
\r
669 FreeDuplicatedString(pw0);
\r
673 DWORD GetTempPathM(DWORD nBufferLength, LPSTR lpBuffer)
\r
676 wchar_t* pw0 = NULL;
\r
678 pw0 = AllocateStringW(nBufferLength * 4);
\r
679 GetTempPathW(nBufferLength * 4, pw0);
\r
680 WtoM(lpBuffer, nBufferLength, pw0, -1);
\r
681 r = TerminateStringM(lpBuffer, nBufferLength);
\r
683 FreeDuplicatedString(pw0);
\r
687 DWORD GetFileAttributesM(LPCSTR lpFileName)
\r
690 wchar_t* pw0 = NULL;
\r
692 pw0 = DuplicateMtoW(lpFileName, -1);
\r
693 r = GetFileAttributesW(pw0);
\r
695 FreeDuplicatedString(pw0);
\r
699 DWORD GetModuleFileNameM(HMODULE hModule, LPCH lpFilename, DWORD nSize)
\r
702 wchar_t* pw0 = NULL;
\r
704 pw0 = AllocateStringW(nSize * 4);
\r
705 GetModuleFileNameW(hModule, pw0, nSize * 4);
\r
706 WtoM(lpFilename, nSize, pw0, -1);
\r
707 r = TerminateStringM(lpFilename, nSize);
\r
709 FreeDuplicatedString(pw0);
\r
713 BOOL CopyFileM(LPCSTR lpExistingFileName, LPCSTR lpNewFileName, BOOL bFailIfExists)
\r
716 wchar_t* pw0 = NULL;
\r
717 wchar_t* pw1 = NULL;
\r
719 pw0 = DuplicateMtoW(lpExistingFileName, -1);
\r
720 pw1 = DuplicateMtoW(lpNewFileName, -1);
\r
721 r = CopyFileW(pw0, pw1, bFailIfExists);
\r
723 FreeDuplicatedString(pw0);
\r
724 FreeDuplicatedString(pw1);
\r
728 BOOL MoveFileM(LPCSTR lpExistingFileName, LPCSTR lpNewFileName)
\r
731 wchar_t* pw0 = NULL;
\r
732 wchar_t* pw1 = NULL;
\r
734 pw0 = DuplicateMtoW(lpExistingFileName, -1);
\r
735 pw1 = DuplicateMtoW(lpNewFileName, -1);
\r
736 r = MoveFileW(pw0, pw1);
\r
738 FreeDuplicatedString(pw0);
\r
739 FreeDuplicatedString(pw1);
\r
743 int mkdirM(const char * _Path)
\r
746 wchar_t* pw0 = NULL;
\r
748 pw0 = DuplicateMtoW(_Path, -1);
\r
751 FreeDuplicatedString(pw0);
\r
755 int _mkdirM(const char * _Path)
\r
758 wchar_t* pw0 = NULL;
\r
760 pw0 = DuplicateMtoW(_Path, -1);
\r
763 FreeDuplicatedString(pw0);
\r
767 int rmdirM(const char * _Path)
\r
770 wchar_t* pw0 = NULL;
\r
772 pw0 = DuplicateMtoW(_Path, -1);
\r
775 FreeDuplicatedString(pw0);
\r
779 int _rmdirM(const char * _Path)
\r
782 wchar_t* pw0 = NULL;
\r
784 pw0 = DuplicateMtoW(_Path, -1);
\r
787 FreeDuplicatedString(pw0);
\r
791 int removeM(const char * _Filename)
\r
794 wchar_t* pw0 = NULL;
\r
796 pw0 = DuplicateMtoW(_Filename, -1);
\r
799 FreeDuplicatedString(pw0);
\r
803 int _removeM(const char * _Filename)
\r
806 wchar_t* pw0 = NULL;
\r
808 pw0 = DuplicateMtoW(_Filename, -1);
\r
811 FreeDuplicatedString(pw0);
\r
815 int _unlinkM(const char * _Filename)
\r
818 wchar_t* pw0 = NULL;
\r
820 pw0 = DuplicateMtoW(_Filename, -1);
\r
823 FreeDuplicatedString(pw0);
\r
827 size_t _mbslenM(const unsigned char * _Str)
\r
831 while(GetNextCharM(_Str, &_Str) > 0)
\r
839 unsigned char * _mbschrM(const unsigned char * _Str, unsigned int _Ch)
\r
841 unsigned char* r = NULL;
\r
845 while((c = GetNextCharM(_Str, &p)) > 0)
\r
852 r = (unsigned char*)_Str;
\r
857 unsigned char * _mbsrchrM(const unsigned char * _Str, unsigned int _Ch)
\r
859 unsigned char* r = NULL;
\r
863 while((c = GetNextCharM(_Str, &p)) > 0)
\r
866 r = (unsigned char*)_Str;
\r
870 r = (unsigned char*)_Str;
\r
875 unsigned char * _mbsstrM(const unsigned char * _Str, const unsigned char * _Substr)
\r
877 unsigned char* r = NULL;
\r
879 r = strstr(_Str, _Substr);
\r
884 int _mbscmpM(const unsigned char * _Str1, const unsigned char * _Str2)
\r
888 r = strcmp(_Str1, _Str2);
\r
893 int _mbsicmpM(const unsigned char * _Str1, const unsigned char * _Str2)
\r
897 r = _stricmp(_Str1, _Str2);
\r
902 int _mbsncmpM(const unsigned char * _Str1, const unsigned char * _Str2, size_t _MaxCount)
\r
910 while(_MaxCount > 0)
\r
912 c1 = GetNextCharM(_Str1, &_Str1);
\r
913 c2 = GetNextCharM(_Str2, &_Str2);
\r
917 if(c1 == 0 || c2 == 0)
\r
925 unsigned char * _mbslwrM(unsigned char * _String)
\r
927 unsigned char* r = NULL;
\r
929 r = _strlwr(_String);
\r
934 unsigned char * _mbsuprM(unsigned char * _String)
\r
936 unsigned char* r = NULL;
\r
938 r = _strupr(_String);
\r
943 unsigned char * _mbsnincM(const unsigned char * _Str, size_t _Count)
\r
945 unsigned char* r = NULL;
\r
947 while(_Count > 0 && GetNextCharM(_Str, &_Str) > 0)
\r
951 r = (unsigned char*)_Str;
\r
956 FILE * fopenM(const char * _Filename, const char * _Mode)
\r
959 wchar_t* pw0 = NULL;
\r
960 wchar_t* pw1 = NULL;
\r
962 pw0 = DuplicateMtoW(_Filename, -1);
\r
963 pw1 = DuplicateMtoW(_Mode, -1);
\r
964 r = _wfopen(pw0, pw1);
\r
966 FreeDuplicatedString(pw0);
\r
967 FreeDuplicatedString(pw1);
\r