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

网络

开发平台:

Unix_Linux

  1. /* Generic linked list routine.
  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. #include <zebra.h>
  22. #include "linklist.h"
  23. #include "memory.h"
  24. /* Allocate new list. */
  25. struct list *
  26. list_new ()
  27. {
  28.   struct list *new;
  29.   new = XMALLOC (MTYPE_LINK_LIST, sizeof (struct list));
  30.   memset (new, 0, sizeof (struct list));
  31.   return new;
  32. }
  33. /* Free list. */
  34. void
  35. list_free (struct list *l)
  36. {
  37.   XFREE (MTYPE_LINK_LIST, l);
  38. }
  39. /* Allocate new listnode.  Internal use only. */
  40. static struct listnode *
  41. listnode_new ()
  42. {
  43.   struct listnode *node;
  44.   node = XMALLOC (MTYPE_LINK_NODE, sizeof (struct listnode));
  45.   memset (node, 0, sizeof (struct listnode));
  46.   return node;
  47. }
  48. /* Free listnode. */
  49. static void
  50. listnode_free (struct listnode *node)
  51. {
  52.   XFREE (MTYPE_LINK_NODE, node);
  53. }
  54. /* Add new data to the list. */
  55. void
  56. listnode_add (struct list *list, void *val)
  57. {
  58.   struct listnode *node;
  59.   node = listnode_new ();
  60.   node->prev = list->tail;
  61.   node->data = val;
  62.   if (list->head == NULL)
  63.     list->head = node;
  64.   else
  65.     list->tail->next = node;
  66.   list->tail = node;
  67.   list->count++;
  68. }
  69. /* Add new node with sort function. */
  70. void
  71. listnode_add_sort (struct list *list, void *val)
  72. {
  73.   struct listnode *n;
  74.   struct listnode *new;
  75.   new = listnode_new ();
  76.   new->data = val;
  77.   if (list->cmp)
  78.     {
  79.       for (n = list->head; n; n = n->next)
  80. {
  81.   if ((*list->cmp) (val, n->data) < 0)
  82.     {     
  83.       new->next = n;
  84.       new->prev = n->prev;
  85.       if (n->prev)
  86. n->prev->next = new;
  87.       else
  88. list->head = new;
  89.       n->prev = new;
  90.       list->count++;
  91.       return;
  92.     }
  93. }
  94.     }
  95.   new->prev = list->tail;
  96.   if (list->tail)
  97.     list->tail->next = new;
  98.   else
  99.     list->head = new;
  100.   list->tail = new;
  101.   list->count++;
  102. }
  103. void
  104. listnode_add_after (struct list *list, struct listnode *pp, void *val)
  105. {
  106.   struct listnode *nn;
  107.   nn = listnode_new ();
  108.   nn->data = val;
  109.   if (pp == NULL)
  110.     {
  111.       if (list->head)
  112. list->head->prev = nn;
  113.       else
  114. list->tail = nn;
  115.       nn->next = list->head;
  116.       nn->prev = pp;
  117.       list->head = nn;
  118.     }
  119.   else
  120.     {
  121.       if (pp->next)
  122. pp->next->prev = nn;
  123.       else
  124. list->tail = nn;
  125.       nn->next = pp->next;
  126.       nn->prev = pp;
  127.       pp->next = nn;
  128.     }
  129. }
  130. /* Delete specific date pointer from the list. */
  131. void
  132. listnode_delete (struct list *list, void *val)
  133. {
  134.   struct listnode *node;
  135.   for (node = list->head; node; node = node->next)
  136.     {
  137.       if (node->data == val)
  138. {
  139.   if (node->prev)
  140.     node->prev->next = node->next;
  141.   else
  142.     list->head = node->next;
  143.   if (node->next)
  144.     node->next->prev = node->prev;
  145.   else
  146.     list->tail = node->prev;
  147.   list->count--;
  148.   listnode_free (node);
  149.   return;
  150. }
  151.     }
  152. }
  153. /* Return first node's data if it is there.  */
  154. void *
  155. listnode_head (struct list *list)
  156. {
  157.   struct listnode *node;
  158.   node = list->head;
  159.   if (node)
  160.     return node->data;
  161.   return NULL;
  162. }
  163. /* Delete all listnode from the list. */
  164. void
  165. list_delete_all_node (struct list *list)
  166. {
  167.   struct listnode *node;
  168.   struct listnode *next;
  169.   for (node = list->head; node; node = next)
  170.     {
  171.       next = node->next;
  172.       if (list->del)
  173. (*list->del) (node->data);
  174.       listnode_free (node);
  175.     }
  176.   list->head = list->tail = NULL;
  177.   list->count = 0;
  178. }
  179. /* Delete all listnode then free list itself. */
  180. void
  181. list_delete (struct list *list)
  182. {
  183.   struct listnode *node;
  184.   struct listnode *next;
  185.   for (node = list->head; node; node = next)
  186.     {
  187.       next = node->next;
  188.       if (list->del)
  189. (*list->del) (node->data);
  190.       listnode_free (node);
  191.     }
  192.   list_free (list);
  193. }
  194. /* Lookup the node which has given data. */
  195. struct listnode *
  196. listnode_lookup (struct list *list, void *data)
  197. {
  198.   listnode node;
  199.   for (node = list->head; node; nextnode (node))
  200.     if (data == getdata (node))
  201.       return node;
  202.   return NULL;
  203. }
  204. /* Delete the node from list.  For ospfd and ospf6d. */
  205. void
  206. list_delete_node (list list, listnode node)
  207. {
  208.   if (node->prev)
  209.     node->prev->next = node->next;
  210.   else
  211.     list->head = node->next;
  212.   if (node->next)
  213.     node->next->prev = node->prev;
  214.   else
  215.     list->tail = node->prev;
  216.   list->count--;
  217.   listnode_free (node);
  218. }
  219. /* ospf_spf.c */
  220. void
  221. list_add_node_prev (list list, listnode current, void *val)
  222. {
  223.   struct listnode *node;
  224.   node = listnode_new ();
  225.   node->next = current;
  226.   node->data = val;
  227.   if (current->prev == NULL)
  228.     list->head = node;
  229.   else
  230.     current->prev->next = node;
  231.   node->prev = current->prev;
  232.   current->prev = node;
  233.   list->count++;
  234. }
  235. /* ospf_spf.c */
  236. void
  237. list_add_node_next (list list, listnode current, void *val)
  238. {
  239.   struct listnode *node;
  240.   node = listnode_new ();
  241.   node->prev = current;
  242.   node->data = val;
  243.   if (current->next == NULL)
  244.     list->tail = node;
  245.   else
  246.     current->next->prev = node;
  247.   node->next = current->next;
  248.   current->next = node;
  249.   list->count++;
  250. }
  251. /* ospf_spf.c */
  252. void
  253. list_add_list (struct list *l, struct list *m)
  254. {
  255.   struct listnode *n;
  256.   for (n = listhead (m); n; nextnode (n))
  257.     listnode_add (l, n->data);
  258. }