212 lines
4.2 KiB
C++
212 lines
4.2 KiB
C++
//
|
|
// Util.cpp
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "Util.h"
|
|
#include "CppKeywordTable.h"
|
|
|
|
HRESULT GetAttribute(
|
|
ISAXAttributes *pAttributes,
|
|
const wchar_t *wszAttrName, int cchName,
|
|
const wchar_t **pwszValue, int *pcchValue,
|
|
wchar_t *wszNamespace, int cchNamespace)
|
|
{
|
|
if (!pAttributes || !wszAttrName || !pwszValue || !pcchValue)
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
*pwszValue = NULL;
|
|
*pcchValue = 0;
|
|
if (!wszNamespace)
|
|
{
|
|
return (pAttributes->getValueFromQName(wszAttrName, cchName, pwszValue, pcchValue) == S_OK ? S_OK : E_FAIL);
|
|
}
|
|
return (pAttributes->getValueFromName(wszNamespace, cchNamespace,
|
|
wszAttrName, cchName, pwszValue, pcchValue) == S_OK ? S_OK : E_FAIL);
|
|
}
|
|
|
|
HRESULT GetAttribute(
|
|
ISAXAttributes *pAttributes,
|
|
const wchar_t *wszAttrName, int cchName,
|
|
CStringW &strValue,
|
|
wchar_t *wszNamespace, int cchNamespace)
|
|
{
|
|
const wchar_t *wszValue = NULL;
|
|
int cchValue = 0;
|
|
|
|
if (!pAttributes || !wszAttrName)
|
|
{
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
HRESULT hr;
|
|
if (!wszNamespace)
|
|
{
|
|
hr = (pAttributes->getValueFromQName(wszAttrName, cchName, &wszValue, &cchValue) == S_OK ? S_OK : E_FAIL);
|
|
}
|
|
else
|
|
{
|
|
hr = (pAttributes->getValueFromName(wszNamespace, cchNamespace,
|
|
wszAttrName, cchName, &wszValue, &cchValue) == S_OK ? S_OK : E_FAIL);
|
|
}
|
|
|
|
if (hr == S_OK)
|
|
{
|
|
strValue.SetString(wszValue, cchValue);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
inline int IsUnsafeCppChar(char ch)
|
|
{
|
|
return (!isalnum((unsigned char)ch) && ch != '_');
|
|
}
|
|
|
|
void _CreateSafeCppName(
|
|
char *szSafeName,
|
|
const char *szName,
|
|
const wchar_t *wszName,
|
|
size_t nMaxLen)
|
|
{
|
|
ATLASSERT( szSafeName != NULL );
|
|
ATLASSERT( szName != NULL );
|
|
ATLASSERT( wszName != NULL );
|
|
|
|
static CCppKeywordLookup cppkwLookup;
|
|
const CCppKeywordLookup::HashNode *p = cppkwLookup.Lookup(wszName);
|
|
|
|
char *pszOut = szSafeName;
|
|
|
|
size_t nLen = 0;
|
|
if (p != NULL)
|
|
{
|
|
// append 3 underscores for a reserved keyword -- ugly, but hey...
|
|
memcpy(pszOut, "___", 3);
|
|
pszOut+= 3;
|
|
nLen+= 3;
|
|
}
|
|
|
|
if (isdigit((unsigned char)(*szName)))
|
|
{
|
|
*pszOut++ = '_';
|
|
nLen++;
|
|
}
|
|
|
|
while (*szName)
|
|
{
|
|
if (nLen == nMaxLen)
|
|
{
|
|
// just truncate
|
|
break;
|
|
}
|
|
|
|
if (IsUnsafeCppChar(*szName))
|
|
{
|
|
*pszOut = '_';
|
|
}
|
|
else
|
|
{
|
|
*pszOut = *szName;
|
|
}
|
|
pszOut++;
|
|
szName++;
|
|
nLen++;
|
|
}
|
|
|
|
*pszOut = '\0';
|
|
}
|
|
|
|
size_t AllocateNameString(char **ppszName, const char *szName)
|
|
{
|
|
ATLASSERT( ppszName != NULL );
|
|
ATLASSERT( szName != NULL );
|
|
|
|
size_t nMaxLen = 3*strlen(szName);
|
|
*ppszName = (char *)malloc(nMaxLen+1);
|
|
if (!*ppszName)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
return nMaxLen;
|
|
}
|
|
|
|
size_t AllocateNameString(char **ppszName, const wchar_t *wszName)
|
|
{
|
|
ATLASSERT( ppszName != NULL );
|
|
ATLASSERT( wszName != NULL );
|
|
|
|
size_t nMaxLen = 3*wcslen(wszName);
|
|
*ppszName = (char *)malloc(nMaxLen+1);
|
|
if (!*ppszName)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
return nMaxLen;
|
|
}
|
|
|
|
HRESULT CreateSafeCppName(char **ppszName, const char *szName)
|
|
{
|
|
ATLASSERT( ppszName != NULL );
|
|
ATLASSERT( szName != NULL );
|
|
|
|
size_t nMaxLen = AllocateNameString(ppszName, szName);
|
|
if (!nMaxLen)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
_CreateSafeCppName(*ppszName, szName, CA2W( szName ), nMaxLen);
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CreateSafeCppName(char **ppszName, const wchar_t *wszName)
|
|
{
|
|
ATLASSERT( ppszName != NULL );
|
|
ATLASSERT( wszName != NULL );
|
|
|
|
size_t nMaxLen = AllocateNameString(ppszName, wszName);
|
|
if (!nMaxLen)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
_CreateSafeCppName(*ppszName, CW2A( wszName ), wszName, nMaxLen);
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CreateSafeCppName(CStringA& strSafeName, const wchar_t *wszName)
|
|
{
|
|
ATLASSERT( wszName != NULL );
|
|
|
|
size_t nMaxLen = 3*wcslen(wszName);
|
|
|
|
char *szSafeName = strSafeName.GetBuffer((int) nMaxLen);
|
|
|
|
_CreateSafeCppName(szSafeName, CW2A( wszName ), wszName, nMaxLen);
|
|
|
|
strSafeName.ReleaseBuffer();
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CreateSafeCppName(CStringA& strSafeName, const char *szName)
|
|
{
|
|
ATLASSERT( szName != NULL );
|
|
|
|
size_t nMaxLen = 3*strlen(szName);
|
|
|
|
char *szSafeName = strSafeName.GetBuffer((int) nMaxLen);
|
|
|
|
_CreateSafeCppName(szSafeName, szName, CA2W( szName ), nMaxLen);
|
|
|
|
strSafeName.ReleaseBuffer();
|
|
|
|
return S_OK;
|
|
} |