📄 cxml.c
字号:
DETECT( pszData == NULL || ( strlen( pszData ) + Calu_Var_Chgs( pszData ) * 4 ) <= XML_DATA_LEN );
DETECT_NULL( pszPath );
DETECT( strlen( pszPath ) <= XML_PATH_LEN );
GetPriorPath( pszPath, ( LPSTR )szPath );
ASSERT_NORMAL( GetLastName( pszPath, ( LPSTR )szName ) );
nPos = pXml->nTree.nRootPos;
/*对XML_BASEGROW模式的处理*/
if ( ( nMode & ( XML_BASEGROW ^ XML_AUTOGROW ) ) && !( nMode & XML_UNIQNAME ) ) {
if ( strlen( szPath ) ) {
/*节点的路径名不为空*/
char szParentName[XML_NAME_LEN + 1];
ASSERT_NORMAL( GetRootName( ( LPCSTR )szPath, ( LPSTR )szParentName ) );
nPosLoc = nPos;
/*定位节点名*/
ASSERT_NORMAL( XML_Locate( pXml, &nPosLoc, ( LPCSTR )szParentName, XML_LOCLAST ) );
if ( nPosLoc != NULL ) {
/*判断此节点是否有子节点*/
nPos = nPosLoc;
if ( TREE_GetChildCount( ( PCTREESTRUCT )&( pXml->nTree ), nPos ) ) {
/*有子节点,则其父节点的最后增加一个同名的节点,并定位之*/
ASSERT_NORMAL( TREE_GetParent( ( PCTREESTRUCT )&( pXml->nTree ), &nPos ) );
ASSERT_NORMAL( XML_InsertChildTail( pXml, nPos, ( LPCSTR )szParentName, NULL, NULL ) );
/*定位刚添加的节点的位置*/
ASSERT_NORMAL( TREE_GetChildTail( ( PCTREESTRUCT )&( pXml->nTree ), &nPos ) );
DETECT_NULL( nPos );
}
}
}
}
/*在XML中定位其父节点*/
ASSERT_NORMAL( XML_Locate( pXml, &nPos, ( LPCSTR )szPath, nMode ) );
DETECT_NULL( nPos );
if ( nMode & XML_UNIQNAME ) {
nPosLoc = nPos;
if ( nMode & XML_LOCLAST ) {
TREE_GetChildTail( ( PCTREESTRUCT )&( pXml->nTree ), &nPosLoc );
}
else {
TREE_GetChildHead( ( PCTREESTRUCT )&( pXml->nTree ), &nPosLoc );
}
while ( nPosLoc != NULL ) {
TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), nPosLoc, ( LPVOID * )&pNode );
if ( strcmp( szName, pNode->szName ) == 0 ) {
ASSERT_NORMAL( XML_SetInfoByPos( pXml, nPosLoc, szName, pszData ) );
return NORMAL;
}
if ( nMode & XML_LOCLAST ) {
TREE_GetPrior( ( PCTREESTRUCT )&( pXml->nTree ), &nPosLoc );
}
else {
TREE_GetNext( ( PCTREESTRUCT )&( pXml->nTree ), &nPosLoc );
}
}
}
/*对XML_LEADGROW模块的处理*/
if ( ( nMode & ( XML_LEADGROW ^ XML_AUTOGROW ) ) && !( nMode & XML_UNIQNAME ) && !( nMode & ( XML_BASEGROW ^ XML_AUTOGROW ) ) ) {
/*尾节点自动增加的方式*/
/*判断是否是根节点*/
if ( nPos != pXml->nTree.nRootPos ) {
/*定位最后一个同名节点*/
nPosLoc = nPos;
while( nPosLoc != NULL ) {
nPos = nPosLoc;
if ( XML_LocateNextTwin( ( PCXMLSTRUCT )pXml, &nPosLoc ) != NORMAL ) break;
}
/*判断此节点的子节点的个数,如果不是空节点或是父节点,则增加它*/
if ( TREE_GetChildCount( ( PCTREESTRUCT )&( pXml->nTree ), nPos ) ) {
/*首先在父节点的最后增加一个同级节点*/
TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), nPos, ( LPVOID * )&pNode );
ASSERT_NORMAL( TREE_GetParent( ( PCTREESTRUCT )&( pXml->nTree ), &nPos ) );
ASSERT_NORMAL( XML_InsertChildTail( pXml, nPos, ( LPCSTR )pNode->szName, NULL, NULL ) );
ASSERT_NORMAL( TREE_GetChildTail( ( PCTREESTRUCT )&( pXml->nTree ), &nPos ) );
DETECT_NULL( nPos );
}
}
}
ASSERT_NORMAL( XML_InsertChildTail( pXml, nPos, szName, pszData, pProp ) );
return NORMAL;
}
/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_InsertChildHead( IN OUT PXMLSTRUCT pXml, IN POS nPos, IN LPCSTR pszName, IN LPCSTR pszData, IN PCNODEPROPERTY pProp )
{
/*在子节点位置插入第一个子节点*/
PXMLNODE pNode;
UINT nDepth;
UINT nNameLen, nDataLen, nLen, nProperLen, nLoop;
char tmpName[XML_NAME_LEN + 1];
DETECT_NULL( pXml );
DETECT( TREE_NodeIsValid( ( PCTREESTRUCT )&( pXml->nTree ), nPos ) );
/*取最后的节点名*/
ASSERT_NORMAL( GetLastName( pszName, tmpName ) );
/*应该考虑字符串长度为0的情况*/
nNameLen = ( UINT )strlen( tmpName );
nDataLen = ( pszData == NULL ? 0 : ( UINT )strlen( pszData ) + Calu_Var_Chgs( pszData ) * 4 );
DETECT( nNameLen <= XML_NAME_LEN );
DETECT( nDataLen <= XML_DATA_LEN );
TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), nPos, ( LPVOID * )&pNode );
/*如果加上此句,是正规XML的规范,但不符合XML的标准*/
/*应该考虑到既有子节点,又有值的情况*/
DETECT( pNode->pszData == NULL );
/*计算属性的长度*/
nProperLen = 0;
if ( pProp != NULL ) {
for( nLoop = 0; nLoop < pProp->nCount; nLoop ++ ) {
nProperLen += ( UINT )( strlen( pProp->pVal[nLoop].szName ) + 2 \
+ strlen( pProp->pVal[nLoop].szData ) \
+ Calu_Var_Chgs( pProp->pVal[nLoop].szData ) * 4 + 2 );
}
}
/*计算XML的长度*/
nDepth = TREE_GetDepth( ( PCTREESTRUCT )&( pXml->nTree ), nPos );
nLen = pXml->nLen + nNameLen * 2 + 2 + nDataLen + nDepth + nProperLen;
if ( TREE_GetChildCount( ( PCTREESTRUCT )&( pXml->nTree ), nPos ) == 0 )
nLen += nDepth;
DETECT( nLen <= pXml->nMaxLen );
if ( VERIFY_NULL( pNode = XML_AllocNode( ( LPCSTR )tmpName, pszData, pProp ) ) &&
VERIFY_NORMAL( TREE_InsertChildHead( &pXml->nTree, nPos, ( LPCVOID )pNode ) ) ) {
pXml->nLen = nLen;
return NORMAL;
}
if ( pNode != NULL )
XML_FreeNode( pNode );
return EXCEPTION;
}
/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_InsertChildTail( IN OUT PXMLSTRUCT pXml, IN POS nPos, IN LPCSTR pszName, IN LPCSTR pszData, IN PCNODEPROPERTY pProp )
{
/*在子节点位置插入最后一个子节点*/
PXMLNODE pNode;
UINT nDepth;
UINT nNameLen, nDataLen, nLen, nProperLen, nLoop;
char tmpName[XML_NAME_LEN + 1];
DETECT_NULL( pXml );
DETECT( TREE_NodeIsValid( ( PCTREESTRUCT )&( pXml->nTree ), nPos ) );
/*取最后的节点名*/
ASSERT_NORMAL( GetLastName( pszName, tmpName ) );
/*应该考虑字符串长度为0的情况*/
nNameLen = ( UINT )strlen( tmpName );
nDataLen = ( pszData == NULL ? 0 : ( UINT )strlen( pszData ) + Calu_Var_Chgs( pszData ) * 4 );
DETECT( nNameLen <= XML_NAME_LEN );
DETECT( nDataLen <= XML_DATA_LEN );
TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), nPos, ( LPVOID * )&pNode );
/*如果加上此句,是正规XML的规范,但不符合XML的标准*/
/*应该考虑到既有子节点,又有值的情况*/
DETECT( pNode->pszData == NULL );
/*计算属性的长度*/
nProperLen = 0;
if ( pProp != NULL ) {
for( nLoop = 0; nLoop < pProp->nCount; nLoop ++ ) {
nProperLen += ( UINT )( strlen( pProp->pVal[nLoop].szName ) + 2 \
+ strlen( pProp->pVal[nLoop].szData ) \
+ Calu_Var_Chgs( pProp->pVal[nLoop].szData ) * 4 + 2 );
}
}
/*计算XML的长度*/
nDepth = TREE_GetDepth( ( PCTREESTRUCT )&( pXml->nTree ), nPos );
nLen = pXml->nLen + nNameLen * 2 + 2 + nDataLen + nDepth + nProperLen;
/*因为缩进的关系,当成为父节点时,长度应该再加上一个节点的深度*/
if ( TREE_GetChildCount( ( PCTREESTRUCT )&( pXml->nTree ), nPos ) == 0 )
nLen += nDepth;
DETECT( nLen <= pXml->nMaxLen );
if ( VERIFY_NULL( pNode = XML_AllocNode( ( LPCSTR )tmpName, pszData, pProp ) ) &&
VERIFY_NORMAL( TREE_InsertChildTail( &pXml->nTree, nPos, ( LPCVOID )pNode ) ) ) {
pXml->nLen = nLen;
return NORMAL;
}
if ( pNode != NULL )
XML_FreeNode( pNode );
return EXCEPTION;
}
/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_InsertPrior( IN OUT PXMLSTRUCT pXml, IN POS nPos, IN LPCSTR pszName, IN LPCSTR pszData, IN PCNODEPROPERTY pProp )
{
/*在此节点前插入一个节点,pszName是不含路径的节点名*/
PXMLNODE pNode;
UINT nDepth;
UINT nNameLen, nDataLen, nLen, nProperLen, nLoop;
char tmpName[XML_NAME_LEN + 1];
DETECT_NULL( pXml );
DETECT( TREE_NodeIsValid( ( PCTREESTRUCT )&( pXml->nTree ), nPos ) );
/*取最后的节点名*/
ASSERT_NORMAL( GetLastName( pszName, tmpName ) );
/*应该考虑字符串长度为0的情况*/
nNameLen = ( UINT )strlen( tmpName );
nDataLen = ( pszData == NULL ? 0 : ( UINT )strlen( pszData ) + Calu_Var_Chgs( pszData ) * 4);
DETECT( nNameLen <= XML_NAME_LEN );
DETECT( nDataLen <= XML_DATA_LEN );
/*计算属性的长度*/
nProperLen = 0;
if ( pProp != NULL ) {
for( nLoop = 0; nLoop < pProp->nCount; nLoop ++ ) {
nProperLen += ( UINT )( strlen( pProp->pVal[nLoop].szName ) + 2 \
+ strlen( pProp->pVal[nLoop].szData ) \
+ Calu_Var_Chgs( pProp->pVal[nLoop].szData ) * 4 + 2 );
}
}
/*计算XML的长度*/
nDepth = TREE_GetDepth( ( PCTREESTRUCT )&( pXml->nTree ), nPos );
nLen = pXml->nLen + nNameLen * 2 + 1 + nDataLen + nDepth + nProperLen;
DETECT( nLen <= pXml->nMaxLen );
if ( VERIFY_NULL( pNode = XML_AllocNode( ( LPCSTR )tmpName, pszData, pProp ) ) &&
VERIFY_NORMAL( TREE_InsertPrior( &pXml->nTree, nPos, ( LPCVOID )pNode ) ) ) {
pXml->nLen = nLen;
return NORMAL;
}
if ( pNode != NULL )
XML_FreeNode( pNode );
return EXCEPTION;
}
/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_InsertNext( IN OUT PXMLSTRUCT pXml, IN POS nPos, IN LPCSTR pszName, IN LPCSTR pszData, IN PCNODEPROPERTY pProp )
{
/*在此节点后插入一个节点,pszName是不含路径的节点名*/
PXMLNODE pNode;
UINT nDepth;
UINT nNameLen, nDataLen, nLen, nProperLen, nLoop;
char tmpName[XML_NAME_LEN + 1];
DETECT_NULL( pXml );
DETECT( TREE_NodeIsValid( ( PCTREESTRUCT )&( pXml->nTree ), nPos ) );
/*取最后的节点名*/
ASSERT_NORMAL( GetLastName( pszName, tmpName ) );
/*应该考虑字符串长度为0的情况*/
nNameLen = ( UINT )strlen( tmpName );
nDataLen = ( pszData == NULL ? 0 : ( UINT )strlen( pszData ) + Calu_Var_Chgs( pszData ) * 4 );
DETECT( nNameLen <= XML_NAME_LEN );
DETECT( nDataLen <= XML_DATA_LEN );
/*计算属性的长度*/
nProperLen = 0;
if ( pProp != NULL ) {
for( nLoop = 0; nLoop < pProp->nCount; nLoop ++ ) {
nProperLen += ( UINT )( strlen( pProp->pVal[nLoop].szName ) + 2 \
+ strlen( pProp->pVal[nLoop].szData ) \
+ Calu_Var_Chgs( pProp->pVal[nLoop].szData ) * 4 + 2 );
}
}
/*计算XML的长度*/
nDepth = TREE_GetDepth( ( PCTREESTRUCT )&( pXml->nTree ), nPos );
nLen = pXml->nLen + nNameLen * 2 + 1 + nDataLen + nDepth + nProperLen;
DETECT( nLen <= pXml->nMaxLen );
if ( VERIFY_NULL( pNode = XML_AllocNode( ( LPCSTR )tmpName, pszData, pProp ) ) &&
VERIFY_NORMAL( TREE_InsertNext( &pXml->nTree, nPos, ( LPCVOID )pNode ) ) ) {
pXml->nLen = nLen;
return NORMAL;
}
if ( pNode != NULL )
XML_FreeNode( pNode );
return EXCEPTION;
}
/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_SetInfoByPos( IN OUT PXMLSTRUCT pXml, IN POS nPos, IN LPCSTR pszName, IN LPCSTR pszData )
{
/*按位置置节点的值*/
PXMLNODE pNode;
LPSTR pszInsData = NULL;
UINT nNameLen, nDataLen, nLen, nOrgNameLen, nOrgDataLen;
char tmpName[33];
DETECT_NULL( pXml );
DETECT( TREE_NodeIsValid( ( PCTREESTRUCT )&( pXml->nTree ), nPos ) );
/*取新节点名*/
ASSERT_NORMAL( GetLastName( pszName, tmpName ) );
nNameLen = ( UINT )strlen( tmpName );
nDataLen = ( pszData == NULL ? 0 : ( UINT )strlen( pszData ) + Calu_Var_Chgs( pszData ) * 4 );
DETECT( nNameLen <= XML_NAME_LEN );
DETECT( nDataLen <= XML_DATA_LEN );
/*应该考虑到既有子节点,又有值的情况*/
if ( TREE_GetChildCount( ( PCTREESTRUCT )&( pXml->nTree ), nPos ) > 0 )
DETECT( pszData == NULL );
ASSERT_NORMAL( TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), nPos, ( LPVOID * )&pNode ) );
nOrgNameLen = ( UINT )strlen( pNode->szName );
nOrgDataLen = ( pNode->pszData == NULL ? 0 : ( UINT )strlen( pNode->pszData ) + Calu_Var_Chgs( ( LPCSTR )( pNode->pszData ) ) * 4 );
nLen = pXml->nLen + 2 * nNameLen - 2 * nOrgNameLen +
nDataLen - nOrgDataLen;
DETECT( nLen <= pXml->nMaxLen );
if ( ( pszData != NULL ) && ( strlen( pszData ) > 0 ) ) {
if ( pNode->pszData != NULL && nOrgDataLen == nDataLen ) {
pXml->nLen = nLen;
strcpy( pNode->szName, tmpName );
strcpy( pNode->pszData, pszData );
return NORMAL;
}
else {
ASSERT_NULL( pszInsData = ( LPSTR )AllocMemory( nDataLen + 2 ) );
strcpy( pszInsData, pszData );
}
}
if ( pNode->pszData != NULL )
FreeMemory( pNode->pszData );
pXml->nLen = nLen;
pNode->pszData = pszInsData;
strcpy( pNode->szName, tmpName );
return NORMAL;
}
/*-------------------------------------------------------------------------*/
RESULT STDCALL XML_GetInfoByPos( IN PCXMLSTRUCT pXml, IN POS nPos, OUT LPSTR pszName, IN UINT nNameSize, OUT LPSTR pszData, IN UINT nDataSize )
{
/*取指定位置的节点信息*/
PXMLNODE pNode;
DETECT_NULL( pXml );
DETECT( TREE_NodeIsValid( ( PCTREESTRUCT )&( pXml->nTree ), nPos ) );
ASSERT_NORMAL( TREE_GetVal( ( PCTREESTRUCT )&( pXml->nTree ), nPos, ( LPVOID * )&pNode ) );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -