kpath.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /** @file kpath.c
  2. */
  3. #include <assert.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <faux/list.h>
  8. #include <klish/khelper.h>
  9. #include <klish/kudata.h>
  10. #include <klish/kpath.h>
  11. struct kpath_s {
  12. faux_list_t *levels;
  13. };
  14. kpath_t *kpath_new()
  15. {
  16. kpath_t *path = NULL;
  17. path = faux_zmalloc(sizeof(*path));
  18. assert(path);
  19. if (!path)
  20. return NULL;
  21. // User data blobs list
  22. path->levels = faux_list_new(FAUX_LIST_UNSORTED, FAUX_LIST_NONUNIQUE,
  23. NULL, NULL, (void (*)(void *))klevel_free);
  24. assert(path->levels);
  25. return path;
  26. }
  27. void kpath_free(kpath_t *path)
  28. {
  29. if (!path)
  30. return;
  31. faux_list_free(path->levels);
  32. free(path);
  33. }
  34. size_t kpath_len(const kpath_t *path)
  35. {
  36. assert(path);
  37. if (!path)
  38. return 0;
  39. return faux_list_len(path->levels);
  40. }
  41. size_t kpath_is_empty(const kpath_t *path)
  42. {
  43. assert(path);
  44. if (!path)
  45. return 0;
  46. return faux_list_is_empty(path->levels);
  47. }
  48. bool_t kpath_push(kpath_t *path, klevel_t *level)
  49. {
  50. assert(path);
  51. assert(level);
  52. if (!path)
  53. return BOOL_FALSE;
  54. if (!level)
  55. return BOOL_FALSE;
  56. if (!faux_list_add(path->levels, level))
  57. return BOOL_FALSE;
  58. return BOOL_TRUE;
  59. }
  60. bool_t kpath_pop(kpath_t *path)
  61. {
  62. assert(path);
  63. if (!path)
  64. return BOOL_FALSE;
  65. if (kpath_is_empty(path))
  66. return BOOL_FALSE;
  67. return faux_list_del(path->levels, faux_list_tail(path->levels));
  68. }
  69. klevel_t *kpath_current(const kpath_t *path)
  70. {
  71. assert(path);
  72. if (!path)
  73. return NULL;
  74. if (kpath_is_empty(path))
  75. return NULL;
  76. return (klevel_t *)faux_list_data(faux_list_tail(path->levels));
  77. }