librnr  1.14.5
RoadNarrows Robotics Common Library 1
dlistvoid.c File Reference

Doubly linked list (dlist) of void pointers definitions. More...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "rnr/rnrconfig.h"
#include "rnr/dlist.h"
#include "rnr/dlistvoid.h"
#include "rnr/log.h"
#include "rnr/new.h"

Go to the source code of this file.

Classes

struct  dlistvoid_head_t
 Unit Tests (define to build test main) More...
 
struct  dlistvoid_node_t
 Doubly linked list node structure. More...
 

Macros

#define DLISTVOID_ENTRY(dnode)   dlist_entry(dnode, DListVoidNode_T, m_dnode)
 Get embedding node DListVoidNode_T. More...
 
#define DLISTVOID_IS_EMPTY(dvoidhead)   dlist_is_empty(&((dvoidhead)->m_dnodeHead))
 Test if DListVoid_T* holds the empty list. More...
 
#define DLISTVOID_IS_EOL(dvoidhead, pdnode)   ((pdnode) == &((dvoidhead)->m_dnodeHead))
 Test if node is at end-of-list. More...
 

Functions

DListVoid_TDListVoidNew (DListVoidFuncDataCmp_T fnDataCmp, DListVoidFuncDataDelete_T fnDataDelete)
 Allocate and initialize new empty dlist. More...
 
void DListVoidDelete (DListVoid_T *pHead)
 Delete entire dlist. More...
 
void DListVoidDeleteAllNodes (DListVoid_T *pHead)
 Unlink and delete all nodes and data from dlist, leaving dlist empty. More...
 
void DListVoidDeleteNode (DListVoid_T *pHead, DListVoidNode_T *pNode)
 Unlink node from the dlist and delete the node and it's attached user data. More...
 
void DListVoidDeleteNodeAt (DListVoid_T *pHead, int iIndex)
 Unlink the node from the dlist at the given index and delete it and it's attached user data. More...
 
DListVoidNode_TDListVoidUnlinkNodeAt (DListVoid_T *pHead, int iIndex)
 Unlink the node from the dlist at the given index. More...
 
void * DListVoidUnlinkDataAt (DListVoid_T *pHead, int iIndex)
 Unlink the user data from the dlist at the given index. More...
 
DListVoidNode_TDListVoidAppend (DListVoid_T *pHead, void *pData)
 Attach user data to a new node and link to the end of dlist. More...
 
DListVoidNode_TDListVoidPrepend (DListVoid_T *pHead, void *pData)
 Attach the user data to a new node and link to the start of dlist. More...
 
DListVoidNode_TDListVoidInsert (DListVoid_T *pHead, int iIndex, void *pData)
 Attach the user data to a new node and insert before the dlist index. More...
 
void * DListVoidGetNodeAt (DListVoid_T *pHead, int iIndex)
 Get the node at the given dlist index. More...
 
void * DListVoidGetData (DListVoidNode_T *pNode)
 Get the user data from the given node. More...
 
void * DListVoidGetDataAt (DListVoid_T *pHead, int iIndex)
 Get the user data from the dlist at the given index. More...
 
int DListVoidCount (DListVoid_T *pHead)
 Get the number of nodes in dlist. More...
 
DListVoidNode_TDListVoidIterNodeFirst (DListVoid_T *pHead, DListVoidIter_T *pIter)
 Initialize dlist iterator and return the first node in dlist. More...
 
DListVoidNode_TDListVoidIterNodeNext (DListVoidIter_T *pIter)
 Get the next iterated node in dlist. More...
 
DListVoidNode_TDListVoidIterNodeLast (DListVoid_T *pHead, DListVoidIter_T *pIter)
 Initialize dlist iterator and return the last node in dlist. More...
 
DListVoidNode_TDListVoidIterNodePrev (DListVoidIter_T *pIter)
 Get the previous iterated node in dlist. More...
 
DListVoidNode_TDListVoidFindNode (DListVoid_T *pHead, const void *pData)
 Find the first node with the matching data. More...
 
void DListVoidPrint (DListVoid_T *pHead, DListVoidFuncDataPrint_T fnDataPr, FILE *fp)
 Traverse dlist and print. More...
 

Detailed Description

Doubly linked list (dlist) of void pointers definitions.

Author
Robin Knight (robin.nosp@m..kni.nosp@m.ght@r.nosp@m.oadn.nosp@m.arrow.nosp@m.s.co.nosp@m.m)
EULA
See the README and EULA files for any copyright and licensing information.

Definition in file dlistvoid.c.

Macro Definition Documentation

#define DLISTVOID_ENTRY (   dnode)    dlist_entry(dnode, DListVoidNode_T, m_dnode)

Get embedding node DListVoidNode_T.

Parameters
dnodednode_t *
Returns
DListVoidNode_T* 'pointed to' by dnode_t*

Definition at line 75 of file dlistvoid.c.

Referenced by DListVoidDeleteAllNodes(), DListVoidFindNode(), DListVoidGetNodeAt(), DListVoidIterNodeFirst(), DListVoidIterNodeLast(), DListVoidIterNodeNext(), DListVoidIterNodePrev(), and DListVoidPrint().

#define DLISTVOID_IS_EMPTY (   dvoidhead)    dlist_is_empty(&((dvoidhead)->m_dnodeHead))

Test if DListVoid_T* holds the empty list.

Parameters
dvoidheaddnode_t *
Returns
True (non-zero) if list is empty, 0 otherwise.

Definition at line 82 of file dlistvoid.c.

Referenced by DListVoidDeleteNode(), DListVoidIterNodeFirst(), and DListVoidIterNodeLast().

#define DLISTVOID_IS_EOL (   dvoidhead,
  pdnode 
)    ((pdnode) == &((dvoidhead)->m_dnodeHead))

Test if node is at end-of-list.

Parameters
dvoidheaddnode_t *
pdnodednode_t *
Returns
True (non-zero) if at end-of-list, 0 otherwise.

Definition at line 91 of file dlistvoid.c.

Referenced by DListVoidIterNodeNext(), and DListVoidIterNodePrev().

Function Documentation

DListVoidNode_T* DListVoidAppend ( DListVoid_T pHead,
void *  pData 
)

Attach user data to a new node and link to the end of dlist.

Parameters
pHeadPointer to dlist (head).
pDataPointer to user (allocated) data.
Returns
Returns pointer to new node on success, NULL on failure.

Definition at line 325 of file dlistvoid.c.

References _TPTR, CHKPTR, dlist_append(), LOGDIAG4, LOGDIAG4CALL, dlistvoid_node_t::m_dnode, dlistvoid_head_t::m_dnodeHead, dlistvoid_head_t::m_nNumNodes, dlistvoid_node_t::m_pData, NEW, and NULL.

Referenced by DListVoidInsert(), DListVoidIterDataNext(), and DListVoidQueue().

326 {
327  DListVoidNode_T *pNode;
328 
329  LOGDIAG4CALL(_TPTR(pHead), _TPTR(pData));
330 
331  CHKPTR(pHead, NULL);
332 
333  // allocate node
334  pNode = NEW(DListVoidNode_T);
335 
336  // attach data
337  pNode->m_pData = pData;
338 
339  // insert into list
340  dlist_append(&pNode->m_dnode, &pHead->m_dnodeHead);
341 
342  pHead->m_nNumNodes++;
343 
344  LOGDIAG4(_TPTR(pNode));
345 
346  return pNode;
347 }
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
#define NULL
null pointer
Definition: rnrconfig.h:199
dnode_t m_dnode
dlist pointers
Definition: dlistvoid.c:61
#define LOGDIAG4(fmt,...)
Standard Diagnostic Level 4 logging.
Definition: log.h:386
static void dlist_append(dnode_t *node, dnode_t *head)
append a new node to the in of the list
Definition: dlist.h:123
#define NEW(T)
Allocate new type.
Definition: new.h:49
#define _TPTR(var)
pointer
Definition: log.h:587
#define LOGDIAG4CALL(...)
Standard Diagnostic Level 4 function call tracing.
Definition: log.h:442
Doubly linked list node structure.
Definition: dlistvoid.c:59
int m_nNumNodes
number of nodes in dlist
Definition: dlistvoid.c:51
void * m_pData
user data
Definition: dlistvoid.c:62
dnode_t m_dnodeHead
head of dlist
Definition: dlistvoid.c:50
int DListVoidCount ( DListVoid_T pHead)

Get the number of nodes in dlist.

Parameters
pHeadPointer to dlist (head).
Returns
Number of nodes in dlist.

Definition at line 517 of file dlistvoid.c.

References dlistvoid_head_t::m_nNumNodes, and NULL.

Referenced by DListVoidInsert(), and DListVoidIterDataNext().

518 {
519  return pHead == NULL? 0: pHead->m_nNumNodes;
520 }
#define NULL
null pointer
Definition: rnrconfig.h:199
int m_nNumNodes
number of nodes in dlist
Definition: dlistvoid.c:51
void DListVoidDelete ( DListVoid_T pHead)

Delete entire dlist.

All user data are deleted with a per node callback to the user-supplied data delete function, if any. All nodes in the dlist and the dlist itself will be deleted. The dlist pointer will no longer be valid after this call.

Parameters
pHeadPointer to dlist (head).

Definition at line 140 of file dlistvoid.c.

References _TPTR, DListVoidDeleteAllNodes(), LOGDIAG4CALL, and NULL.

Referenced by DListVoidIterDataNext().

141 {
142  LOGDIAG4CALL(_TPTR(pHead));
143 
144  if( pHead == NULL )
145  {
146  return;
147  }
148 
150  delete(pHead);
151 }
#define NULL
null pointer
Definition: rnrconfig.h:199
void DListVoidDeleteAllNodes(DListVoid_T *pHead)
Unlink and delete all nodes and data from dlist, leaving dlist empty.
Definition: dlistvoid.c:161
#define _TPTR(var)
pointer
Definition: log.h:587
#define LOGDIAG4CALL(...)
Standard Diagnostic Level 4 function call tracing.
Definition: log.h:442
void DListVoidDeleteAllNodes ( DListVoid_T pHead)

Unlink and delete all nodes and data from dlist, leaving dlist empty.

User data are deleted with a per node callback to the user-supplied data delete function, if any.

Parameters
pHeadPointer to dlist (head).

Definition at line 161 of file dlistvoid.c.

References _TPTR, dlist_for_each_safe, DLISTVOID_ENTRY, DListVoidDeleteNode(), LOGDIAG4CALL, dlistvoid_head_t::m_dnodeHead, and NULL.

Referenced by DListVoidDelete(), DListVoidIterDataNext(), and DListVoidPrint().

162 {
163  dnode_t *p, *q, *head;
164 
165  LOGDIAG4CALL(_TPTR(pHead));
166 
167  if( pHead == NULL )
168  {
169  return;
170  }
171 
172  head = &(pHead->m_dnodeHead);
173 
174  dlist_for_each_safe(p, q, head)
175  {
177  }
178 }
#define NULL
null pointer
Definition: rnrconfig.h:199
The doubly linked node structure.
Definition: dlist.h:57
void DListVoidDeleteNode(DListVoid_T *pHead, DListVoidNode_T *pNode)
Unlink node from the dlist and delete the node and it&#39;s attached user data.
Definition: dlistvoid.c:190
#define dlist_for_each_safe(pos, npos, head)
safely iterate over a list
Definition: dlist.h:225
#define DLISTVOID_ENTRY(dnode)
Get embedding node DListVoidNode_T.
Definition: dlistvoid.c:75
#define _TPTR(var)
pointer
Definition: log.h:587
#define LOGDIAG4CALL(...)
Standard Diagnostic Level 4 function call tracing.
Definition: log.h:442
dnode_t m_dnodeHead
head of dlist
Definition: dlistvoid.c:50
void DListVoidDeleteNode ( DListVoid_T pHead,
DListVoidNode_T pNode 
)

Unlink node from the dlist and delete the node and it's attached user data.

User data are deleted with a callback to the user-supplied data delete function, if any.

Parameters
pHeadPointer to dlist (head).
pNodePointer to node to be deleted.

Definition at line 190 of file dlistvoid.c.

References _TPTR, CHKPTR, dlist_delete(), DLISTVOID_IS_EMPTY, LOGDIAG4CALL, LOGERROR, dlistvoid_node_t::m_dnode, dlistvoid_head_t::m_fnDataDelete, dlistvoid_head_t::m_nNumNodes, dlistvoid_node_t::m_pData, and NULL.

Referenced by DListVoidDeleteAllNodes(), DListVoidDeleteNodeAt(), DListVoidIterDataNext(), and DListVoidPrint().

191 {
192  LOGDIAG4CALL(_TPTR(pHead), _TPTR(pNode));
193 
194  CHKPTR(pHead);
195  CHKPTR(pNode);
196 
197  if( DLISTVOID_IS_EMPTY(pHead) )
198  {
199  LOGERROR("dlist is empty");
200  return;
201  }
202 
203  // remove from list
204  dlist_delete(&pNode->m_dnode);
205 
206  // free any data by value
207  if( pHead->m_fnDataDelete != NULL )
208  {
209  pHead->m_fnDataDelete(pNode->m_pData);
210  }
211 
212  // free up node
213  delete(pNode);
214 
215  pHead->m_nNumNodes--;
216 }
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
#define NULL
null pointer
Definition: rnrconfig.h:199
dnode_t m_dnode
dlist pointers
Definition: dlistvoid.c:61
#define DLISTVOID_IS_EMPTY(dvoidhead)
Test if DListVoid_T* holds the empty list.
Definition: dlistvoid.c:82
static void dlist_delete(dnode_t *node)
deletes node from list
Definition: dlist.h:150
#define LOGERROR(fmt,...)
Standard Error logging.
Definition: log.h:488
DListVoidFuncDataDelete_T m_fnDataDelete
data delete function
Definition: dlistvoid.c:53
#define _TPTR(var)
pointer
Definition: log.h:587
#define LOGDIAG4CALL(...)
Standard Diagnostic Level 4 function call tracing.
Definition: log.h:442
int m_nNumNodes
number of nodes in dlist
Definition: dlistvoid.c:51
void * m_pData
user data
Definition: dlistvoid.c:62
void DListVoidDeleteNodeAt ( DListVoid_T pHead,
int  iIndex 
)

Unlink the node from the dlist at the given index and delete it and it's attached user data.

User data are deleted with a callback to the user-supplied data delete function, if any.

Parameters
pHeadPointer to dlist (head).
iIndexIndex to dlist entry to delete.

Definition at line 228 of file dlistvoid.c.

References _TINT, _TPTR, CHKPTR, DListVoidDeleteNode(), DListVoidGetNodeAt(), LOGDIAG4CALL, and NULL.

Referenced by DListVoidIterDataNext().

229 {
230  DListVoidNode_T *pNode;
231 
232  LOGDIAG4CALL(_TPTR(pHead), _TINT(iIndex));
233 
234  CHKPTR(pHead);
235 
236  // get node to delete
237  if( (pNode = DListVoidGetNodeAt(pHead, iIndex)) != NULL )
238  {
239  DListVoidDeleteNode(pHead, pNode);
240  }
241 }
#define _TINT(var)
int (decimal)
Definition: log.h:582
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
#define NULL
null pointer
Definition: rnrconfig.h:199
void DListVoidDeleteNode(DListVoid_T *pHead, DListVoidNode_T *pNode)
Unlink node from the dlist and delete the node and it&#39;s attached user data.
Definition: dlistvoid.c:190
#define _TPTR(var)
pointer
Definition: log.h:587
#define LOGDIAG4CALL(...)
Standard Diagnostic Level 4 function call tracing.
Definition: log.h:442
Doubly linked list node structure.
Definition: dlistvoid.c:59
void * DListVoidGetNodeAt(DListVoid_T *pHead, int iIndex)
Get the node at the given dlist index.
Definition: dlistvoid.c:442
DListVoidNode_T* DListVoidFindNode ( DListVoid_T pHead,
const void *  pData 
)

Find the first node with the matching data.

The user provided comparator function is used, if any.

Parameters
pHeadPointer to dlist (head).
pDataPointer to data to find.
Returns
Returns first node with mathcing data on success, NULL if no matches or on error.

Definition at line 645 of file dlistvoid.c.

References _TPTR, CHKPTR, dlist_for_each_safe, DLISTVOID_ENTRY, LOGDIAG4CALL, dlistvoid_head_t::m_dnodeHead, dlistvoid_head_t::m_fnDataCmp, dlistvoid_node_t::m_pData, and NULL.

Referenced by DListVoidIterDataNext().

646 {
647  dnode_t *p, *q, *head;
648  DListVoidNode_T *pNode;
649 
650  LOGDIAG4CALL(_TPTR(pHead), _TPTR(pData));
651 
652  CHKPTR(pHead, NULL);
653 
654  if( pHead->m_fnDataCmp == NULL )
655  {
656  return NULL;
657  }
658 
659  head = &(pHead->m_dnodeHead);
660 
661  dlist_for_each_safe(p, q, head)
662  {
663  pNode = DLISTVOID_ENTRY(p);
664  if( !pHead->m_fnDataCmp(pData, pNode->m_pData) )
665  {
666  return pNode;
667  }
668  }
669  return NULL;
670 }
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
#define NULL
null pointer
Definition: rnrconfig.h:199
The doubly linked node structure.
Definition: dlist.h:57
#define dlist_for_each_safe(pos, npos, head)
safely iterate over a list
Definition: dlist.h:225
#define DLISTVOID_ENTRY(dnode)
Get embedding node DListVoidNode_T.
Definition: dlistvoid.c:75
#define _TPTR(var)
pointer
Definition: log.h:587
#define LOGDIAG4CALL(...)
Standard Diagnostic Level 4 function call tracing.
Definition: log.h:442
Doubly linked list node structure.
Definition: dlistvoid.c:59
DListVoidFuncDataCmp_T m_fnDataCmp
data compare function
Definition: dlistvoid.c:52
void * m_pData
user data
Definition: dlistvoid.c:62
dnode_t m_dnodeHead
head of dlist
Definition: dlistvoid.c:50
void* DListVoidGetData ( DListVoidNode_T pNode)

Get the user data from the given node.

Parameters
pNodePointer to node with data.
Returns
Returns void* to user data on success, NULL on failure.

Definition at line 483 of file dlistvoid.c.

References dlistvoid_node_t::m_pData, and NULL.

Referenced by DListVoidGetDataAt(), DListVoidIterDataFirst(), DListVoidIterDataNext(), and DListVoidPrint().

484 {
485  return pNode == NULL? NULL: pNode->m_pData;
486 }
#define NULL
null pointer
Definition: rnrconfig.h:199
void * m_pData
user data
Definition: dlistvoid.c:62
void* DListVoidGetDataAt ( DListVoid_T pHead,
int  iIndex 
)

Get the user data from the dlist at the given index.

Parameters
pHeadPointer to dlist (head).
iIndexIndex to dlist entry.
Returns
Returns void* to user data on success, NULL on failure.

Definition at line 496 of file dlistvoid.c.

References DListVoidGetData(), DListVoidGetNodeAt(), and NULL.

Referenced by DListVoidIterDataNext().

497 {
498  DListVoidNode_T *pNode;
499 
500  if( (pNode = DListVoidGetNodeAt(pHead, iIndex)) != NULL )
501  {
502  return DListVoidGetData(pNode);
503  }
504  else
505  {
506  return NULL;
507  }
508 }
void * DListVoidGetData(DListVoidNode_T *pNode)
Get the user data from the given node.
Definition: dlistvoid.c:483
#define NULL
null pointer
Definition: rnrconfig.h:199
Doubly linked list node structure.
Definition: dlistvoid.c:59
void * DListVoidGetNodeAt(DListVoid_T *pHead, int iIndex)
Get the node at the given dlist index.
Definition: dlistvoid.c:442
void* DListVoidGetNodeAt ( DListVoid_T pHead,
int  iIndex 
)

Get the node at the given dlist index.

Parameters
pHeadPointer to dlist (head).
iIndexIndex to dlist entry to find.
Returns
Returns node at index on success, NULL on failure.

Definition at line 442 of file dlistvoid.c.

References _TINT, _TPTR, CHKPTR, dlist_for_each_safe, DLIST_INSERT_AT_END, DLISTVOID_ENTRY, LOGDIAG4CALL, LOGERROR, dlistvoid_head_t::m_dnodeHead, dlistvoid_head_t::m_nNumNodes, and NULL.

Referenced by DListVoidDeleteNodeAt(), DListVoidGetDataAt(), DListVoidInsert(), DListVoidIterDataNext(), DListVoidUnlinkDataAt(), and DListVoidUnlinkNodeAt().

443 {
444  int nCnt;
445  dnode_t *p, *q, *head;
446 
447  LOGDIAG4CALL(_TPTR(pHead), _TINT(iIndex));
448 
449  CHKPTR(pHead, NULL);
450 
451  nCnt = pHead->m_nNumNodes;
452 
453  if( iIndex == DLIST_INSERT_AT_END )
454  {
455  iIndex = nCnt - 1;
456  }
457 
458  if( (iIndex < 0) || (iIndex >= nCnt) )
459  {
460  LOGERROR("%d index is out of range", iIndex);
461  }
462 
463  head = &(pHead->m_dnodeHead);
464 
465  dlist_for_each_safe(p, q, head)
466  {
467  if( iIndex-- == 0 )
468  {
469  return DLISTVOID_ENTRY(p);
470  }
471  }
472 
473  return NULL;
474 }
#define _TINT(var)
int (decimal)
Definition: log.h:582
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
#define NULL
null pointer
Definition: rnrconfig.h:199
The doubly linked node structure.
Definition: dlist.h:57
#define DLIST_INSERT_AT_END
Special dlist index value to insert before end-of-list.
Definition: dlistvoid.h:133
#define LOGERROR(fmt,...)
Standard Error logging.
Definition: log.h:488
#define dlist_for_each_safe(pos, npos, head)
safely iterate over a list
Definition: dlist.h:225
#define DLISTVOID_ENTRY(dnode)
Get embedding node DListVoidNode_T.
Definition: dlistvoid.c:75
#define _TPTR(var)
pointer
Definition: log.h:587
#define LOGDIAG4CALL(...)
Standard Diagnostic Level 4 function call tracing.
Definition: log.h:442
int m_nNumNodes
number of nodes in dlist
Definition: dlistvoid.c:51
dnode_t m_dnodeHead
head of dlist
Definition: dlistvoid.c:50
DListVoidNode_T* DListVoidInsert ( DListVoid_T pHead,
int  iIndex,
void *  pData 
)

Attach the user data to a new node and insert before the dlist index.

The special index value DLIST_INSERT_AT_END will insert at end-of-list (append).

Parameters
pHeadPointer to dlist (head).
iIndexIndex to dlist entry where insertion occurs.
pDataPointer to user (allocated) data.
Returns
Returns pointer to new node on success, NULL on failure.

Definition at line 393 of file dlistvoid.c.

References _dlist_add(), _TINT, _TPTR, CHKPTR, DLIST_INSERT_AT_END, DListVoidAppend(), DListVoidCount(), DListVoidGetNodeAt(), DListVoidPrepend(), LOGDIAG4, LOGDIAG4CALL, dlistvoid_node_t::m_dnode, dlistvoid_head_t::m_nNumNodes, dlistvoid_node_t::m_pData, NEW, NULL, and dlist_node::prev.

Referenced by DListVoidIterDataNext().

394 {
395  DListVoidNode_T *pNext;
396  DListVoidNode_T *pNode;
397 
398  LOGDIAG4CALL(_TPTR(pHead), _TINT(iIndex), _TPTR(pData));
399 
400  CHKPTR(pHead, NULL);
401 
402  if( iIndex == 0 )
403  {
404  return DListVoidPrepend(pHead, pData);
405  }
406  else if( (iIndex == DLIST_INSERT_AT_END) ||
407  (iIndex == DListVoidCount(pHead)) )
408  {
409  return DListVoidAppend(pHead, pData);
410  }
411 
412  // get insertion point
413  if( (pNext = DListVoidGetNodeAt(pHead, iIndex)) == NULL )
414  {
415  return NULL;
416  }
417 
418  // allocate node
419  pNode = NEW(DListVoidNode_T);
420 
421  // attach data
422  pNode->m_pData = pData;
423 
424  // insert into list
425  _dlist_add(&pNode->m_dnode, pNext->m_dnode.prev, &pNext->m_dnode);
426 
427  pHead->m_nNumNodes++;
428 
429  LOGDIAG4(_TPTR(pNode));
430 
431  return pNode;
432 }
#define _TINT(var)
int (decimal)
Definition: log.h:582
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
#define NULL
null pointer
Definition: rnrconfig.h:199
dnode_t m_dnode
dlist pointers
Definition: dlistvoid.c:61
DListVoidNode_T * DListVoidPrepend(DListVoid_T *pHead, void *pData)
Attach the user data to a new node and link to the start of dlist.
Definition: dlistvoid.c:357
DListVoidNode_T * DListVoidAppend(DListVoid_T *pHead, void *pData)
Attach user data to a new node and link to the end of dlist.
Definition: dlistvoid.c:325
#define DLIST_INSERT_AT_END
Special dlist index value to insert before end-of-list.
Definition: dlistvoid.h:133
#define LOGDIAG4(fmt,...)
Standard Diagnostic Level 4 logging.
Definition: log.h:386
#define NEW(T)
Allocate new type.
Definition: new.h:49
int DListVoidCount(DListVoid_T *pHead)
Get the number of nodes in dlist.
Definition: dlistvoid.c:517
struct dlist_node * prev
previous node in dlist
Definition: dlist.h:60
#define _TPTR(var)
pointer
Definition: log.h:587
#define LOGDIAG4CALL(...)
Standard Diagnostic Level 4 function call tracing.
Definition: log.h:442
Doubly linked list node structure.
Definition: dlistvoid.c:59
int m_nNumNodes
number of nodes in dlist
Definition: dlistvoid.c:51
static void _dlist_add(dnode_t *node, dnode_t *prev, dnode_t *next)
insert a new entry between two known consecutive entries
Definition: dlist.h:92
void * DListVoidGetNodeAt(DListVoid_T *pHead, int iIndex)
Get the node at the given dlist index.
Definition: dlistvoid.c:442
void * m_pData
user data
Definition: dlistvoid.c:62
DListVoidNode_T* DListVoidIterNodeFirst ( DListVoid_T pHead,
DListVoidIter_T pIter 
)

Initialize dlist iterator and return the first node in dlist.

Parameters
pHeadPointer to dlist (head).
pIterPointer to iterator.
Returns
Returns first node in dlist on success, NULL if dlist empty or on error.

Definition at line 531 of file dlistvoid.c.

References CHKPTR, DLISTVOID_ENTRY, DLISTVOID_IS_EMPTY, dlistvoid_head_t::m_dnodeHead, DListVoidIter_T::m_pHead, DListVoidIter_T::m_pNext, DListVoidIter_T::m_pThis, dlist_node::next, and NULL.

Referenced by DListVoidIterDataFirst(), and DListVoidIterDataNext().

533 {
534  CHKPTR(pHead, NULL);
535  CHKPTR(pIter, NULL);
536 
537  pIter->m_pHead = pHead;
538  pIter->m_pThis = pHead->m_dnodeHead.next;
539  pIter->m_pNext = ((dnode_t *)(pIter->m_pThis))->next;
540 
541  if( DLISTVOID_IS_EMPTY(pHead) )
542  {
543  return NULL;
544  }
545  else
546  {
547  return DLISTVOID_ENTRY(((dnode_t *)(pIter->m_pThis)));
548  }
549 }
void * m_pNext
pointer to next dnode
Definition: dlistvoid.h:170
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
#define NULL
null pointer
Definition: rnrconfig.h:199
void * m_pThis
pointer to current dnode
Definition: dlistvoid.h:169
The doubly linked node structure.
Definition: dlist.h:57
#define DLISTVOID_IS_EMPTY(dvoidhead)
Test if DListVoid_T* holds the empty list.
Definition: dlistvoid.c:82
struct dlist_node * next
next node in dlist
Definition: dlist.h:59
#define DLISTVOID_ENTRY(dnode)
Get embedding node DListVoidNode_T.
Definition: dlistvoid.c:75
dnode_t m_dnodeHead
head of dlist
Definition: dlistvoid.c:50
DListVoid_T * m_pHead
pointer to dlistvoid head
Definition: dlistvoid.h:168
DListVoidNode_T* DListVoidIterNodeLast ( DListVoid_T pHead,
DListVoidIter_T pIter 
)

Initialize dlist iterator and return the last node in dlist.

Parameters
pHeadPointer to dlist (head).
pIterPointer to iterator.
Returns
Returns last node in dlist on success, NULL if dlist empty or on error.

Definition at line 587 of file dlistvoid.c.

References CHKPTR, DLISTVOID_ENTRY, DLISTVOID_IS_EMPTY, dlistvoid_head_t::m_dnodeHead, DListVoidIter_T::m_pHead, DListVoidIter_T::m_pNext, DListVoidIter_T::m_pThis, NULL, and dlist_node::prev.

Referenced by DListVoidIterDataNext().

589 {
590  CHKPTR(pHead, NULL);
591  CHKPTR(pIter, NULL);
592 
593  pIter->m_pHead = pHead;
594  pIter->m_pThis = pHead->m_dnodeHead.prev;
595  pIter->m_pNext = ((dnode_t *)(pIter->m_pThis))->prev;
596 
597  if( DLISTVOID_IS_EMPTY(pHead) )
598  {
599  return NULL;
600  }
601  else
602  {
603  return DLISTVOID_ENTRY(((dnode_t *)(pIter->m_pThis)));
604  }
605 }
void * m_pNext
pointer to next dnode
Definition: dlistvoid.h:170
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
#define NULL
null pointer
Definition: rnrconfig.h:199
void * m_pThis
pointer to current dnode
Definition: dlistvoid.h:169
The doubly linked node structure.
Definition: dlist.h:57
#define DLISTVOID_IS_EMPTY(dvoidhead)
Test if DListVoid_T* holds the empty list.
Definition: dlistvoid.c:82
struct dlist_node * prev
previous node in dlist
Definition: dlist.h:60
#define DLISTVOID_ENTRY(dnode)
Get embedding node DListVoidNode_T.
Definition: dlistvoid.c:75
dnode_t m_dnodeHead
head of dlist
Definition: dlistvoid.c:50
DListVoid_T * m_pHead
pointer to dlistvoid head
Definition: dlistvoid.h:168
DListVoidNode_T* DListVoidIterNodeNext ( DListVoidIter_T pIter)

Get the next iterated node in dlist.

Parameters
pIterPointer to initialized iterator.
Returns
Returns next node in dlist on success, NULL if if at end of list or on error.

Definition at line 559 of file dlistvoid.c.

References CHKPTR, DLISTVOID_ENTRY, DLISTVOID_IS_EOL, DListVoidIter_T::m_pHead, DListVoidIter_T::m_pNext, DListVoidIter_T::m_pThis, and NULL.

Referenced by DListVoidIterDataNext().

560 {
561  CHKPTR(pIter, NULL);
562  CHKPTR(pIter->m_pHead, NULL);
563  CHKPTR(pIter->m_pNext, NULL);
564 
565  // end of list
566  if( DLISTVOID_IS_EOL(pIter->m_pHead, pIter->m_pNext) )
567  {
568  return NULL;
569  }
570  else
571  {
572  pIter->m_pThis = pIter->m_pNext;
573  pIter->m_pNext = ((dnode_t *)(pIter->m_pThis))->next;
574  return DLISTVOID_ENTRY(((dnode_t *)(pIter->m_pThis)));
575  }
576 }
void * m_pNext
pointer to next dnode
Definition: dlistvoid.h:170
#define DLISTVOID_IS_EOL(dvoidhead, pdnode)
Test if node is at end-of-list.
Definition: dlistvoid.c:91
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
#define NULL
null pointer
Definition: rnrconfig.h:199
void * m_pThis
pointer to current dnode
Definition: dlistvoid.h:169
The doubly linked node structure.
Definition: dlist.h:57
#define DLISTVOID_ENTRY(dnode)
Get embedding node DListVoidNode_T.
Definition: dlistvoid.c:75
DListVoid_T * m_pHead
pointer to dlistvoid head
Definition: dlistvoid.h:168
DListVoidNode_T* DListVoidIterNodePrev ( DListVoidIter_T pIter)

Get the previous iterated node in dlist.

Parameters
pIterPointer to initialized iterator.
Returns
Returns previous node in dlist on success, NULL if if at end of list or on error.

Definition at line 615 of file dlistvoid.c.

References CHKPTR, DLISTVOID_ENTRY, DLISTVOID_IS_EOL, DListVoidIter_T::m_pHead, DListVoidIter_T::m_pNext, DListVoidIter_T::m_pThis, and NULL.

Referenced by DListVoidIterDataNext().

616 {
617  CHKPTR(pIter, NULL);
618  CHKPTR(pIter->m_pHead, NULL);
619  CHKPTR(pIter->m_pNext, NULL);
620 
621  // end of list
622  if( DLISTVOID_IS_EOL(pIter->m_pHead, pIter->m_pNext) )
623  {
624  return NULL;
625  }
626  else
627  {
628  pIter->m_pThis = pIter->m_pNext;
629  pIter->m_pNext = ((dnode_t *)(pIter->m_pThis))->prev;
630  return DLISTVOID_ENTRY(((dnode_t *)(pIter->m_pThis)));
631  }
632 }
void * m_pNext
pointer to next dnode
Definition: dlistvoid.h:170
#define DLISTVOID_IS_EOL(dvoidhead, pdnode)
Test if node is at end-of-list.
Definition: dlistvoid.c:91
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
#define NULL
null pointer
Definition: rnrconfig.h:199
void * m_pThis
pointer to current dnode
Definition: dlistvoid.h:169
The doubly linked node structure.
Definition: dlist.h:57
#define DLISTVOID_ENTRY(dnode)
Get embedding node DListVoidNode_T.
Definition: dlistvoid.c:75
DListVoid_T * m_pHead
pointer to dlistvoid head
Definition: dlistvoid.h:168
DListVoid_T* DListVoidNew ( DListVoidFuncDataCmp_T  fnDataCmp,
DListVoidFuncDataDelete_T  fnDataDelete 
)

Allocate and initialize new empty dlist.

Parameters
fnDataCmpUser-supplied data comparator function. NULL will disable some functions such as searches.
fnDataDeleteUser-supplied data deallocator. NULL will cause user data not to be deleted.
Returns
Returns pointer to new dlist (head) on success.

Definition at line 110 of file dlistvoid.c.

References _TPTR, DLIST_NODE_INIT, LOGDIAG4, LOGDIAG4CALL, dlistvoid_head_t::m_dnodeHead, dlistvoid_head_t::m_fnDataCmp, dlistvoid_head_t::m_fnDataDelete, dlistvoid_head_t::m_nNumNodes, and NEW.

Referenced by DListVoidIterDataNext(), and DListVoidPrint().

112 {
113  DListVoid_T *pHead;
114 
115  LOGDIAG4CALL(_TPTR(fnDataCmp), _TPTR(fnDataDelete));
116 
117  // allocate head
118  pHead = NEW(DListVoid_T);
119 
120  // initialize data
122  pHead->m_nNumNodes = 0;
123  pHead->m_fnDataCmp = fnDataCmp;
124  pHead->m_fnDataDelete = fnDataDelete;
125 
126  LOGDIAG4(_TPTR(pHead));
127 
128  return pHead;
129 }
#define DLIST_NODE_INIT(node)
Initialize node links.
Definition: dlist.h:74
#define LOGDIAG4(fmt,...)
Standard Diagnostic Level 4 logging.
Definition: log.h:386
#define NEW(T)
Allocate new type.
Definition: new.h:49
DListVoidFuncDataDelete_T m_fnDataDelete
data delete function
Definition: dlistvoid.c:53
Unit Tests (define to build test main)
Definition: dlistvoid.c:48
#define _TPTR(var)
pointer
Definition: log.h:587
#define LOGDIAG4CALL(...)
Standard Diagnostic Level 4 function call tracing.
Definition: log.h:442
int m_nNumNodes
number of nodes in dlist
Definition: dlistvoid.c:51
DListVoidFuncDataCmp_T m_fnDataCmp
data compare function
Definition: dlistvoid.c:52
dnode_t m_dnodeHead
head of dlist
Definition: dlistvoid.c:50
DListVoidNode_T* DListVoidPrepend ( DListVoid_T pHead,
void *  pData 
)

Attach the user data to a new node and link to the start of dlist.

Parameters
pHeadPointer to dlist (head).
pDataPointer to user (allocated) data.
Returns
Returns pointer to new node on success, NULL on failure.

Definition at line 357 of file dlistvoid.c.

References _TPTR, CHKPTR, dlist_prepend(), LOGDIAG4, LOGDIAG4CALL, dlistvoid_node_t::m_dnode, dlistvoid_head_t::m_dnodeHead, dlistvoid_head_t::m_nNumNodes, dlistvoid_node_t::m_pData, NEW, and NULL.

Referenced by DListVoidInsert(), DListVoidIterDataNext(), and DListVoidPush().

358 {
359  DListVoidNode_T *pNode;
360 
361  LOGDIAG4CALL(_TPTR(pHead), _TPTR(pData));
362 
363  CHKPTR(pHead, NULL);
364 
365  // allocate node
366  pNode = NEW(DListVoidNode_T);
367 
368  // attach data
369  pNode->m_pData = pData;
370 
371  // insert into list
372  dlist_prepend(&pNode->m_dnode, &pHead->m_dnodeHead);
373 
374  pHead->m_nNumNodes++;
375 
376  LOGDIAG4(_TPTR(pNode));
377 
378  return pNode;
379 }
static void dlist_prepend(dnode_t *node, dnode_t *head)
prepend new node to head of list
Definition: dlist.h:109
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
#define NULL
null pointer
Definition: rnrconfig.h:199
dnode_t m_dnode
dlist pointers
Definition: dlistvoid.c:61
#define LOGDIAG4(fmt,...)
Standard Diagnostic Level 4 logging.
Definition: log.h:386
#define NEW(T)
Allocate new type.
Definition: new.h:49
#define _TPTR(var)
pointer
Definition: log.h:587
#define LOGDIAG4CALL(...)
Standard Diagnostic Level 4 function call tracing.
Definition: log.h:442
Doubly linked list node structure.
Definition: dlistvoid.c:59
int m_nNumNodes
number of nodes in dlist
Definition: dlistvoid.c:51
void * m_pData
user data
Definition: dlistvoid.c:62
dnode_t m_dnodeHead
head of dlist
Definition: dlistvoid.c:50
void DListVoidPrint ( DListVoid_T pHead,
DListVoidFuncDataPrint_T  fnDataPr,
FILE *  fp 
)

Traverse dlist and print.

Parameters
pHeadPointer to dlist (head).
fnDataPrUser data printing fucntion.
fpOutput file pointer

Definition at line 679 of file dlistvoid.c.

References dlist_for_each_safe, DLISTVOID_ENTRY, DListVoidDeleteAllNodes(), DListVoidDeleteNode(), DListVoidGetData(), DListVoidNew(), dlistvoid_head_t::m_dnodeHead, dlistvoid_node_t::m_pData, and NULL.

Referenced by DListVoidIterDataNext().

681 {
682  dnode_t *p, *q, *head;
683  DListVoidNode_T *pNode;
684  int n;
685 
686  head = &(pHead->m_dnodeHead);
687  n = 0;
688 
689  dlist_for_each_safe(p, q, head)
690  {
691  pNode = DLISTVOID_ENTRY(p);
692  fprintf(fp, "Node %2d: ", n);
693  fnDataPr(fp, pNode->m_pData);
694  fprintf(fp, "\n");
695  ++n;
696  }
697 }
The doubly linked node structure.
Definition: dlist.h:57
#define dlist_for_each_safe(pos, npos, head)
safely iterate over a list
Definition: dlist.h:225
#define DLISTVOID_ENTRY(dnode)
Get embedding node DListVoidNode_T.
Definition: dlistvoid.c:75
Doubly linked list node structure.
Definition: dlistvoid.c:59
void * m_pData
user data
Definition: dlistvoid.c:62
dnode_t m_dnodeHead
head of dlist
Definition: dlistvoid.c:50
void* DListVoidUnlinkDataAt ( DListVoid_T pHead,
int  iIndex 
)

Unlink the user data from the dlist at the given index.

The node is deleted, but not the attached data.

Parameters
pHeadPointer to dlist (head).
iIndexIndex to dlist entry to unlink.
Returns
Returns void* to user data on success, NULL on failure.

Definition at line 287 of file dlistvoid.c.

References _TINT, _TPTR, CHKPTR, dlist_delete(), DListVoidGetNodeAt(), LOGDIAG4CALL, dlistvoid_node_t::m_dnode, dlistvoid_head_t::m_nNumNodes, dlistvoid_node_t::m_pData, and NULL.

Referenced by DListVoidDequeue(), DListVoidIterDataNext(), and DListVoidPop().

288 {
289  DListVoidNode_T *pNode;
290  void *pData;
291 
292  LOGDIAG4CALL(_TPTR(pHead), _TINT(iIndex));
293 
294  CHKPTR(pHead, NULL);
295 
296  // get node to delete
297  if( (pNode = DListVoidGetNodeAt(pHead, iIndex)) != NULL )
298  {
299  pData = pNode->m_pData;
300 
301  // remove from list
302  dlist_delete(&pNode->m_dnode);
303 
304  // free up node, but not the data
305  delete(pNode);
306 
307  pHead->m_nNumNodes--;
308 
309  return pData;
310  }
311  else
312  {
313  return NULL;
314  }
315 }
#define _TINT(var)
int (decimal)
Definition: log.h:582
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
#define NULL
null pointer
Definition: rnrconfig.h:199
dnode_t m_dnode
dlist pointers
Definition: dlistvoid.c:61
static void dlist_delete(dnode_t *node)
deletes node from list
Definition: dlist.h:150
#define _TPTR(var)
pointer
Definition: log.h:587
#define LOGDIAG4CALL(...)
Standard Diagnostic Level 4 function call tracing.
Definition: log.h:442
Doubly linked list node structure.
Definition: dlistvoid.c:59
int m_nNumNodes
number of nodes in dlist
Definition: dlistvoid.c:51
void * DListVoidGetNodeAt(DListVoid_T *pHead, int iIndex)
Get the node at the given dlist index.
Definition: dlistvoid.c:442
void * m_pData
user data
Definition: dlistvoid.c:62
DListVoidNode_T* DListVoidUnlinkNodeAt ( DListVoid_T pHead,
int  iIndex 
)

Unlink the node from the dlist at the given index.

The node and it's attached data are not deleted.

Parameters
pHeadPointer to dlist (head).
iIndexIndex to dlist entry to unlink.
Returns
Returns pointer to unlinked node on success, NULL on failure.

Definition at line 253 of file dlistvoid.c.

References _TINT, _TPTR, CHKPTR, dlist_delete(), DListVoidGetNodeAt(), LOGDIAG4CALL, dlistvoid_node_t::m_dnode, dlistvoid_head_t::m_nNumNodes, and NULL.

Referenced by DListVoidIterDataNext().

254 {
255  DListVoidNode_T *pNode;
256 
257  LOGDIAG4CALL(_TPTR(pHead), _TINT(iIndex));
258 
259  CHKPTR(pHead, NULL);
260 
261  // get node to delete
262  if( (pNode = DListVoidGetNodeAt(pHead, iIndex)) != NULL )
263  {
264  // remove from list
265  dlist_delete(&pNode->m_dnode);
266 
267  pHead->m_nNumNodes--;
268 
269  return pNode;
270  }
271  else
272  {
273  return NULL;
274  }
275 }
#define _TINT(var)
int (decimal)
Definition: log.h:582
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
#define NULL
null pointer
Definition: rnrconfig.h:199
dnode_t m_dnode
dlist pointers
Definition: dlistvoid.c:61
static void dlist_delete(dnode_t *node)
deletes node from list
Definition: dlist.h:150
#define _TPTR(var)
pointer
Definition: log.h:587
#define LOGDIAG4CALL(...)
Standard Diagnostic Level 4 function call tracing.
Definition: log.h:442
Doubly linked list node structure.
Definition: dlistvoid.c:59
int m_nNumNodes
number of nodes in dlist
Definition: dlistvoid.c:51
void * DListVoidGetNodeAt(DListVoid_T *pHead, int iIndex)
Get the node at the given dlist index.
Definition: dlistvoid.c:442