summaryrefslogtreecommitdiff
path: root/prettyprint.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <peter@pmikkelsen.com>2021-06-29 15:51:04 +0000
committerPeter Mikkelsen <peter@pmikkelsen.com>2021-06-29 15:51:04 +0000
commit02145f06ac007d730bc16930185fe18fa3e76c68 (patch)
treed71744b876974a4fd3062daf9dc334a984782f80 /prettyprint.c
parent0b36426d023e45d6acbc7672c7083a91d10913a8 (diff)
Add a term parser.
Diffstat (limited to 'prettyprint.c')
-rw-r--r--prettyprint.c61
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