📄 cxml.c
字号:
DETECT( nNameSize > strlen( pNode->szName ) );
strcpy( pszName, pNode->szName );
if ( pNode->pszData == NULL ) {
DETECT( nDataSize > 1 );
strcpy( pszData, "" );
}
else {
DETECT( nDataSize > ( UINT )strlen( pNode->pszData ) );
strcpy( pszData, pNode->pszData );
}
return NORMAL;
}
/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_GetNextInfo( IN PCXMLSTRUCT pXml, IN OUT PPOS pPos, OUT LPSTR pszName, IN UINT nNameSize, OUT LPSTR pszData, IN UINT nDataSize )
{
/*取指定节点的下一节点的信息*/
DETECT_NULL( pXml );
DETECT( TREE_NodeIsValid( ( PCTREESTRUCT )&( pXml->nTree ), *pPos ) );
ASSERT_NORMAL( TREE_GetNext( ( PCTREESTRUCT )&( pXml->nTree ), pPos ) );
DETECT_NULL( *pPos );
return XML_GetInfoByPos( pXml, *pPos, pszName, nNameSize, pszData, nDataSize );
}
/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_SetPropertyByPos( IN OUT PXMLSTRUCT pXml, IN POS nPos, IN PCNODEPROPERTY pProp )
{
/*置指定位置的节点的属性*/
PXMLNODE pNode;
UINT nOrgProperLen, nProperLen, iLoop;
DETECT_NULL( pXml );
DETECT( TREE_NodeIsValid( ( PCTREESTRUCT )&( pXml->nTree ), nPos ) );
/*取节点信息*/
ASSERT_NORMAL( TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), nPos, ( LPVOID * )&pNode ) );
/*计算属性的长度*/
nOrgProperLen = 0;
for( iLoop = 0; iLoop < pNode->nProperty.nCount; iLoop ++ ) {
nOrgProperLen += ( UINT )( strlen( pNode->nProperty.pVal[iLoop].szName ) + 2 \
+ strlen( pNode->nProperty.pVal[iLoop].szData ) \
+ Calu_Var_Chgs( pNode->nProperty.pVal[iLoop].szData ) * 4 + 2 );
}
nProperLen = 0;
if ( pProp != NULL ) {
for( iLoop = 0; iLoop < pProp->nCount; iLoop ++ ) {
nProperLen += ( UINT )( strlen( pProp->pVal[iLoop].szName ) + 2 \
+ strlen( pProp->pVal[iLoop].szData ) \
+ Calu_Var_Chgs( pProp->pVal[iLoop].szData ) * 4 + 2 );
}
}
/*更新属性信息*/
XML_FreeProperty( &( pNode->nProperty ) );
/*修改长度信息*/
pXml->nLen -= nOrgProperLen;
if ( ( pProp != NULL ) && ( pProp->nCount ) ) {
/*分配属性内存*/
ASSERT_NORMAL( XML_AllocProperty( & pNode->nProperty, pProp->nCount ) );
memcpy( pNode->nProperty.pVal, pProp->pVal, pProp->nCount * sizeof( PROPER ) );
pXml->nLen += nProperLen;
}
return NORMAL;
}
/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_GetPropertyByPos( IN PCXMLSTRUCT pXml, IN POS nPos, OUT PNODEPROPERTY pProp )
{
/*取指定位置的节点的属性*/
PXMLNODE pNode;
DETECT_NULL( pXml );
DETECT( TREE_NodeIsValid( ( PCTREESTRUCT )&( pXml->nTree ), nPos ) );
DETECT_NULL( pProp );
/*取节点信息*/
ASSERT_NORMAL( TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), nPos, ( LPVOID * )&pNode ) );
/*取属性的值*/
XML_FreeProperty( pProp );
/*分配节点属性的内存*/
ASSERT_NORMAL( XML_AllocProperty( pProp, pNode->nProperty.nCount ) );
memcpy( pProp->pVal, pNode->nProperty.pVal, pNode->nProperty.nCount * sizeof( PROPER ) );
return NORMAL;
}
/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_SetVal( IN OUT PXMLSTRUCT pXml, IN LPCSTR pszPath, IN LPCSTR pszData )
{
/*按指定的名字设置节点值*/
PXMLNODE pNode;
POS nPos;
DETECT_NULL( pXml );
DETECT_NULL( pXml->nTree.nRootPos );
DETECT( pszData == NULL || ( strlen( pszData ) + Calu_Var_Chgs( pszData ) * 4 ) <= XML_DATA_LEN );
DETECT_NULL( pszPath );
DETECT( strlen( pszPath ) <= XML_PATH_LEN );
nPos = pXml->nTree.nRootPos;
/*诊断定位*/
ASSERT_NORMAL( XML_Locate( pXml, &nPos, pszPath, 0 ) );
DETECT_NULL( nPos );
ASSERT_NORMAL( TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), nPos, ( LPVOID * )&pNode ) );
ASSERT_NORMAL( XML_SetInfoByPos( pXml, nPos, ( LPCSTR )( pNode->szName ), pszData ) );
return NORMAL;
}
/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_GetVal( IN PCXMLSTRUCT pXml, IN LPCSTR pszPath, OUT LPSTR pszData, IN UINT nDataSize, OUT PPOS pPos )
{
/*取指定的节点的名字,并可选择返回节点的位置*/
PXMLNODE pNode;
POS nPos;
DETECT_NULL( pXml );
DETECT_NULL( pXml->nTree.nRootPos );
DETECT_NULL( pszPath );
DETECT( strlen( pszPath ) <= XML_PATH_LEN );
DETECT_NULL( pszData );
nPos = pXml->nTree.nRootPos;
ASSERT_NORMAL( XML_Locate( ( PXMLSTRUCT )pXml, &nPos, pszPath, 0 ) );
if ( nPos != NULL ) {
ASSERT_NORMAL( TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), nPos, ( LPVOID * )&pNode ) );
if ( pPos != NULL ) *pPos = nPos;
if ( pNode->pszData != NULL ) {
DETECT( nDataSize > ( UINT )strlen( pNode->pszData ) );
strcpy( pszData, ( LPCSTR )( pNode->pszData ) );
return NORMAL;
}
}
DETECT( nDataSize >= 1 );
strcpy( pszData, "" );
return ( ( nPos != NULL ) ? NORMAL : INVALID );
}
/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_SetProperty( IN OUT PXMLSTRUCT pXml, IN LPCSTR pszPath, IN PCNODEPROPERTY pProp )
{
/*置指定节点名的节点的属性*/
POS nPos;
DETECT_NULL( pXml );
DETECT_NULL( pXml->nTree.nRootPos );
DETECT_NULL( pszPath );
DETECT( strlen( pszPath ) <= XML_PATH_LEN );
nPos = pXml->nTree.nRootPos;
ASSERT_NORMAL( XML_Locate( pXml, &nPos, pszPath, 0 ) );
DETECT_NULL( nPos );
ASSERT_NORMAL( XML_SetPropertyByPos( pXml, nPos, pProp ) );
return NORMAL;
}
/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_GetProperty( IN PCXMLSTRUCT pXml, IN LPCSTR pszPath, OUT PNODEPROPERTY pProp, OUT PPOS pPos )
{
/*取指定节点名的节点的属性,并返回节点的位置*/
POS nPos;
DETECT_NULL( pXml );
DETECT_NULL( pXml->nTree.nRootPos );
DETECT_NULL( pszPath );
DETECT( strlen( pszPath ) <= XML_PATH_LEN );
nPos = pXml->nTree.nRootPos;
ASSERT_NORMAL( XML_Locate( ( PXMLSTRUCT )pXml, &nPos, pszPath, 0 ) );
DETECT_NULL( nPos );
if ( pPos != NULL ) *pPos = nPos;
ASSERT_NORMAL( XML_GetPropertyByPos( pXml, nPos, pProp ) );
return NORMAL;
}
/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_GetNextVal( IN PCXMLSTRUCT pXml, IN OUT PPOS pPos, OUT LPSTR pszData, IN UINT nDataSize )
{
/*与XML_GetVal、XML_GetProperty函数配合使用,取下一个同名节点的值*/
PXMLNODE pNode;
DETECT_NULL( pPos );
DETECT_NULL( *pPos );
ASSERT_NORMAL( XML_LocateNextTwin( pXml, pPos ) );
DETECT_NULL( *pPos );
ASSERT_NORMAL( TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), *pPos, ( LPVOID * )&pNode ) );
if ( pNode->pszData != NULL ) {
DETECT( nDataSize > ( UINT )strlen( pNode->pszData ) );
strcpy( pszData, ( LPCSTR )( pNode->pszData ) );
}
else {
DETECT( nDataSize >= 1 );
strcpy( pszData, "" );
}
return NORMAL;
}
/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_GetNextProperty( IN PCXMLSTRUCT pXml, IN OUT PPOS pPos, OUT PNODEPROPERTY pProp )
{
/*与XML_GetVal、XML_GetProperty配合使用,取下一个同名节点的值*/
DETECT_NULL( pPos );
DETECT_NULL( *pPos );
ASSERT_NORMAL( XML_LocateNextTwin( pXml, pPos ) );
DETECT_NULL( *pPos );
return XML_GetPropertyByPos( pXml, *pPos, pProp );
}
/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_GetPriorVal( IN PCXMLSTRUCT pXml, IN OUT PPOS pPos, OUT LPSTR pszData, IN UINT nDataSize )
{
/*与XML_GetVal、XML_GetProperty函数配合使用,取上一个同名节点的值*/
PXMLNODE pNode;
DETECT_NULL( pPos );
DETECT_NULL( *pPos );
ASSERT_NORMAL( XML_LocatePriorTwin( pXml, pPos ) );
DETECT_NULL( *pPos );
ASSERT_NORMAL( TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), *pPos, ( LPVOID * )&pNode ) );
if ( pNode->pszData != NULL ) {
DETECT( nDataSize > ( UINT )strlen( pNode->pszData ) );
strcpy( pszData, ( LPCSTR )( pNode->pszData ) );
}
else {
DETECT( nDataSize >= 1 );
strcpy( pszData, "" );
}
return NORMAL;
}
/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_GetPriorProperty( IN PCXMLSTRUCT pXml, IN OUT PPOS pPos, OUT PNODEPROPERTY pProp )
{
/*与XML_GetVal、XML_GetProperty配合使用,取上一个同名节点的值*/
DETECT_NULL( pPos );
DETECT_NULL( *pPos );
ASSERT_NORMAL( XML_LocatePriorTwin( pXml, pPos ) );
DETECT_NULL( *pPos );
return XML_GetPropertyByPos( pXml, *pPos, pProp );
}
/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_GetNodePath( IN PCXMLSTRUCT pXml, IN POS nPos, OUT LPSTR pszPath, IN OUT UINT *pnLen )
{
/*取节点的路径或路径的长度
如果:pszPath为空,则返回路径的长度
2003-05-19新增加的函数
此函数应该修改
*/
char sztmpBuffer[XML_MAX_PATH + 1];
char sztmpPath[XML_MAX_PATH + 1];
POS nParent;
PXMLNODE pNode;
UINT nLen;
DETECT_NULL( pXml );
DETECT( TREE_NodeIsValid( ( PCTREESTRUCT )&( pXml->nTree ), nPos ) );
memset( sztmpBuffer, 0, sizeof( sztmpBuffer ) );
memset( sztmpPath, 0, sizeof( sztmpPath ) );
nParent = nPos;
ASSERT_NORMAL( TREE_GetParent( ( PCTREESTRUCT )&( pXml->nTree ), &nParent ) );
if ( nParent != NULL ) {
ASSERT_NORMAL( TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), nPos, ( LPVOID * )&pNode ) );
strcat( sztmpPath, pNode->szName );
}
else {
return INVALID;
}
while( nParent != NULL ) {
/*取父节点*/
nPos = nParent;
ASSERT_NORMAL( TREE_GetParent( ( PCTREESTRUCT )&( pXml->nTree ), &nParent ) );
if ( nParent == NULL ) break;
ASSERT_NORMAL( TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), nPos, ( LPVOID * )&pNode ) );
strcpy( sztmpBuffer, pNode->szName );
strcat( sztmpBuffer, "/" );
strcat( sztmpBuffer, sztmpPath );
strcpy( sztmpPath, sztmpBuffer );
memset( sztmpBuffer, 0, sizeof( sztmpBuffer ) );
}
nLen = ( UINT )strlen( sztmpPath );
if ( pszPath != NULL ) {
/*取值及取长度*/
if ( nLen >= *pnLen ) {
*pszPath = 0;
*pnLen = nLen;
return INVALID;
}
else {
strcpy( pszPath, sztmpPath );
*pnLen = nLen;
}
}
else {
/*只取长度*/
*pnLen = nLen;
}
return NORMAL;
}
/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_GetSubVal( \
IN PCXMLSTRUCT pXml, \
IN POS nPos, \
IN LPCSTR pszPath, \
OUT LPSTR pszData, \
IN UINT nDataSize, \
OUT PPOS pSubPos \
)
{
/*在节点中取其子节点的值,其中,pszPath指的是绝对路径*/
PXMLNODE pNode;
POS nSubPos;
DETECT_NULL( pXml );
DETECT_NULL( pXml->nTree.nRootPos );
DETECT_NULL( pszPath );
DETECT( strlen( pszPath ) <= XML_PATH_LEN );
DETECT_NULL( pszData );
ASSERT_NORMAL( XML_LocateSubNode( pXml, nPos, pszPath, XML_LOCFIRST, &nSubPos ) );
if ( nSubPos != NULL ) {
ASSERT_NORMAL( TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), nSubPos, ( LPVOID * )&pNode ) );
if ( pSubPos != NULL ) *pSubPos = nSubPos;
if ( pNode->pszData != NULL ) {
DETECT( nDataSize > ( UINT )strlen( pNode->pszData ) );
strcpy( pszData, ( LPCSTR )( pNode->pszData ) );
return NORMAL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -