libabacus/src/debug.c

55 lines
1.3 KiB
C

#include "debug.h"
int _debug_foreach_print_tree(void* data, va_list args);
const char* _debug_node_name(libab_tree_variant var) {
static const char* names[] = {
"none",
"base",
"id",
"num",
"op",
"unary_op",
"block",
"void",
"if",
"while",
"dowhile",
"call"
};
return names[var];
}
void _debug_print_tree_node(libab_tree* tree, FILE* file) {
fprintf(file, "%s", _debug_node_name(tree->variant));
if(libab_tree_has_string(tree->variant)) {
fprintf(file, ": %s", tree->string_value);
}
fprintf(file, "\n");
}
void _debug_print_tree(libab_tree* tree, FILE* file, int depth) {
int i = depth;
while(i--) printf(" ");
_debug_print_tree_node(tree, file);
if(libab_tree_has_vector(tree->variant)) {
vec_foreach(&tree->children, NULL, compare_always,
_debug_foreach_print_tree, file, depth + 1);
}
}
int _debug_foreach_print_tree(void* data, va_list args) {
FILE* file = va_arg(args, FILE*);
int depth = va_arg(args, int);
_debug_print_tree(data, file, depth);
return 0;
}
void libab_debug_fprint_tree(libab_tree* print, FILE* file) {
_debug_print_tree(print, file, 0);
}
void libab_debug_print_tree(libab_tree* print) {
_debug_print_tree(print, stdout, 0);
}