edgelist.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /*************************************************************************
  2. * Copyright (c) 2011 AT&T Intellectual Property
  3. * All rights reserved. This program and the accompanying materials
  4. * are made available under the terms of the Eclipse Public License v1.0
  5. * which accompanies this distribution, and is available at
  6. * https://www.eclipse.org/legal/epl-v10.html
  7. *
  8. * Contributors: Details at https://graphviz.org
  9. *************************************************************************/
  10. #include <circogen/edgelist.h>
  11. #include <assert.h>
  12. #include <util/alloc.h>
  13. static void *mkItem(void *p, Dtdisc_t *disc) {
  14. (void)disc;
  15. edgelistitem *obj = p;
  16. edgelistitem *ap = gv_alloc(sizeof(edgelistitem));
  17. ap->edge = obj->edge;
  18. return ap;
  19. }
  20. static int cmpItem(void *k1, void *k2) {
  21. const Agedge_t **key1 = k1;
  22. const Agedge_t **key2 = k2;
  23. if (*key1 > *key2) {
  24. return 1;
  25. }
  26. if (*key1 < *key2) {
  27. return -1;
  28. }
  29. return 0;
  30. }
  31. static Dtdisc_t ELDisc = {
  32. offsetof(edgelistitem, edge), /* key */
  33. sizeof(Agedge_t *), /* size */
  34. offsetof(edgelistitem, link), /* link */
  35. mkItem,
  36. free,
  37. cmpItem,
  38. };
  39. edgelist *init_edgelist(void)
  40. {
  41. edgelist *list = dtopen(&ELDisc, Dtoset);
  42. return list;
  43. }
  44. void free_edgelist(edgelist * list)
  45. {
  46. dtclose(list);
  47. }
  48. void add_edge(edgelist * list, Agedge_t * e)
  49. {
  50. edgelistitem temp;
  51. temp.edge = e;
  52. dtinsert(list, &temp);
  53. }
  54. void remove_edge(edgelist * list, Agedge_t * e)
  55. {
  56. edgelistitem temp;
  57. temp.edge = e;
  58. dtdelete(list, &temp);
  59. }
  60. #ifdef DEBUG
  61. void print_edge(edgelist * list)
  62. {
  63. edgelistitem *temp;
  64. Agedge_t *ep;
  65. for (temp = (edgelistitem *) dtflatten(list); temp;
  66. temp = (edgelistitem *)dtlink(list, temp)) {
  67. ep = temp->edge;
  68. fprintf(stderr, "%s--", agnameof(agtail(ep)));
  69. fprintf(stderr, "%s \n", agnameof(aghead(ep)));
  70. }
  71. fputs("\n", stderr);
  72. }
  73. #endif