From 02145f06ac007d730bc16930185fe18fa3e76c68 Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Tue, 29 Jun 2021 15:51:04 +0000 Subject: Add a term parser. --- prettyprint.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 prettyprint.c (limited to 'prettyprint.c') diff --git a/prettyprint.c b/prettyprint.c new file mode 100644 index 0000000..499fc84 --- /dev/null +++ b/prettyprint.c @@ -0,0 +1,61 @@ +#include +#include + +#include "dat.h" +#include "fns.h" + +Rune *prettyprintlist(Term *, Rune *, int); + +Rune * +prettyprint(Term *t) +{ + Rune *result; + Rune *args; + + switch(t->tag){ + case CompoundTerm: + args = prettyprintlist(t->children, L", ", 0); + result = runesmprint("%S(%S)", t->text, args); + free(args); + break; + case AtomTerm: + case VariableTerm: + result = runesmprint("%S", t->text); + break; + case NumberTerm: + if(t->numbertype == NumberInt) + result = runesmprint("%lld", t->ival); + else + result = runesmprint("%f", t->dval); + break; + default: + result = runesmprint("cant print term with tag %d", t->tag); + break; + } + + return result; +} + +Rune * +prettyprintlist(Term *t, Rune *sep, int end) +{ + if(t == nil){ + if(end) + return runesmprint("%S", sep); + else + return runesmprint(""); + } + + Rune *str = prettyprint(t); + Rune *rest = prettyprintlist(t->next, sep, end); + Rune *result; + + if(t->next != nil) + result = runesmprint("%S%S%S", str, sep, rest); + else + result = runesmprint("%S%S", str, end ? rest : L""); + + free(str); + free(rest); + return result; +} \ No newline at end of file -- cgit v1.2.3