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