ref: 8dd4f85c85aa9ab7a5f1219efd694e6707f2718c
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 = nil; Rune *r; switch(flagdoublequotes){ case DoubleQuotesChars: for(r = text; *r != '\0'; r++){ Rune *chtext = runesmprint("%C", *r); Term *ch = mkatom(chtext); t = appendterm(t, ch); } t = mklist(t); break; case DoubleQuotesCodes: for(r = text; *r != '\0'; r++){ Term *code = mknumber(NumberInt, *r, 0); t = appendterm(t, code); } t = mklist(t); break; break; case DoubleQuotesAtom: t = mkatom(text); } return t; } Term * mklist(Term *elems) { if(elems == nil) return mkatom(L"[]"); else{ Term *t = copyterm(elems, nil); t->next = mklist(elems->next); return mkcompound(L".", 2, t); } }