96 lines
1.9 KiB
C++
96 lines
1.9 KiB
C++
/*++
|
|
|
|
Copyright (C) 1996-1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
namenode.cpp
|
|
|
|
Abstract:
|
|
|
|
Implements the named data node list.
|
|
|
|
--*/
|
|
|
|
#include "wtypes.h"
|
|
#include "namenode.h"
|
|
|
|
BOOL
|
|
CNamedNodeList::FindByName (
|
|
IN LPCTSTR pszName,
|
|
IN INT iNameOffset,
|
|
OUT PCNamedNode *ppnodeRet
|
|
)
|
|
{
|
|
PCNamedNode pnodePrev = NULL;
|
|
PCNamedNode pnode = m_pnodeFirst;
|
|
INT iStat = 1;
|
|
|
|
// search til match or insertion position found
|
|
while (pnode != NULL && (iStat = lstrcmpi(pszName, (LPCTSTR)((CHAR*)pnode + iNameOffset))) > 0) {
|
|
pnodePrev = pnode;
|
|
pnode = pnode->m_pnodeNext;
|
|
}
|
|
|
|
// if match, return matched node
|
|
if (iStat == 0) {
|
|
*ppnodeRet = pnode;
|
|
return TRUE;
|
|
}
|
|
// else return insertion point
|
|
else {
|
|
*ppnodeRet = pnodePrev;
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
void
|
|
CNamedNodeList::Add (
|
|
IN PCNamedNode pnodeNew,
|
|
IN PCNamedNode pnodePos
|
|
)
|
|
{
|
|
// if position specified, insert after it
|
|
if (pnodePos != NULL) {
|
|
pnodeNew->m_pnodeNext = pnodePos->m_pnodeNext;
|
|
pnodePos->m_pnodeNext = pnodeNew;
|
|
if (pnodePos == m_pnodeLast)
|
|
m_pnodeLast = pnodeNew;
|
|
}
|
|
// else place first in list
|
|
else if (m_pnodeFirst != NULL) {
|
|
pnodeNew->m_pnodeNext = m_pnodeFirst;
|
|
m_pnodeFirst = pnodeNew;
|
|
}
|
|
else {
|
|
m_pnodeFirst = pnodeNew;
|
|
m_pnodeLast = pnodeNew;
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
CNamedNodeList::Remove (
|
|
IN PCNamedNode pnode
|
|
)
|
|
{
|
|
PCNamedNode pnodePrev = NULL;
|
|
PCNamedNode pnodeTemp = m_pnodeFirst;
|
|
|
|
while (pnodeTemp != NULL && pnodeTemp != pnode) {
|
|
pnodePrev = pnodeTemp;
|
|
pnodeTemp = pnodeTemp->m_pnodeNext;
|
|
}
|
|
|
|
if (pnodeTemp == NULL)
|
|
return;
|
|
|
|
if (pnodePrev)
|
|
pnodePrev->m_pnodeNext = pnode->m_pnodeNext;
|
|
else
|
|
m_pnodeFirst = pnode->m_pnodeNext;
|
|
|
|
if (pnode == m_pnodeLast)
|
|
m_pnodeLast = pnodePrev;
|
|
}
|