mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
256 lines
5.2 KiB
256 lines
5.2 KiB
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// propmisc.c
|
|
//
|
|
// Misc. Property set rotuines
|
|
//
|
|
// Change history:
|
|
//
|
|
// Date Who What
|
|
// --------------------------------------------------------------------------
|
|
// 07/30/94 B. Wentz Created file
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "priv.h"
|
|
#pragma hdrstop
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// LpllCreateList
|
|
//
|
|
// Purpose:
|
|
// Create a linked list with dwc elements.
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
LPLLIST
|
|
LpllCreate
|
|
(LPLLIST *lplpll, // Head
|
|
LPLLCACHE lpllcache, // Cache
|
|
DWORD dwc, // Number of nodes to create
|
|
DWORD cbNode) // Size of each node
|
|
{
|
|
LPLLIST lpllT;
|
|
LPLLIST lpllCur;
|
|
|
|
if ((lplpll == NULL) ||
|
|
(dwc < 1) ||
|
|
(cbNode < sizeof(LLIST)))
|
|
return NULL;
|
|
|
|
lpllCur = *lplpll = PvMemAlloc(cbNode);
|
|
if (lpllCur == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
FillBuf (lpllCur, 0, cbNode);
|
|
|
|
lpllCur->lpllistPrev = NULL;
|
|
dwc--;
|
|
|
|
while (dwc)
|
|
{
|
|
lpllT = PvMemAlloc(cbNode);
|
|
if (lpllT == NULL)
|
|
goto Fail;
|
|
|
|
FillBuf (lpllT, 0, cbNode);
|
|
lpllT->lpllistPrev = lpllCur;
|
|
lpllCur->lpllistNext = lpllT;
|
|
lpllCur = lpllT;
|
|
dwc--;
|
|
} // while
|
|
|
|
lpllCur->lpllistNext = NULL;
|
|
lpllcache->lpllist = NULL;
|
|
|
|
return *lplpll;
|
|
|
|
Fail :
|
|
|
|
lpllCur = *lplpll;
|
|
while (lpllCur != NULL)
|
|
{
|
|
lpllT = lpllCur;
|
|
lpllCur = lpllCur->lpllistNext;
|
|
VFreeMemP(lpllT, cbNode);
|
|
}
|
|
|
|
return NULL;
|
|
|
|
} // LpllCreateList
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// LpllGetNode
|
|
//
|
|
// Purpose:
|
|
// Gets a node from the list
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
LPLLIST
|
|
LpllGetNode
|
|
(LPLLIST lpllist, // The head
|
|
LPLLCACHE lpllcache, // The cache
|
|
DWORD idw) // Index of node to get -- 1 based
|
|
{
|
|
DWORD i = idw;
|
|
|
|
if ((lpllcache->lpllist != NULL) && (lpllcache->idw == idw))
|
|
{
|
|
return lpllcache->lpllist;
|
|
}
|
|
|
|
while ((i > 1) && (lpllist != NULL))
|
|
{
|
|
lpllist = lpllist->lpllistNext;
|
|
i--;
|
|
}
|
|
|
|
if (lpllist != NULL)
|
|
{
|
|
lpllcache->idw = idw;
|
|
lpllcache->lpllist = lpllist;
|
|
}
|
|
|
|
return lpllist;
|
|
|
|
} // LpllGetNode
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// LpllDeleteNode
|
|
//
|
|
// Purpose:
|
|
// Delete a node from the list
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
LPLLIST
|
|
LpllDeleteNode
|
|
(LPLLIST lpllist, // Head
|
|
LPLLCACHE lpllcache, // Cache
|
|
DWORD idw, // Index -- 1 based
|
|
DWORD cbNode, // Size of node
|
|
void (*lpfnFreeNode)(LPLLIST) // Free a node
|
|
)
|
|
{
|
|
LPLLIST lpT;
|
|
LPLLIST lpNext;
|
|
|
|
BOOL fHead;
|
|
|
|
// Check the cache
|
|
if ((lpllcache->lpllist != NULL) && (lpllcache->idw == idw))
|
|
{
|
|
lpT = lpllcache->lpllist;
|
|
lpllcache->lpllist = NULL;
|
|
}
|
|
else
|
|
{
|
|
lpT = LpllGetNode (lpllist, lpllcache, idw);
|
|
}
|
|
|
|
if (lpT == NULL) // We couldn't find the node
|
|
{
|
|
return lpT;
|
|
}
|
|
|
|
fHead = lpT->lpllistPrev == NULL;
|
|
|
|
// Delete the node from the list
|
|
if (lpT->lpllistPrev != NULL)
|
|
{
|
|
lpT->lpllistPrev->lpllistNext = lpT->lpllistNext;
|
|
}
|
|
|
|
if ((lpNext = lpT->lpllistNext) != NULL)
|
|
{
|
|
lpT->lpllistNext->lpllistPrev = lpT->lpllistPrev;
|
|
}
|
|
|
|
// Delete the string & node
|
|
(*lpfnFreeNode) (lpT);
|
|
VFreeMemP(lpT, cbNode);
|
|
|
|
// If the head was deleted, return the new one.
|
|
return (fHead ? lpNext : lpllist);
|
|
|
|
} // LpllDeleteNode
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// LpllInsertNode
|
|
//
|
|
// Purpose:
|
|
// Insert a node into the list
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
LPLLIST PASCAL
|
|
LpllInsertNode
|
|
(LPLLIST lpllist, // Head
|
|
LPLLCACHE lpllcache, // Cache
|
|
DWORD idw, // index
|
|
DWORD cbNode) // Size of node
|
|
{
|
|
LPLLIST lpT;
|
|
LPLLIST lpOrigHead;
|
|
BOOL fHead;
|
|
DWORD idwOrig;
|
|
|
|
if ((lpOrigHead = lpllist) == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
idwOrig = idw;
|
|
|
|
Assert ((idw > 0));
|
|
idw--;
|
|
while ((idw) && (lpllist->lpllistNext != NULL))
|
|
{
|
|
lpllist = lpllist->lpllistNext;
|
|
idw--;
|
|
}
|
|
|
|
lpT = PvMemAlloc(cbNode);
|
|
if (lpT == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
FillBuf (lpT, 0, cbNode);
|
|
|
|
// If the new node was to be inserted at the end, idw would not
|
|
// be zero, the while loop would have fallen out because Next was NULL
|
|
if (idw)
|
|
{
|
|
fHead = FALSE;
|
|
lpT->lpllistPrev = lpllist;
|
|
lpT->lpllistNext = NULL;
|
|
lpllist->lpllistNext = lpT;
|
|
}
|
|
else
|
|
{
|
|
fHead = (lpllist == lpOrigHead);
|
|
|
|
lpT->lpllistPrev = lpllist->lpllistPrev;
|
|
if (lpllist->lpllistPrev != NULL)
|
|
{
|
|
lpllist->lpllistPrev->lpllistNext = lpT;
|
|
}
|
|
lpT->lpllistNext = lpllist;
|
|
lpllist->lpllistPrev = lpT;
|
|
}
|
|
|
|
// Update the cache
|
|
lpllcache->idw = idwOrig;
|
|
lpllcache->lpllist = lpT;
|
|
|
|
return (fHead ? lpT : lpOrigHead);
|
|
|
|
} // LpllInsertNode
|
|
|