ref: 72abaa282749e37df7831959b1a344664b1827f3
dir: /nod.c/
#include <u.h> #include <libc.h> #include "dat.h" #include "fns.h" Nlst append(Nlst l, Nod *n) { if(l.nv == l.cap){ if(l.cap == 0) l.cap = 1; l.cap *= 2; l.v = realloc(l.v, l.cap*sizeof(Nod*)); if(l.v == nil) abort(); } l.v[l.nv++] = n; return l; } Nod* new(int t) { Nod *n; if((n = mallocz(sizeof(Nod), 1)) == nil) abort(); n->loc.line = lexline; n->loc.file = lexfile; n->t = t; return n; } Nod* mkexpr(int op, Nod *lhs, Nod *rhs) { Nod *e; e = new(Nexpr); e->expr.op = op; e->expr.lhs = lhs; e->expr.rhs = rhs; e->expr.type = nil; return e; } Nod* mkiter(Nod *idx, Nod *arg, Nod *body) { Nod *n; n = new(Niter); n->iter.idx = idx; n->iter.arg = arg; n->iter.body = body; return n; } Nod* mkfor(Nod *init, Nod *cond, Nod *step, Nod *body) { Nod *n; n = new(Nfor); n->nfor.init = init; n->nfor.cond= cond; n->nfor.step = step; n->nfor.body = body; return n; } Nod* mklit(vlong v) { Nod *n; n = new(Nlit); n->lit.val = v; return n; } Nod* mksym(char *s) { Nod *n; n = new(Nlit); n->sym.sym = s; return n; } Nod* mkdecl(char *s, Typ *t, Nod *i) { Nod *n; n = new(Ndcl); n->dcl.name = s; n->dcl.type = t; n->dcl.init = i; return n; } Typ* mktyarray(Typ *bt, Nod *sz) { Typ *t; if((t = mallocz(sizeof(Typ), 1)) == nil) abort(); t->t = Tarray; t->base = bt; t->size = sz; return t; } Typ* mktyslice(Typ *bt) { Typ *t; t = calloc(1, sizeof(Typ)); t->t = Tslice; t->base = bt; return t; }