📄 memlib.c
字号:
free(psHeap -> psHeapData[sCnt].pvData);
psHeap -> psHeapData[sCnt].pvData = NULL;
}
}
}
/*
** Free up the data for the array of heapdata structures
*/
if(psHeap -> psHeapData != NULL)
free(psHeap -> psHeapData);
free(psHeap);
(*ppsHeap) = NULL;
}
return(C_OK);
}
/******************************************************************************
*+
** Function Name: MemLstAddAfterMember
**
** Description: Adds a member after another given member in a list
**
** Return Codes:
** C_OK
**
** Written by: John Tal
**
**
** Modification History:
**
** Date Programmer Mod# Modification
** ---------------------------------------------------------------------------
** 06/12/90 J. Tal V1.0-000 New
**
*-
*/
#if C_ANSI
SHORT APIENTRY
MemLstAddAfterMember(LLIST_P psPrev,LLIST_P psNewMember)
#else
SHORT APIENTRY
MemLstAddAfterMember(psPrev, psNewMember)
LLIST_P psPrev;
LLIST_P psNewMember;
#endif
{
LLIST_P psTemp;
psNewMember -> psNext = psPrev -> psNext;
psNewMember -> psPrev = psPrev;
psTemp = psPrev -> psNext;
psPrev -> psNext = psNewMember;
if(psTemp != NULL)
psTemp -> psPrev = psNewMember;
return(C_OK);
}
/******************************************************************************
*+
** Function Name: MemLstAddBeforeMember
**
** Description: Adds a member before another given member in a list.
**
** Return Codes:
** C_OK
**
** Written by: John Tal
**
**
** Modification History:
**
** Date Programmer Mod# Modification
** ---------------------------------------------------------------------------
** 06/12/90 J. Tal V1.0-000 New
**
*-
*/
#if C_ANSI
SHORT APIENTRY
MemLstAddBeforeMember(LLIST_P psListRoot,LLIST_P psPrev,LLIST_P psNewMember,LLIST_PP ppsRetMember)
#else
SHORT APIENTRY
MemLstAddBeforeMember(psListRoot,psPrev,psNewMember,ppsRetMember)
LLIST_P psListRoot;
LLIST_P psPrev;
LLIST_P psNewMember;
LLIST_PP ppsRetMember;
#endif
{
LLIST_P psTemp;
if(psPrev == psListRoot)
{
psListRoot = psNewMember;
psPrev -> psPrev = psNewMember;
psNewMember -> psNext = psPrev;
}
else
{
psTemp = psPrev -> psPrev;
psTemp -> psNext = psNewMember;
psPrev -> psPrev = psNewMember;
psNewMember -> psNext = psPrev;
}
*ppsRetMember = psListRoot;
return(C_OK);
}
/******************************************************************************
*+
** Function Name: MemLstAllocMember
**
** Description: Allocates memory for a new member.
** Initializes new member pointers.
**
** Return Codes:
** C_OK
**
** Written by: John Tal
**
**
** Modification History:
**
** Date Programmer Mod# Modification
** ---------------------------------------------------------------------------
** 06/12/90 J. Tal V1.0-000 New
**
*-
*/
#if C_ANSI
SHORT APIENTRY
MemLstAllocMember(LLIST_PP ppsRetMember)
#else
SHORT APIENTRY
MemLstAllocMember(ppsRetMember)
LLIST_PP ppsRetMember;
#endif
{
LLIST_P psItem;
psItem = (LLIST_P) calloc(sizeof(LLIST_T),sizeof(BYTE));
(*ppsRetMember) = psItem;
if(psItem != NULL)
return(C_OK);
else
return(C_NOTOK);
}
/******************************************************************************
*+
** Function Name: MemLstDeleteMember
**
** Description: Deletes a member from a list. No search involved.
**
** Return Codes:
** C_OK
**
** Written by: John Tal
**
**
** Modification History:
**
** Date Programmer Mod# Modification
** ---------------------------------------------------------------------------
** 06/12/90 J. Tal V1.0-000 New
**
*-
*/
#if C_ANSI
SHORT APIENTRY
MemLstDeleteMember(LLIST_P psListRoot, LLIST_P psMember,LLIST_PP ppsRetMember)
#else
SHORT APIENTRY
MemLstDeleteMember(psListRoot,psMember,ppsRetMember)
LLIST_P psListRoot; /* Root/head of list */
LLIST_P psMember; /* address of member to delete */
LLIST_PP ppsRetMember; /* root/head on return */
#endif
{
LLIST_P psTemp;
if(psMember == psListRoot)
{
psListRoot = psMember -> psNext;
if(psListRoot != NULL)
psListRoot -> psPrev = NULL;
}
else
{
psTemp = psMember -> psNext;
if(psTemp != NULL)
psTemp -> psPrev = psMember -> psPrev;
psTemp = psMember -> psPrev;
psTemp -> psNext = psMember -> psNext;
}
free(psMember);
(*ppsRetMember) = psListRoot;
return(C_OK);
}
/******************************************************************************
*+
** Function Name: MemLstFindMember
**
** Description: Searches for a member in a list
**
** Return Codes:
** C_OK
** (Check parameter on return, IF NULL = not in tree.
** Otherwise set to point to member)
**
** Written by: John Tal
**
**
** Modification History:
**
** Date Programmer Mod# Modification
** ---------------------------------------------------------------------------
** 06/12/90 J. Tal V1.0-000 New
**
*-
*/
#if C_ANSI
SHORT APIENTRY
MemLstFindMember(LLIST_P psListRoot,
PVOID pvData,
SHORT (*compare_func)(PVOID,PVOID),
LLIST_PP ppsRetMember)
#else
SHORT APIENTRY
MemLstFindMember(psListRoot,pvData,compare_func,ppsRetMember)
LLIST_P psListRoot; /* root/head of list */
PVOID pvData; /* value you are searching for (could be PVOID) */
SHORT (*compare_func)(); /* compare function you provide */
LLIST_PP ppsRetMember; /* root/head on return */
#endif
{
LLIST_P psList = NULL;
SHORT sTemp;
if(psListRoot != NULL)
{
psList = psListRoot;
while ( (sTemp=((*compare_func)(pvData,psList -> pvData)) ) != 0)
{
psList = psList -> psNext;
if(psList == NULL)
break;
}
if(psList != NULL)
if( ((*compare_func)(pvData,psList -> pvData)) != 0)
psList = NULL;
}
*ppsRetMember = psList;
return(C_OK);
}
/******************************************************************************
*+
** Function Name: MemLstFindTailMember
**
** Description: Finds the last member in a list.
**
** Return Codes:
** C_OK
**
** Written by: John Tal
**
**
** Modification History:
**
** Date Programmer Mod# Modification
** ---------------------------------------------------------------------------
** 06/12/90 J. Tal V1.0-000 New
**
*-
*/
#if C_ANSI
SHORT APIENTRY
MemLstFindTailMember(LLIST_P psListRoot,LLIST_PP psRetMember)
#else
SHORT APIENTRY
MemLstFindTailMember(psListRoot, psRetMember)
LLIST_P psListRoot;
LLIST_PP psRetMember;
#endif
{
LLIST_P psList = NULL;
LLIST_P psPrev = NULL;
psList = psListRoot;
while(psList != NULL)
{
psPrev = psList;
psList = psList -> psNext;
}
psList = psPrev;
*psRetMember = psList;
return(C_OK);
}
/******************************************************************************
*+
** Function Name: MemLstInsertMember
**
** Description: Inserts a newly allocated member into a list.
** Uses the supplied compare function to determine
** where to place the entry in the list.
**
** Return Codes:
** C_OK
**
** Written by: John Tal
**
**
** Modification History:
**
** Date Programmer Mod# Modification
** ---------------------------------------------------------------------------
** 06/12/90 J. Tal V1.0-000 New
**
*-
*/
#if C_ANSI
SHORT APIENTRY
MemLstInsertMember(LLIST_P psListRoot, LLIST_P psMember,SHORT (*compare_func)(PVOID,PVOID),LLIST_PP ppsRetMember)
#else
SHORT APIENTRY
MemLstInsertMember(psListRoot,psMember,compare_func,ppsRetMember)
LLIST_P psListRoot;
LLIST_P psMember;
SHORT (*compare_func)();
LLIST_PP ppsRetMember;
#endif
{
LLIST_P psPrev = NULL;
LLIST_P psList;
if(psListRoot == NULL)
{
psListRoot = psMember;
*ppsRetMember = psListRoot;
return(C_OK);
}
else
{
psList = psListRoot;
while( ((*compare_func)(psList -> pvData, psMember -> pvData)) < 0)
{
psPrev = psList;
psList = psList -> psNext;
if(psList == NULL)
break;
}
if(psPrev == NULL)
MemLstAddBeforeMember(psListRoot,psList,psMember,&psListRoot);
else
MemLstAddAfterMember(psPrev,psMember); /* big change from binary, uses
prev ptr found here */
*ppsRetMember = psListRoot;
return(C_OK);
} /* if list != NULL */
}
/******************************************************************************
*+
** Function Name: MemLstUnlinkMember
**
** Description: Searches for a member in a list and unlinks
** that member from the list, does not free() pointer.
**
** Return Codes:
** C_OK
**
** Written by: John Tal
**
**
** Modification History:
**
** Date Programmer Mod# Modification
** ---------------------------------------------------------------------------
** 06/12/90 J. Tal V1.0-000 New
**
*-
*/
#if C_ANSI
SHORT APIENTRY
MemLstUnlinkMember(LLIST_P psListRoot, LLIST_P psMember,LLIST_PP ppsRetMember)
#else
SHORT APIENTRY
MemLstUnlinkMember(psListRoot,psMember,ppsRetMember)
LLIST_P psListRoot;
LLIST_P psMember;
LLIST_PP ppsRetMember;
#endif
{
LLIST_P psTemp;
if(psMember == psListRoot)
{
psListRoot = psMember -> psNext;
if(psListRoot != NULL)
psListRoot -> psPrev = NULL;
}
else
{
psTemp = psMember -> psNext;
if(psTemp != NULL)
psTemp -> psPrev = psMember -> psPrev;
psTemp = psMember -> psPrev;
psTemp -> psNext = psMember -> psNext;
}
*ppsRetMember = psListRoot;
return(C_OK);
}
/******************************************************************************
*+
** Function Name: MemLstVacateList
**
** Description: Removes all members from a list
**
** Return Codes:
** C_OK
**
** Written by: John Tal
**
**
** Modification History:
**
** Date Programmer Mod# Modification
** ---------------------------------------------------------------------------
** 10-FEB-1991 J. Tal V1.0-000 New
**
*-
*/
#if C_ANSI
SHORT APIENTRY
MemLstVacateList(LLIST_PP ppsListRoot, BOOL fFreeData)
#else
SHORT APIENTRY
MemLstVacateList(ppsListRoot,fFreeData)
LLIST_PP ppsListRoot;
BOOL fFreeData;
#endif
{
LLIST_P psTemp; /* working pointer */
psTemp = (*ppsListRoot);
/*
** Spin through list from head to end
*/
while(psTemp != NULL)
{
/*
** If free the data and data to free then free
*/
if(fFreeData)
if(psTemp -> pvData != NULL)
free(psTemp -> pvData);
/*
** Delete the member itself
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -