Basic linked list operation definitions. 
 | 
      The sort macro is an adaptation of Simon Tatham's O(n log(n)) mergesort
     Unwieldy variable names used here to avoid shadowing passed-in variables.
  | 
| 
#define  | LL_SORT(list,  cmp)   LL_SORT2(list, cmp, next) | 
|   | 
| 
#define  | LL_SORT2(list,  cmp,  next) | 
|   | 
| 
#define  | DL_SORT(list,  cmp)   DL_SORT2(list, cmp, prev, next) | 
|   | 
| 
#define  | DL_SORT2(list,  cmp,  prev,  next) | 
|   | 
| 
#define  | CDL_SORT(list,  cmp)   CDL_SORT2(list, cmp, prev, next) | 
|   | 
| 
#define  | CDL_SORT2(list,  cmp,  prev,  next) | 
|   | 
 | 
| 
#define  | LL_PREPEND(head,  add)   LL_PREPEND2(head,add,next) | 
|   | LL prepend element 'add' to list. 
  | 
|   | 
| #define  | LL_PREPEND2(head,  add,  next) | 
|   | LL prepend to list with alternative next ptr name 'next'.  More...
  | 
|   | 
| 
#define  | LL_CONCAT(head1,  head2)   LL_CONCAT2(head1,head2,next) | 
|   | LL concat to append second list to first. 
  | 
|   | 
| #define  | LL_CONCAT2(head1,  head2,  next) | 
|   | LL concat with alternative next ptr name 'next'.  More...
  | 
|   | 
| 
#define  | LL_APPEND(head,  add)   LL_APPEND2(head,add,next) | 
|   | LL append to append element 'add' to list. 
  | 
|   | 
| #define  | LL_APPEND2(head,  add,  next) | 
|   | LL append with alternative next ptr name 'next'.  More...
  | 
|   | 
| 
#define  | LL_DELETE(head,  del)   LL_DELETE2(head,del,next) | 
|   | LL delete element 'del' from list. 
  | 
|   | 
| #define  | LL_DELETE2(head,  del,  next) | 
|   | LL delete with alternative next ptr name 'name'.  More...
  | 
|   | 
| 
#define  | LL_APPEND_VS2008(head,  add)   LL_APPEND2_VS2008(head,add,next) | 
|   | 
| #define  | LL_APPEND2_VS2008(head,  add,  next) | 
|   | 
| 
#define  | LL_DELETE_VS2008(head,  del)   LL_DELETE2_VS2008(head,del,next) | 
|   | 
| #define  | LL_DELETE2_VS2008(head,  del,  next) | 
|   | 
| 
#define  | LL_COUNT(head,  el,  counter)   LL_COUNT2(head,el,counter,next)                                                            \ | 
|   | LL count list elements using 'counter'. 
  | 
|   | 
| #define  | LL_COUNT2(head,  el,  counter,  next) | 
|   | LL count with alternative next ptr name 'next'.  More...
  | 
|   | 
| 
#define  | LL_FOREACH(head,  el)   LL_FOREACH2(head,el,next) | 
|   | LL list iteration. 
  | 
|   | 
| 
#define  | LL_FOREACH2(head,  el,  next)   for(el=head;el;el=(el)->next) | 
|   | LL list iteration with alternative next ptr name 'next'. 
  | 
|   | 
| 
#define  | LL_FOREACH_SAFE(head,  el,  tmp)   LL_FOREACH_SAFE2(head,el,tmp,next) | 
|   | LL safe list iteration Use if list elements might be deleted while iterating. 
  | 
|   | 
| 
#define  | LL_FOREACH_SAFE2(head,  el,  tmp,  next)   for((el)=(head);(el) && (tmp = (el)->next, 1); (el) = tmp) | 
|   | LL safe list iteration with alternative ptr names. 
  | 
|   | 
| 
#define  | LL_SEARCH_SCALAR(head,  out,  field,  val)   LL_SEARCH_SCALAR2(head,out,field,val,next) | 
|   | LL scalar search for element with value 'val' for member 'field'. 
  | 
|   | 
| #define  | LL_SEARCH_SCALAR2(head,  out,  field,  val,  next) | 
|   | LL scalar search with alternative next ptr name 'next'.  More...
  | 
|   | 
| 
#define  | LL_SEARCH(head,  out,  elt,  cmp)   LL_SEARCH2(head,out,elt,cmp,next) | 
|   | LL search element 'elt' in list using function 'cmp'. 
  | 
|   | 
| #define  | LL_SEARCH2(head,  out,  elt,  cmp,  next) | 
|   | LL search with alternative next ptr name 'next'.  More...
  | 
|   | 
| #define  | LL_REPLACE_ELEM(head,  el,  add) | 
|   | LL replace element 'el' with element 'add' in list.  More...
  | 
|   | 
| #define  | LL_PREPEND_ELEM(head,  el,  add) | 
|   | LL prepend new element 'add' to element 'el' in list.  More...
  | 
|   | 
 | 
| 
#define  | DL_PREPEND(head,  add)   DL_PREPEND2(head,add,prev,next) | 
|   | DL prepend element 'add' to list. 
  | 
|   | 
| #define  | DL_PREPEND2(head,  add,  prev,  next) | 
|   | DL prepend to list with alternative ptr names.  More...
  | 
|   | 
| 
#define  | DL_APPEND(head,  add)   DL_APPEND2(head,add,prev,next) | 
|   | DL append to append element 'add' to list. 
  | 
|   | 
| #define  | DL_APPEND2(head,  add,  prev,  next) | 
|   | DL append with alternative next ptr name 'next'.  More...
  | 
|   | 
| 
#define  | DL_CONCAT(head1,  head2)   DL_CONCAT2(head1,head2,prev,next) | 
|   | DL concat to append second list to first. 
  | 
|   | 
| #define  | DL_CONCAT2(head1,  head2,  prev,  next) | 
|   | DL concat with alternative next ptr name 'next'.  More...
  | 
|   | 
| 
#define  | DL_DELETE(head,  del)   DL_DELETE2(head,del,prev,next) | 
|   | DL delete element 'del' from list. 
  | 
|   | 
| #define  | DL_DELETE2(head,  del,  prev,  next) | 
|   | DL delete with alternative ptr names.  More...
  | 
|   | 
| 
#define  | DL_COUNT(head,  el,  counter)   DL_COUNT2(head,el,counter,next)                                                            \ | 
|   | DL count list elements using 'counter'. 
  | 
|   | 
| #define  | DL_COUNT2(head,  el,  counter,  next) | 
|   | DL count with alternative next ptr name 'next'.  More...
  | 
|   | 
| 
#define  | DL_FOREACH(head,  el)   DL_FOREACH2(head,el,next) | 
|   | DL list iteration. 
  | 
|   | 
| 
#define  | DL_FOREACH2(head,  el,  next)   for(el=head;el;el=(el)->next) | 
|   | DL list iteration with alternative next ptr name 'next'. 
  | 
|   | 
| 
#define  | DL_FOREACH_SAFE(head,  el,  tmp)   DL_FOREACH_SAFE2(head,el,tmp,next) | 
|   | DL safe list iteration Use if list elements might be deleted while iterating. 
  | 
|   | 
| 
#define  | DL_FOREACH_SAFE2(head,  el,  tmp,  next)   for((el)=(head);(el) && (tmp = (el)->next, 1); (el) = tmp) | 
|   | DL safe list iteration with alternative ptr names. 
  | 
|   | 
| 
#define  | DL_SEARCH_SCALAR   LL_SEARCH_SCALAR | 
|   | DL scalar search for element with value 'val' for member 'field' Identical to singly-linked counterpart. 
  | 
|   | 
| 
#define  | DL_SEARCH_SCALAR2   LL_SEARCH_SCALAR2 | 
|   | DL scalar search with alternative next ptr name 'next' Identical to singly-linked counterpart. 
  | 
|   | 
| 
#define  | DL_SEARCH   LL_SEARCH | 
|   | DL search element 'elt' in list using function 'cmp' Identical to singly-linked counterpart. 
  | 
|   | 
| 
#define  | DL_SEARCH2   LL_SEARCH2 | 
|   | DL search with alternative next ptr name 'next' Identical to singly-linked counterpart. 
  | 
|   | 
| #define  | DL_REPLACE_ELEM(head,  el,  add) | 
|   | DL replace element 'el' with element 'add' in list.  More...
  | 
|   | 
| #define  | DL_PREPEND_ELEM(head,  el,  add) | 
|   | DL prepend new element 'add' to element 'el' in list.  More...
  | 
|   | 
 | 
| 
#define  | CDL_PREPEND(head,  add)   CDL_PREPEND2(head,add,prev,next) | 
|   | CDL prepend element 'add' to list. 
  | 
|   | 
| #define  | CDL_PREPEND2(head,  add,  prev,  next) | 
|   | CDL prepend to list with alternative ptr names.  More...
  | 
|   | 
| 
#define  | CDL_DELETE(head,  del)   CDL_DELETE2(head,del,prev,next) | 
|   | CDL delete element 'del' from list. 
  | 
|   | 
| #define  | CDL_DELETE2(head,  del,  prev,  next) | 
|   | CDL delete with alternative ptr names.  More...
  | 
|   | 
| 
#define  | CDL_COUNT(head,  el,  counter)   CDL_COUNT2(head,el,counter,next)                                                           \ | 
|   | CDL count list elements using 'counter'. 
  | 
|   | 
| #define  | CDL_COUNT2(head,  el,  counter,  next) | 
|   | CDL count with alternative next ptr name 'next'.  More...
  | 
|   | 
| 
#define  | CDL_FOREACH(head,  el)   CDL_FOREACH2(head,el,next) | 
|   | CDL list iteration. 
  | 
|   | 
| 
#define  | CDL_FOREACH2(head,  el,  next)   for(el=head;el;el=((el)->next==head ? 0L : (el)->next)) | 
|   | CDL list iteration with alternative next ptr name 'next'. 
  | 
|   | 
| 
#define  | CDL_FOREACH_SAFE(head,  el,  tmp1,  tmp2)   CDL_FOREACH_SAFE2(head,el,tmp1,tmp2,prev,next) | 
|   | CDL safe list iteration Use if list elements might be deleted while iterating. 
  | 
|   | 
| #define  | CDL_FOREACH_SAFE2(head,  el,  tmp1,  tmp2,  prev,  next) | 
|   | CDL safe list iteration with alternative ptr names.  More...
  | 
|   | 
| 
#define  | CDL_SEARCH_SCALAR(head,  out,  field,  val)   CDL_SEARCH_SCALAR2(head,out,field,val,next) | 
|   | CDL scalar search for element with value 'val' for member 'field'. 
  | 
|   | 
| #define  | CDL_SEARCH_SCALAR2(head,  out,  field,  val,  next) | 
|   | CDL scalar search with alternative next ptr name 'next'.  More...
  | 
|   | 
| 
#define  | CDL_SEARCH(head,  out,  elt,  cmp)   CDL_SEARCH2(head,out,elt,cmp,next) | 
|   | CDL search element 'elt' in list using function 'cmp'. 
  | 
|   | 
| #define  | CDL_SEARCH2(head,  out,  elt,  cmp,  next) | 
|   | CDL search with alternative next ptr name 'next'.  More...
  | 
|   | 
| #define  | CDL_REPLACE_ELEM(head,  el,  add) | 
|   | CDL replace element 'el' with element 'add' in list.  More...
  | 
|   | 
| #define  | CDL_PREPEND_ELEM(head,  el,  add) | 
|   | CDL prepend new element 'add' to element 'el' in list.  More...
  | 
|   |