ref: 1ca3670047172610f0c284df5d5171fa840f97ce
dir: /misc.c/
#include <u.h> #include <libc.h> #include "dat.h" #include "fns.h" Term * copyterm(Term *orig, uvlong *clausenr) { Term *new = malloc(sizeof(Term)); memcpy(new, orig, sizeof(Term)); new->next = nil; new->children = nil; if(clausenr) new->clausenr = *clausenr; else new->clausenr = orig->clausenr; Term *child; for(child = orig->children; child != nil; child = child->next) new->children = appendterm(new->children, copyterm(child, clausenr)); return new; } Term * appendterm(Term *a, Term *b) { if(a == nil) return b; Term *tmp; for(tmp = a; tmp->next != nil; tmp = tmp->next); tmp->next = b; return a; } int termslength(Term *list) { int len; for(len = 0; list != nil; len++, list = list->next); return len; } Term * mkterm(int tag) { Term *t = malloc(sizeof(Term)); t->tag = tag; t->next = nil; t->children = nil; t->text = nil; t->clausenr = 0; return t; } Term * mkatom(Rune *name) { Term *t = mkterm(AtomTerm); t->text = name; return t; } Term * mkvariable(Rune *name) { Term *t = mkterm(VariableTerm); t->text = name; return t; } Term * mkcompound(Rune *name, int arity, Term *args) { Term *t = mkterm(CompoundTerm); t->text = name; t->arity = arity; t->children = args; return t; } Term * mknumber(int type, vlong ival, double dval) { Term *t = mkterm(NumberTerm); t->numbertype = type; t->ival = ival; t->dval = dval; return t; } Term * mkstring(Rune *text) { Term *t = mkterm(StringTerm); t->text = text; return t; }