intlist.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /*
  2. * Based on intlist.c by:
  3. * (c) 2009 Arnaldo Carvalho de Melo <acme@redhat.com>
  4. *
  5. * Licensed under the GPLv2.
  6. */
  7. #include <errno.h>
  8. #include <stdlib.h>
  9. #include <linux/compiler.h>
  10. #include "intlist.h"
  11. static struct rb_node *intlist__node_new(struct rblist *rblist __maybe_unused,
  12. const void *entry)
  13. {
  14. int i = (int)((long)entry);
  15. struct rb_node *rc = NULL;
  16. struct int_node *node = malloc(sizeof(*node));
  17. if (node != NULL) {
  18. node->i = i;
  19. rc = &node->rb_node;
  20. }
  21. return rc;
  22. }
  23. static void int_node__delete(struct int_node *ilist)
  24. {
  25. free(ilist);
  26. }
  27. static void intlist__node_delete(struct rblist *rblist __maybe_unused,
  28. struct rb_node *rb_node)
  29. {
  30. struct int_node *node = container_of(rb_node, struct int_node, rb_node);
  31. int_node__delete(node);
  32. }
  33. static int intlist__node_cmp(struct rb_node *rb_node, const void *entry)
  34. {
  35. int i = (int)((long)entry);
  36. struct int_node *node = container_of(rb_node, struct int_node, rb_node);
  37. return node->i - i;
  38. }
  39. int intlist__add(struct intlist *ilist, int i)
  40. {
  41. return rblist__add_node(&ilist->rblist, (void *)((long)i));
  42. }
  43. void intlist__remove(struct intlist *ilist, struct int_node *node)
  44. {
  45. rblist__remove_node(&ilist->rblist, &node->rb_node);
  46. }
  47. struct int_node *intlist__find(struct intlist *ilist, int i)
  48. {
  49. struct int_node *node = NULL;
  50. struct rb_node *rb_node = rblist__find(&ilist->rblist, (void *)((long)i));
  51. if (rb_node)
  52. node = container_of(rb_node, struct int_node, rb_node);
  53. return node;
  54. }
  55. struct intlist *intlist__new(void)
  56. {
  57. struct intlist *ilist = malloc(sizeof(*ilist));
  58. if (ilist != NULL) {
  59. rblist__init(&ilist->rblist);
  60. ilist->rblist.node_cmp = intlist__node_cmp;
  61. ilist->rblist.node_new = intlist__node_new;
  62. ilist->rblist.node_delete = intlist__node_delete;
  63. }
  64. return ilist;
  65. }
  66. void intlist__delete(struct intlist *ilist)
  67. {
  68. if (ilist != NULL)
  69. rblist__delete(&ilist->rblist);
  70. }
  71. struct int_node *intlist__entry(const struct intlist *ilist, unsigned int idx)
  72. {
  73. struct int_node *node = NULL;
  74. struct rb_node *rb_node;
  75. rb_node = rblist__entry(&ilist->rblist, idx);
  76. if (rb_node)
  77. node = container_of(rb_node, struct int_node, rb_node);
  78. return node;
  79. }