#ifndef DEBUG_H #define DEBUG_H #if DEBUG == 1 #include <stdio.h> #include <stdarg.h> #include "eaxhla.h" static void breakpoint(void) { ; } # define debug_puts(msg) do { puts(msg); } while (0) static // this is less horid than macro varargs void debug_printf(const char * const fmt, ...) { va_list args; va_start(args, fmt); vprintf(fmt, args); va_end(args); } static void dump_variable(void * data) { symbol_t * variable = (symbol_t*)data; if (variable->symbol_type != VARIABLE) { return; } if (variable->elements == 1) { printf("{ .name = '%s', .value = '%ld' }\n", variable->name, variable->value ); } else { printf("{ .name = '%s', .elements = '%llu', .array_value = \"%.*s\" }\n", variable->name, variable->elements, (int)variable->elements, (char*)variable->array_value ); } } static void debug_dump_variables(void) { puts("# Variables:"); tommy_hashtable_foreach(&symbol_table, dump_variable); } static void dump_function(void * data) { symbol_t * function = (symbol_t*)data; if (function->symbol_type != FUNCTION) { return; } printf("{ .name = '%s' }\n", function->name ); } static void debug_dump_functions(void) { puts("# Functions:"); tommy_hashtable_foreach(&symbol_table, dump_function); } static void debug_dump_symbols(void) { debug_dump_variables(); debug_dump_functions(); printf("# Total variable size: '%d'\n", variable_size_sum()); } static void debug_token_dump(void) { extern unsigned int * token_array; extern unsigned int token_count; FILE * o = fopen("token_dump", "wb"); fwrite(token_array, sizeof(int), token_count, o); fclose(o); } #else # define debug_puts(msg) # define debug_printf(...) # define debug_dump_variables() do {} while (0) # define debug_dump_functions() do {} while (0) # define debug_dump_symbols() do {} while (0) # define debug_token_dump() do {} while (0) #endif #endif