Windows-classic-samples/Samples/IME/cpp/SampleIME/SampleIMEBaseStructure.cpp
2025-11-28 00:35:46 +09:00

325 lines
7.8 KiB
C++

// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft Corporation. All rights reserved
#include "Globals.h"
//---------------------------------------------------------------------
//
// CLSIDToString
//
//---------------------------------------------------------------------
const BYTE GuidSymbols[] = {
3, 2, 1, 0, '-', 5, 4, '-', 7, 6, '-', 8, 9, '-', 10, 11, 12, 13, 14, 15
};
const WCHAR HexDigits[] = L"0123456789ABCDEF";
BOOL CLSIDToString(REFGUID refGUID, _Out_writes_(39) WCHAR *pCLSIDString)
{
WCHAR* pTemp = pCLSIDString;
const BYTE* pBytes = (const BYTE *) &refGUID;
DWORD j = 0;
pTemp[j++] = L'{';
for (int i = 0; i < sizeof(GuidSymbols) && j < (CLSID_STRLEN - 2); i++)
{
if (GuidSymbols[i] == '-')
{
pTemp[j++] = L'-';
}
else
{
pTemp[j++] = HexDigits[ (pBytes[GuidSymbols[i]] & 0xF0) >> 4 ];
pTemp[j++] = HexDigits[ (pBytes[GuidSymbols[i]] & 0x0F) ];
}
}
pTemp[j++] = L'}';
pTemp[j] = L'\0';
return TRUE;
}
//---------------------------------------------------------------------
//
// SkipWhiteSpace
//
// dwBufLen - in character count
//
//---------------------------------------------------------------------
HRESULT SkipWhiteSpace(LCID locale, _In_ LPCWSTR pwszBuffer, DWORD_PTR dwBufLen, _Out_ DWORD_PTR *pdwIndex)
{
DWORD_PTR index = 0;
*pdwIndex = 0;
while (*pwszBuffer && IsSpace(locale, *pwszBuffer) && dwBufLen)
{
dwBufLen--;
pwszBuffer++;
index++;
}
if (*pwszBuffer && dwBufLen)
{
*pdwIndex = index;
return S_OK;
}
return E_FAIL;
}
//---------------------------------------------------------------------
//
// FindChar
//
// dwBufLen - in character count
//
//---------------------------------------------------------------------
HRESULT FindChar(WCHAR wch, _In_ LPCWSTR pwszBuffer, DWORD_PTR dwBufLen, _Out_ DWORD_PTR *pdwIndex)
{
DWORD_PTR index = 0;
*pdwIndex = 0;
while (*pwszBuffer && (*pwszBuffer != wch) && dwBufLen)
{
dwBufLen--;
pwszBuffer++;
index++;
}
if (*pwszBuffer && dwBufLen)
{
*pdwIndex = index;
return S_OK;
}
return E_FAIL;
}
//---------------------------------------------------------------------
//
// IsSpace
//
//---------------------------------------------------------------------
BOOL IsSpace(LCID locale, WCHAR wch)
{
WORD wCharType = 0;
GetStringTypeEx(locale, CT_CTYPE1, &wch, 1, &wCharType);
return (wCharType & C1_SPACE);
}
CStringRange::CStringRange()
{
_stringBufLen = 0;
_pStringBuf = nullptr;
}
CStringRange::~CStringRange()
{
}
const WCHAR *CStringRange::Get() const
{
return _pStringBuf;
}
const DWORD_PTR CStringRange::GetLength() const
{
return _stringBufLen;
}
void CStringRange::Clear()
{
_stringBufLen = 0;
_pStringBuf = nullptr;
}
void CStringRange::Set(const WCHAR *pwch, DWORD_PTR dwLength)
{
_stringBufLen = dwLength;
_pStringBuf = pwch;
}
void CStringRange::Set(CStringRange &sr)
{
*this = sr;
}
CStringRange& CStringRange::operator =(const CStringRange& sr)
{
_stringBufLen = sr._stringBufLen;
_pStringBuf = sr._pStringBuf;
return *this;
}
void CStringRange::CharNext(_Inout_ CStringRange* pCharNext)
{
if (!_stringBufLen)
{
pCharNext->_stringBufLen = 0;
pCharNext->_pStringBuf = nullptr;
}
else
{
pCharNext->_stringBufLen = _stringBufLen;
pCharNext->_pStringBuf = _pStringBuf;
while (pCharNext->_stringBufLen)
{
BOOL isSurrogate = (IS_HIGH_SURROGATE(*pCharNext->_pStringBuf) || IS_LOW_SURROGATE(*pCharNext->_pStringBuf));
pCharNext->_stringBufLen--;
pCharNext->_pStringBuf++;
if (!isSurrogate)
{
break;
}
}
}
}
int CStringRange::Compare(LCID locale, _In_ CStringRange* pString1, _In_ CStringRange* pString2)
{
return CompareString(locale,
NORM_IGNORECASE,
pString1->Get(),
(DWORD)pString1->GetLength(),
pString2->Get(),
(DWORD)pString2->GetLength());
}
BOOL CStringRange::WildcardCompare(LCID locale, _In_ CStringRange* stringWithWildcard, _In_ CStringRange* targetString)
{
if (stringWithWildcard->GetLength() == 0)
{
return targetString->GetLength() == 0 ? TRUE : FALSE;
}
CStringRange stringWithWildcard_next;
CStringRange targetString_next;
stringWithWildcard->CharNext(&stringWithWildcard_next);
targetString->CharNext(&targetString_next);
if (*stringWithWildcard->Get() == L'*')
{
return WildcardCompare(locale, &stringWithWildcard_next, targetString) || ((targetString->GetLength() != 0) && WildcardCompare(locale, stringWithWildcard, &targetString_next));
}
if (*stringWithWildcard->Get() == L'?')
{
return ((targetString->GetLength() != 0) && WildcardCompare(locale, &stringWithWildcard_next, &targetString_next));
}
BOOL isSurrogate1 = (IS_HIGH_SURROGATE(*stringWithWildcard->Get()) || IS_LOW_SURROGATE(*stringWithWildcard->Get()));
BOOL isSurrogate2 = (IS_HIGH_SURROGATE(*targetString->Get()) || IS_LOW_SURROGATE(*targetString->Get()));
return ((CompareString(locale,
NORM_IGNORECASE,
stringWithWildcard->Get(),
(isSurrogate1 ? 2 : 1),
targetString->Get(),
(isSurrogate2 ? 2 : 1)) == CSTR_EQUAL) && WildcardCompare(locale, &stringWithWildcard_next, &targetString_next));
}
CCandidateRange::CCandidateRange(void)
{
}
CCandidateRange::~CCandidateRange(void)
{
}
BOOL CCandidateRange::IsRange(UINT vKey)
{
DWORD value = vKey - L'0';
for (UINT i = 0; i < _CandidateListIndexRange.Count(); i++)
{
if (value == *_CandidateListIndexRange.GetAt(i))
{
return TRUE;
}
else if ((VK_NUMPAD0 <= vKey) && (vKey <= VK_NUMPAD9))
{
if ((vKey-VK_NUMPAD0) == *_CandidateListIndexRange.GetAt(i))
{
return TRUE;
}
}
}
return FALSE;
}
int CCandidateRange::GetIndex(UINT vKey)
{
DWORD value = vKey - L'0';
for (UINT i = 0; i < _CandidateListIndexRange.Count(); i++)
{
if (value == *_CandidateListIndexRange.GetAt(i))
{
return i;
}
else if ((VK_NUMPAD0 <= vKey) && (vKey <= VK_NUMPAD9))
{
if ((vKey-VK_NUMPAD0) == *_CandidateListIndexRange.GetAt(i))
{
return i;
}
}
}
return -1;
}
CPunctuationPair::CPunctuationPair()
{
_punctuation._Code = 0;
_punctuation._Punctuation = 0;
_pairPunctuation = 0;
_isPairToggle = FALSE;
}
CPunctuationPair::CPunctuationPair(WCHAR code, WCHAR punctuation, WCHAR pair)
{
_punctuation._Code = code;
_punctuation._Punctuation = punctuation;
_pairPunctuation = pair;
_isPairToggle = FALSE;
}
CPunctuationNestPair::CPunctuationNestPair()
{
_punctuation_begin._Code = 0;
_punctuation_begin._Punctuation = 0;
_pairPunctuation_begin = 0;
_punctuation_end._Code = 0;
_punctuation_end._Punctuation = 0;
_pairPunctuation_end = 0;
_nestCount = 0;
}
CPunctuationNestPair::CPunctuationNestPair(WCHAR codeBegin, WCHAR punctuationBegin, WCHAR pairBegin,
WCHAR codeEnd, WCHAR punctuationEnd, WCHAR pairEnd)
{
pairEnd;punctuationEnd;
_punctuation_begin._Code = codeBegin;
_punctuation_begin._Punctuation = punctuationBegin;
_pairPunctuation_begin = pairBegin;
_punctuation_end._Code = codeEnd;
_punctuation_end._Punctuation = punctuationBegin;
_pairPunctuation_end = pairBegin;
_nestCount = 0;
}