Home | History | Annotate | Download | only in lib
      1 /* Copyright (C) 2001, 2002, 2003 Red Hat, Inc.
      2    Written by Ulrich Drepper <drepper (at) redhat.com>, 2001.
      3 
      4    This program is Open Source software; you can redistribute it and/or
      5    modify it under the terms of the Open Software License version 1.0 as
      6    published by the Open Source Initiative.
      7 
      8    You should have received a copy of the Open Software License along
      9    with this program; if not, you may obtain a copy of the Open Software
     10    License version 1.0 from http://www.opensource.org/licenses/osl.php or
     11    by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
     12    3001 King Ranch Road, Ukiah, CA 95482.   */
     13 
     14 #ifndef LIST_H
     15 #define LIST_H	1
     16 
     17 /* Add element to the end of a circular, double-linked list.  */
     18 #define CDBL_LIST_ADD_REAR(first, newp) \
     19   do {									      \
     20     __typeof (newp) _newp = (newp);					      \
     21     assert (_newp->next == NULL);					      \
     22     assert (_newp->previous == NULL);					      \
     23     if (unlikely ((first) == NULL))					      \
     24       (first) = _newp->next = _newp->previous = _newp;			      \
     25     else								      \
     26       {									      \
     27 	_newp->next = (first);						      \
     28 	_newp->previous = (first)->previous;				      \
     29 	_newp->previous->next = _newp->next->previous = _newp;		      \
     30       }									      \
     31   } while (0)
     32 
     33 /* Remove element from circular, double-linked list.  */
     34 #define CDBL_LIST_DEL(first, elem) \
     35   do {									      \
     36     __typeof (elem) _elem = (elem);					      \
     37     /* Check whether the element is indeed on the list.  */		      \
     38     assert (first != NULL && _elem != NULL				      \
     39 	    && (first != elem						      \
     40 		|| ({ __typeof (elem) _runp = first->next;		      \
     41 		      while (_runp != first)				      \
     42 			if (_runp == _elem)				      \
     43 			  break;					      \
     44 			else						      \
     45 		          _runp = _runp->next;				      \
     46 		      _runp == _elem; })));				      \
     47     if (unlikely (_elem->next == _elem))				      \
     48       first = NULL;							      \
     49     else								      \
     50       {									      \
     51 	_elem->next->previous = _elem->previous;			      \
     52 	_elem->previous->next = _elem->next;				      \
     53 	if (unlikely (first == _elem))					      \
     54 	  first = _elem->next;						      \
     55       }									      \
     56      assert ((_elem->next = _elem->previous = NULL, 1));		      \
     57   } while (0)
     58 
     59 
     60 /* Add element to the front of a single-linked list.  */
     61 #define SNGL_LIST_PUSH(first, newp) \
     62   do {									      \
     63     __typeof (newp) _newp = (newp);					      \
     64     assert (_newp->next == NULL);					      \
     65     _newp->next = first;						      \
     66     first = _newp;							      \
     67   } while (0)
     68 
     69 
     70 /* Add element to the rear of a circular single-linked list.  */
     71 #define CSNGL_LIST_ADD_REAR(first, newp) \
     72   do {									      \
     73     __typeof (newp) _newp = (newp);					      \
     74     assert (_newp->next == NULL);					      \
     75     if (unlikely ((first) == NULL))					      \
     76       (first) = _newp->next = _newp;					      \
     77     else								      \
     78       {									      \
     79 	_newp->next = (first)->next;					      \
     80 	(first) = (first)->next = _newp;				      \
     81       }									      \
     82   } while (0)
     83 
     84 
     85 #endif	/* list.h */
     86