0001 #include <cgreen/breadcrumb.h>
0002 #include <stdlib.h>
0003
0004 #ifdef __cplusplus
0005 namespace cgreen {
0006 #endif
0007
0008 CgreenBreadcrumb *create_breadcrumb(void) {
0009 CgreenBreadcrumb *breadcrumb = (CgreenBreadcrumb *) malloc(sizeof(CgreenBreadcrumb));
0010 if (breadcrumb == NULL) {
0011 return NULL;
0012 }
0013 breadcrumb->trail = NULL;
0014 breadcrumb->depth = 0;
0015 breadcrumb->space = 0;
0016 return breadcrumb;
0017 }
0018
0019 void destroy_breadcrumb(CgreenBreadcrumb *breadcrumb) {
0020 free((void*)breadcrumb->trail);
0021 free((void*)breadcrumb);
0022 }
0023
0024 void push_breadcrumb(CgreenBreadcrumb *breadcrumb, const char *name) {
0025 breadcrumb->depth++;
0026 if (breadcrumb->depth > breadcrumb->space) {
0027 const char **tmp;
0028 breadcrumb->space++;
0029 tmp = (const char**) realloc((void*)breadcrumb->trail,
0030 sizeof(const char *) * breadcrumb->space);
0031 if (tmp == NULL) {
0032 breadcrumb->space--;
0033 breadcrumb->depth--;
0034 return;
0035 }
0036 breadcrumb->trail = tmp;
0037 }
0038 breadcrumb->trail[breadcrumb->depth - 1] = name;
0039 }
0040
0041 void pop_breadcrumb(CgreenBreadcrumb *breadcrumb) {
0042 breadcrumb->depth--;
0043 }
0044
0045 const char *get_current_from_breadcrumb(CgreenBreadcrumb *breadcrumb) {
0046 if (get_breadcrumb_depth(breadcrumb) == 0) {
0047 return NULL;
0048 }
0049
0050 return breadcrumb->trail[breadcrumb->depth - 1];
0051 }
0052
0053 int get_breadcrumb_depth(CgreenBreadcrumb *breadcrumb) {
0054 return breadcrumb->depth;
0055 }
0056
0057 void walk_breadcrumb(CgreenBreadcrumb *breadcrumb, void (*walker)(const char *, void *), void *memo) {
0058 int i;
0059 for (i = 0; i < breadcrumb->depth; i++) {
0060 (*walker)(breadcrumb->trail[i], memo);
0061 }
0062 }
0063
0064 #ifdef __cplusplus
0065 }
0066 #endif
0067
0068