ref: 76d42756c93a7f8e1519268b8eb693ba36db4652
dir: /parse/node.c/
#include <stdlib.h> #include <stdio.h> #include <stdint.h> #include <stdarg.h> #include <ctype.h> #include <string.h> #include <assert.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include "parse.h" static Node *mknode(int line, Ntype nt) { Node *n; n = zalloc(sizeof(Node)); n->type = nt; n->line = line; return n; } Node *mkfile(char *name) { Node *n; n = mknode(-1, Nfile); n->file.name = strdup(name); return n; } Node *mkuse(int line, char *use, int islocal) { Node *n; n = mknode(line, Nuse); n->use.name = strdup(use); n->use.islocal = islocal; return n; } Node *mkexpr(int line, Op op, ...) { Node *n; va_list ap; Node *arg; n = mknode(line, Nexpr); n->expr.op = op; va_start(ap, op); while ((arg = va_arg(ap, Node*)) != NULL) nlappend(&n->expr.args, &n->expr.nargs, arg); va_end(ap); return n; } Node *mkif(int line, Node *cond, Node *iftrue, Node *iffalse) { Node *n; n = mknode(line, Nifstmt); n->ifstmt.cond = cond; n->ifstmt.iftrue = iftrue; n->ifstmt.iffalse = iffalse; return n; } Node *mkloop(int line, Node *init, Node *cond, Node *incr, Node *body) { Node *n; n = mknode(line, Nloopstmt); n->loopstmt.init = init; n->loopstmt.cond = init; n->loopstmt.incr = incr; n->loopstmt.body = body; return n; } Node *mkstr(int line, char *val) { Node *n; n = mknode(line, Nlit); n->lit.littype = Lstr; n->lit.strval = strdup(val); return n; } Node *mkint(int line, uint64_t val) { Node *n; n = mknode(line, Nlit); n->lit.littype = Lint; n->lit.intval = val; return n; } Node *mkchar(int line, uint32_t val) { Node *n; n = mknode(line, Nlit); n->lit.littype = Lchr; n->lit.chrval = val; return n; } Node *mkfloat(int line, double val) { Node *n; n = mknode(line, Nlit); n->lit.littype = Lflt; n->lit.fltval = val; return n; } Node *mkname(int line, char *name) { Node *n; n = mknode(line, Nname); n->name.nparts = 1; n->name.parts = xalloc(sizeof(char*)); n->name.parts[0] = strdup(name); return n; } Node *mkdecl(int line, Sym *sym) { die("Fixme: mkdecl"); return NULL; } void setns(Node *n, char *name) { int i; n->name.nparts++; n->name.parts = xrealloc(n->name.parts, n->name.nparts); for (i = n->name.nparts - 1; i > 0; i++) n->name.parts[i] = n->name.parts[i-1]; n->name.parts[0] = strdup(name); } Node *mkbool(int line, int val) { Node *n; n = mknode(line, Nlit); n->lit.littype = Lbool; n->lit.boolval = val; return n; } Sym *mksym(int line, Node *name, Type *ty) { die("Fixme: mksym"); return NULL; } void nlappend(Node ***nl, size_t *len, Node *n) { *nl = xrealloc(nl, (*len + 1)*sizeof(Node*)); (*nl)[*len] = n; (*len)++; }