ref: dcb761aebd2815fdf2d04c0b05724292de9dc98b
dir: /util.c/
#include <u.h> #include <libc.h> #include <thread.h> #include "dat.h" #include "fns.h" Enumeration * allocenum(uvlong count) { Enumeration *e = alloc(DataEnumeration); setroot(e, 1); e->count = count; e->items = allocextra(e, sizeof(void *) * count); return e; } void trim(char *str) { for(int i = strlen(str)-1; i > 0; i--){ if(str[i] != '\n') break; else str[i] = 0; } } static void indent(int depth) { for(int i = 0; i < depth; i++) print(" "); } static void printchild(char *desc, Ast *ast, int depth) { indent(depth); print("%s:\n", desc); indent(depth+1); debugast(ast, depth+1); } void debugast(Ast *ast, int depth) { if(ast == nil){ print("<nil>\n"); return; } int printchildren = 0; switch(ast->tag){ case AstProg: print("prog\n"); printchildren = 1; break; case AstFunc: print("func\n"); depth++; printchild("name", ast->funcname, depth); printchild("result", ast->funcresult, depth); printchild("left arg", ast->funcleftarg, depth); printchild("right arg", ast->funcrightarg, depth); printchild("local vars", ast->funclocals, depth); indent(depth); print("body\n"); printchildren = 1; break; case AstName: print("\"%s\"\n", ast->name); break; case AstLocals: print("locals\n"); printchildren = 1; break; case AstAssign: print("assign\n"); printchild("name", ast->left, depth+1); printchild("value", ast->right, depth+1); break; case AstMonadic: print("monadic call\n"); printchild("func", ast->func, depth+1); printchild("right", ast->right, depth+1); break; case AstDyadic: print("dyadic call\n"); printchild("func", ast->func, depth+1); printchild("left", ast->left, depth+1); printchild("right", ast->right, depth+1); break; case AstConst: print("const:\n"); indent(depth+1); print("%s\n", printarray(ast->val)); break; case AstPrim: print("prim: %d\n", ast->prim); break; default: print("<ast node %d>\n", ast->tag); break; } if(printchildren){ for(uvlong i = 0; i < ast->childcount; i++){ indent(depth+1); debugast(ast->children[i], depth+1); } } }