Back to home page

Enduro/X

 
 

    


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 } // namespace cgreen
0066 #endif
0067 
0068 /* vim: set ts=4 sw=4 et cindent: */