From d5ac41480097d6f382fbb2385974e57ec21030a4 Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Wed, 30 Jun 2021 23:48:25 +0000 Subject: Prettyprint lists for reals --- prettyprint.c | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) (limited to 'prettyprint.c') diff --git a/prettyprint.c b/prettyprint.c index bf66dc2..7ba3a0b 100644 --- a/prettyprint.c +++ b/prettyprint.c @@ -5,6 +5,8 @@ #include "fns.h" Rune *prettyprintlist(Term *, Rune *, int); +Rune *printlist(Term *); +int islist(Term *); Rune * prettyprint(Term *t) @@ -14,9 +16,13 @@ prettyprint(Term *t) switch(t->tag){ case CompoundTerm: - args = prettyprintlist(t->children, L", ", 0); - result = runesmprint("%S(%S)", t->text, args); - free(args); + args = printlist(t); + if(args == nil){ + args = prettyprintlist(t->children, L", ", 0); + result = runesmprint("%S(%S)", t->text, args); + free(args); + }else + result = runesmprint("[%S]", args); break; case AtomTerm: result = runesmprint("%S", t->text); @@ -63,4 +69,32 @@ prettyprintlist(Term *t, Rune *sep, int end) free(str); free(rest); return result; +} + +/* printlist prints a list's elements but not the surrounding [ and ] */ +Rune * +printlist(Term *list) +{ + if(list->tag != CompoundTerm || list->arity != 2 || runestrcmp(L".", list->text) != 0) + return nil; + + Term *head = list->children; + Term *tail = head->next; + + Rune *headstr = prettyprint(head); + Rune *tailstr = nil; + Rune *result; + + if(tail->tag == CompoundTerm && tail->arity == 2 && runestrcmp(L".", tail->text) == 0){ + tailstr = printlist(tail); + result = runesmprint("%S, %S", headstr, tailstr); + }else if(tail->tag == AtomTerm && runestrcmp(L"[]", tail->text) == 0){ + result = runesmprint("%S", headstr); + }else{ + tailstr = prettyprint(tail); + result = runesmprint("%S | %S", headstr, tailstr); + } + free(headstr); + free(tailstr); + return result; } \ No newline at end of file -- cgit v1.2.3