diff options
author | Peter Mikkelsen <peter@pmikkelsen.com> | 2021-06-29 15:51:04 +0000 |
---|---|---|
committer | Peter Mikkelsen <peter@pmikkelsen.com> | 2021-06-29 15:51:04 +0000 |
commit | 02145f06ac007d730bc16930185fe18fa3e76c68 (patch) | |
tree | d71744b876974a4fd3062daf9dc334a984782f80 /prettyprint.c | |
parent | 0b36426d023e45d6acbc7672c7083a91d10913a8 (diff) |
Add a term parser.
Diffstat (limited to 'prettyprint.c')
-rw-r--r-- | prettyprint.c | 61 |
1 files changed, 61 insertions, 0 deletions
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 <u.h> +#include <libc.h> + +#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 |