#define UNICODE\r
#define _UNICODE\r
\r
+#include <stdio.h>\r
#include <tchar.h>\r
#include <direct.h>\r
#include <windows.h>\r
return p;\r
}\r
\r
+// マルチバイト文字列からコードポイントと次のポインタを取得\r
+// エンコードが不正な場合は0x80000000を返す\r
+DWORD GetNextCharM(LPCSTR lpString, LPCSTR* ppNext)\r
+{\r
+ DWORD Code;\r
+ int i;\r
+ Code = 0;\r
+ if((*lpString & 0xfe) == 0xfc)\r
+ {\r
+ i = 5;\r
+ Code |= (DWORD)*lpString & 0x01;\r
+ }\r
+ else if((*lpString & 0xfc) == 0xf8)\r
+ {\r
+ i = 4;\r
+ Code |= (DWORD)*lpString & 0x03;\r
+ }\r
+ else if((*lpString & 0xf8) == 0xf0)\r
+ {\r
+ i = 3;\r
+ Code |= (DWORD)*lpString & 0x07;\r
+ }\r
+ else if((*lpString & 0xf0) == 0xe0)\r
+ {\r
+ i = 2;\r
+ Code |= (DWORD)*lpString & 0x0f;\r
+ }\r
+ else if((*lpString & 0xe0) == 0xc0)\r
+ {\r
+ i = 1;\r
+ Code |= (DWORD)*lpString & 0x1f;\r
+ }\r
+ else if((*lpString & 0x80) == 0x00)\r
+ {\r
+ i = 0;\r
+ Code |= (DWORD)*lpString & 0x7f;\r
+ }\r
+ else\r
+ i = -1;\r
+ lpString++;\r
+ while((*lpString & 0xc0) == 0x80)\r
+ {\r
+ i--;\r
+ Code = Code << 6;\r
+ Code |= (DWORD)*lpString & 0x3f;\r
+ lpString++;\r
+ }\r
+ if(i != 0)\r
+ Code = 0x80000000;\r
+ if(ppNext)\r
+ *ppNext = lpString;\r
+ return Code;\r
+}\r
+\r
// マルチバイト文字列の冗長表現を修正\r
// 修正があればTRUEを返す\r
// 修正後の文字列の長さは元の文字列の長さ以下のためpDstとpSrcに同じ値を指定可能\r
p = (char*)pSrc;\r
while(*pSrc != '\0')\r
{\r
- Code = 0;\r
- if((*pSrc & 0xfe) == 0xfc)\r
- {\r
- i = 5;\r
- Code |= (DWORD)*pSrc & 0x01;\r
- }\r
- else if((*pSrc & 0xfc) == 0xf8)\r
- {\r
- i = 4;\r
- Code |= (DWORD)*pSrc & 0x03;\r
- }\r
- else if((*pSrc & 0xf8) == 0xf0)\r
- {\r
- i = 3;\r
- Code |= (DWORD)*pSrc & 0x07;\r
- }\r
- else if((*pSrc & 0xf0) == 0xe0)\r
- {\r
- i = 2;\r
- Code |= (DWORD)*pSrc & 0x0f;\r
- }\r
- else if((*pSrc & 0xe0) == 0xc0)\r
- {\r
- i = 1;\r
- Code |= (DWORD)*pSrc & 0x1f;\r
- }\r
- else if((*pSrc & 0x80) == 0x00)\r
- {\r
- i = 0;\r
- Code |= (DWORD)*pSrc & 0x7f;\r
- }\r
- else\r
- i = -1;\r
- pSrc++;\r
- while((*pSrc & 0xc0) == 0x80)\r
- {\r
- i--;\r
- Code = Code << 6;\r
- Code |= (DWORD)*pSrc & 0x3f;\r
- pSrc++;\r
- }\r
- if(i != 0)\r
+ Code = GetNextCharM(pSrc, &pSrc);\r
+ if(Code & 0x80000000)\r
continue;\r
else if(Code & 0x7c000000)\r
{\r
return r;\r
}\r
\r
+BOOL ShellExecuteExM(LPSHELLEXECUTEINFOA lpExecInfo)\r
+{\r
+ BOOL r = FALSE;\r
+ wchar_t* pw0 = NULL;\r
+ wchar_t* pw1 = NULL;\r
+ wchar_t* pw2 = NULL;\r
+ wchar_t* pw3 = NULL;\r
+ wchar_t* pw4 = NULL;\r
+ SHELLEXECUTEINFOW wExecInfo;\r
+START_ROUTINE\r
+ wExecInfo.cbSize = sizeof(SHELLEXECUTEINFOW);\r
+ wExecInfo.fMask = lpExecInfo->fMask;\r
+ wExecInfo.hwnd = lpExecInfo->hwnd;\r
+ pw0 = DuplicateMtoW(lpExecInfo->lpVerb, -1);\r
+ wExecInfo.lpVerb = pw0;\r
+ pw1 = DuplicateMtoW(lpExecInfo->lpFile, -1);\r
+ wExecInfo.lpFile = pw1;\r
+ pw2 = DuplicateMtoW(lpExecInfo->lpParameters, -1);\r
+ wExecInfo.lpParameters = pw2;\r
+ pw3 = DuplicateMtoW(lpExecInfo->lpDirectory, -1);\r
+ wExecInfo.lpDirectory = pw3;\r
+ wExecInfo.nShow = lpExecInfo->nShow;\r
+ wExecInfo.hInstApp = lpExecInfo->hInstApp;\r
+ wExecInfo.lpIDList = lpExecInfo->lpIDList;\r
+ if(lpExecInfo->fMask & SEE_MASK_CLASSNAME)\r
+ {\r
+ pw4 = DuplicateMtoW(lpExecInfo->lpClass, -1);\r
+ wExecInfo.lpClass = pw4;\r
+ }\r
+ wExecInfo.hkeyClass = lpExecInfo->hkeyClass;\r
+ wExecInfo.dwHotKey = lpExecInfo->dwHotKey;\r
+ wExecInfo.hIcon = lpExecInfo->hIcon;\r
+ wExecInfo.hProcess = lpExecInfo->hProcess;\r
+ r = ShellExecuteExW(&wExecInfo);\r
+ lpExecInfo->hInstApp = wExecInfo.hInstApp;\r
+ lpExecInfo->hProcess = wExecInfo.hProcess;\r
+END_ROUTINE\r
+ FreeDuplicatedString(pw0);\r
+ FreeDuplicatedString(pw1);\r
+ FreeDuplicatedString(pw2);\r
+ FreeDuplicatedString(pw3);\r
+ FreeDuplicatedString(pw4);\r
+ return r;\r
+}\r
+\r
PIDLIST_ABSOLUTE SHBrowseForFolderM(LPBROWSEINFOA lpbi)\r
{\r
PIDLIST_ABSOLUTE r = NULL;\r
size_t _mbslenM(const unsigned char * _Str)\r
{\r
size_t r = 0;\r
- wchar_t* pw0 = NULL;\r
START_ROUTINE\r
- pw0 = DuplicateMtoW(_Str, -1);\r
- r = wcslen(pw0);\r
+ while(GetNextCharM(_Str, &_Str) > 0)\r
+ {\r
+ r++;\r
+ }\r
END_ROUTINE\r
- FreeDuplicatedString(pw0);\r
return r;\r
}\r
\r
unsigned char * _mbschrM(const unsigned char * _Str, unsigned int _Ch)\r
{\r
unsigned char* r = NULL;\r
- wchar_t* pw0 = NULL;\r
- wchar_t* wr;\r
+ unsigned int c;\r
+ unsigned char* p;\r
START_ROUTINE\r
- pw0 = DuplicateMtoW(_Str, -1);\r
- // TODO: 非ASCII文字の対応\r
- wr = wcschr(pw0, _Ch);\r
- if(wr)\r
+ while((c = GetNextCharM(_Str, &p)) > 0)\r
{\r
- *wr = L'\0';\r
- r = (unsigned char*)_Str + WtoM(NULL, 0, pw0, -1) - 1;\r
+ if(c == _Ch)\r
+ break;\r
+ _Str = p;\r
}\r
+ if(c == _Ch)\r
+ r = (unsigned char*)_Str;\r
END_ROUTINE\r
- FreeDuplicatedString(pw0);\r
return r;\r
}\r
\r
unsigned char * _mbsrchrM(const unsigned char * _Str, unsigned int _Ch)\r
{\r
unsigned char* r = NULL;\r
- wchar_t* pw0 = NULL;\r
- wchar_t* wr;\r
+ unsigned int c;\r
+ unsigned char* p;\r
START_ROUTINE\r
- pw0 = DuplicateMtoW(_Str, -1);\r
- // TODO: 非ASCII文字の対応\r
- wr = wcsrchr(pw0, _Ch);\r
- if(wr)\r
+ while((c = GetNextCharM(_Str, &p)) > 0)\r
{\r
- *wr = L'\0';\r
- r = (unsigned char*)_Str + WtoM(NULL, 0, pw0, -1) - 1;\r
+ if(c == _Ch)\r
+ r = (unsigned char*)_Str;\r
+ _Str = p;\r
}\r
+ if(c == _Ch)\r
+ r = (unsigned char*)_Str;\r
END_ROUTINE\r
- FreeDuplicatedString(pw0);\r
return r;\r
}\r
\r
unsigned char * _mbsstrM(const unsigned char * _Str, const unsigned char * _Substr)\r
{\r
unsigned char* r = NULL;\r
- wchar_t* pw0 = NULL;\r
- wchar_t* pw1 = NULL;\r
- wchar_t* wr;\r
START_ROUTINE\r
- pw0 = DuplicateMtoW(_Str, -1);\r
- pw1 = DuplicateMtoW(_Substr, -1);\r
- wr = wcsstr(pw0, pw1);\r
- if(wr)\r
- {\r
- *wr = L'\0';\r
- r = (unsigned char*)_Str + WtoM(NULL, 0, pw0, -1) - 1;\r
- }\r
+ r = strstr(_Str, _Substr);\r
END_ROUTINE\r
- FreeDuplicatedString(pw0);\r
- FreeDuplicatedString(pw1);\r
return r;\r
}\r
\r
int _mbscmpM(const unsigned char * _Str1, const unsigned char * _Str2)\r
{\r
int r = 0;\r
- wchar_t* pw0 = NULL;\r
- wchar_t* pw1 = NULL;\r
START_ROUTINE\r
- pw0 = DuplicateMtoW(_Str1, -1);\r
- pw1 = DuplicateMtoW(_Str2, -1);\r
- r = wcscmp(pw0, pw1);\r
+ r = strcmp(_Str1, _Str2);\r
END_ROUTINE\r
- FreeDuplicatedString(pw0);\r
- FreeDuplicatedString(pw1);\r
return r;\r
}\r
\r
int _mbsicmpM(const unsigned char * _Str1, const unsigned char * _Str2)\r
{\r
int r = 0;\r
- wchar_t* pw0 = NULL;\r
- wchar_t* pw1 = NULL;\r
START_ROUTINE\r
- pw0 = DuplicateMtoW(_Str1, -1);\r
- pw1 = DuplicateMtoW(_Str2, -1);\r
- r = _wcsicmp(pw0, pw1);\r
+ r = _stricmp(_Str1, _Str2);\r
END_ROUTINE\r
- FreeDuplicatedString(pw0);\r
- FreeDuplicatedString(pw1);\r
return r;\r
}\r
\r
int _mbsncmpM(const unsigned char * _Str1, const unsigned char * _Str2, size_t _MaxCount)\r
{\r
int r = 0;\r
- wchar_t* pw0 = NULL;\r
- wchar_t* pw1 = NULL;\r
+ DWORD c1;\r
+ DWORD c2;\r
START_ROUTINE\r
- pw0 = DuplicateMtoW(_Str1, -1);\r
- pw1 = DuplicateMtoW(_Str2, -1);\r
- r = wcsncmp(pw0, pw1, _MaxCount);\r
+ c1 = 0;\r
+ c2 = 0;\r
+ while(_MaxCount > 0)\r
+ {\r
+ c1 = GetNextCharM(_Str1, &_Str1);\r
+ c2 = GetNextCharM(_Str2, &_Str2);\r
+ if(c1 != c2)\r
+ break;\r
+ _MaxCount--;\r
+ if(c1 == 0 || c2 == 0)\r
+ break;\r
+ }\r
+ r = c1 - c2;\r
END_ROUTINE\r
- FreeDuplicatedString(pw0);\r
- FreeDuplicatedString(pw1);\r
return r;\r
}\r
\r
unsigned char * _mbslwrM(unsigned char * _String)\r
{\r
unsigned char* r = NULL;\r
- wchar_t* pw0 = NULL;\r
START_ROUTINE\r
- pw0 = DuplicateMtoW(_String, -1);\r
- _wcslwr(pw0);\r
- r = _String;\r
- WtoM(_String, strlen(_String) + 1, pw0, -1);\r
+ r = _strlwr(_String);\r
END_ROUTINE\r
- FreeDuplicatedString(pw0);\r
return r;\r
}\r
\r
unsigned char * _mbsuprM(unsigned char * _String)\r
{\r
unsigned char* r = NULL;\r
- wchar_t* pw0 = NULL;\r
START_ROUTINE\r
- pw0 = DuplicateMtoW(_String, -1);\r
- _wcsupr(pw0);\r
- r = _String;\r
- WtoM(_String, strlen(_String) + 1, pw0, -1);\r
+ r = _strupr(_String);\r
END_ROUTINE\r
- FreeDuplicatedString(pw0);\r
return r;\r
}\r
\r
unsigned char * _mbsnincM(const unsigned char * _Str, size_t _Count)\r
{\r
unsigned char* r = NULL;\r
- wchar_t* pw0 = NULL;\r
- wchar_t* wr;\r
START_ROUTINE\r
- pw0 = DuplicateMtoW(_Str, -1);\r
- wr = _wcsninc(pw0, _Count);\r
- if(wr)\r
+ while(_Count > 0 && GetNextCharM(_Str, &_Str) > 0)\r
{\r
- *wr = L'\0';\r
- r = (unsigned char*)_Str + WtoM(NULL, 0, pw0, -1) - 1;\r
+ _Count--;\r
}\r
+ r = (unsigned char*)_Str;\r
END_ROUTINE\r
- FreeDuplicatedString(pw0);\r
return r;\r
}\r
\r