#include #include #include #include size_t print_level(char *buf, int level) { int lvl = 0; while (lvl < level) { buf[lvl] = '-'; lvl++; } buf[lvl] = '>'; return strlen(buf); } void print_node(fzl_node_t *node, int level) { char levelbuf[32]; char printbuf[256]; memset(levelbuf, 0, sizeof(levelbuf)); memset(printbuf, 0, sizeof(printbuf)); if (!node) return; size_t lvllen = print_level(levelbuf, level); strcpy(printbuf, levelbuf); switch (node->type) { case FZL_NODETYPE_CALL: if (node->list.entry_count > 0) { printf("%s Call fn '%s' with args:\n", levelbuf, (char *)node->token->value); for (size_t i = 0; i < node->list.entry_count; i++) print_node(node->list.entries[i], level + 1); } else printf("%s Call fn '%s' w/o args\n", levelbuf, (char *)node->token->value); break; case FZL_NODETYPE_LITERAL: printf("%s Literal '%s'\n", levelbuf, (char *)node->token->value); break; case FZL_NODETYPE_BLOCK: printf("%s Block: ", levelbuf); if (node->list.entry_count < 1) { printf("\n"); break; } printf("\n"); for (size_t i = 0; i < node->list.entry_count; i++) print_node(node->list.entries[i], level + 1); break; default: printf("%s Secure node\n", levelbuf); } } void fzl_debug_print_ast(fzl_node_t *root) { printf("> AST tree:\n"); fzl_node_t *curr = root; while (curr != NULL) { print_node(curr, 2); curr = curr->next; } printf("-> FINISH\n"); }