linklist.h
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:3k
源码类别:

网络

开发平台:

Unix_Linux

  1. /* Generic linked list
  2.  * Copyright (C) 1997, 2000 Kunihiro Ishiguro
  3.  *
  4.  * This file is part of GNU Zebra.
  5.  *
  6.  * GNU Zebra is free software; you can redistribute it and/or modify it
  7.  * under the terms of the GNU General Public License as published by the
  8.  * Free Software Foundation; either version 2, or (at your option) any
  9.  * later version.
  10.  *
  11.  * GNU Zebra is distributed in the hope that it will be useful, but
  12.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  * General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with GNU Zebra; see the file COPYING.  If not, write to the Free
  18.  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  19.  * 02111-1307, USA.  
  20.  */
  21. #ifndef _ZEBRA_LINKLIST_H
  22. #define _ZEBRA_LINKLIST_H
  23. typedef struct list *list;
  24. typedef struct listnode *listnode;
  25. struct listnode 
  26. {
  27.   struct listnode *next;
  28.   struct listnode *prev;
  29.   void *data;
  30. };
  31. struct list 
  32. {
  33.   struct listnode *head;
  34.   struct listnode *tail;
  35.   unsigned int count;
  36.   int (*cmp) (void *val1, void *val2);
  37.   void (*del) (void *val);
  38. };
  39. #define nextnode(X) ((X) = (X)->next)
  40. #define listhead(X) ((X)->head)
  41. #define listcount(X) ((X)->count)
  42. #define list_isempty(X) ((X)->head == NULL && (X)->tail == NULL)
  43. #define getdata(X) ((X)->data)
  44. /* Prototypes. */
  45. struct list *list_new();
  46. void list_free (struct list *);
  47. void listnode_add (struct list *, void *);
  48. void listnode_add_sort (struct list *, void *);
  49. void listnode_add_after (struct list *, struct listnode *, void *);
  50. void listnode_delete (struct list *, void *);
  51. struct listnode *listnode_lookup (struct list *, void *);
  52. void *listnode_head (struct list *);
  53. void list_delete (struct list *);
  54. void list_delete_all_node (struct list *);
  55. /* For ospfd and ospf6d. */
  56. void list_delete_node (list, listnode);
  57. /* For ospf_spf.c */
  58. void list_add_node_prev (list, listnode, void *);
  59. void list_add_node_next (list, listnode, void *);
  60. void list_add_list (list, list);
  61. /* List iteration macro. */
  62. #define LIST_LOOP(L,V,N) 
  63.   for ((N) = (L)->head; (N); (N) = (N)->next) 
  64.     if (((V) = (N)->data) != NULL)
  65. /* List node add macro.  */
  66. #define LISTNODE_ADD(L,N) 
  67.   do { 
  68.     (N)->prev = (L)->tail; 
  69.     if ((L)->head == NULL) 
  70.       (L)->head = (N); 
  71.     else 
  72.       (L)->tail->next = (N); 
  73.     (L)->tail = (N); 
  74.   } while (0)
  75. /* List node delete macro.  */
  76. #define LISTNODE_DELETE(L,N) 
  77.   do { 
  78.     if ((N)->prev) 
  79.       (N)->prev->next = (N)->next; 
  80.     else 
  81.       (L)->head = (N)->next; 
  82.     if ((N)->next) 
  83.       (N)->next->prev = (N)->prev; 
  84.     else 
  85.       (L)->tail = (N)->prev; 
  86.   } while (0)
  87. #endif /* _ZEBRA_LINKLIST_H */