1 #include <cgreen/breadcrumb.h>
2 #include <stdlib.h>
3
4 struct CgreenBreadcrumb_ {
5 const char **trail;
6 int depth;
7 int space;
8 };
9
create_breadcrumb(void)10 CgreenBreadcrumb *create_breadcrumb(void) {
11 CgreenBreadcrumb *breadcrumb = malloc(sizeof(CgreenBreadcrumb));
12 if (breadcrumb == NULL) {
13 return NULL;
14 }
15 breadcrumb->trail = NULL;
16 breadcrumb->depth = 0;
17 breadcrumb->space = 0;
18 return breadcrumb;
19 }
20
destroy_breadcrumb(CgreenBreadcrumb * breadcrumb)21 void destroy_breadcrumb(CgreenBreadcrumb *breadcrumb) {
22 free(breadcrumb->trail);
23 free(breadcrumb);
24 }
25
push_breadcrumb(CgreenBreadcrumb * breadcrumb,const char * name)26 void push_breadcrumb(CgreenBreadcrumb *breadcrumb, const char *name) {
27 breadcrumb->depth++;
28 if (breadcrumb->depth > breadcrumb->space) {
29 const char **tmp;
30 breadcrumb->space++;
31 tmp = realloc(breadcrumb->trail,
32 sizeof(const char *) * breadcrumb->space);
33 if (tmp == NULL) {
34 breadcrumb->space--;
35 breadcrumb->depth--;
36 return;
37 }
38 breadcrumb->trail = tmp;
39 }
40 breadcrumb->trail[breadcrumb->depth - 1] = name;
41 }
42
pop_breadcrumb(CgreenBreadcrumb * breadcrumb)43 void pop_breadcrumb(CgreenBreadcrumb *breadcrumb) {
44 breadcrumb->depth--;
45 }
46
get_current_from_breadcrumb(CgreenBreadcrumb * breadcrumb)47 const char *get_current_from_breadcrumb(CgreenBreadcrumb *breadcrumb) {
48 if (get_breadcrumb_depth(breadcrumb) == 0) {
49 return NULL;
50 }
51 return breadcrumb->trail[breadcrumb->depth - 1];
52 }
53
get_breadcrumb_depth(CgreenBreadcrumb * breadcrumb)54 int get_breadcrumb_depth(CgreenBreadcrumb *breadcrumb) {
55 return breadcrumb->depth;
56 }
57
walk_breadcrumb(CgreenBreadcrumb * breadcrumb,void (* walker)(const char *,void *),void * memo)58 void walk_breadcrumb(CgreenBreadcrumb *breadcrumb, void (*walker)(const char *, void *), void *memo) {
59 int i;
60 for (i = 0; i < breadcrumb->depth; i++) {
61 (*walker)(breadcrumb->trail[i], memo);
62 }
63 }
64
65 /* vim: set ts=4 sw=4 et cindent: */
66