diff options
author | Peter Mikkelsen <peter@pmikkelsen.com> | 2021-06-30 23:48:25 +0000 |
---|---|---|
committer | Peter Mikkelsen <peter@pmikkelsen.com> | 2021-06-30 23:48:25 +0000 |
commit | d5ac41480097d6f382fbb2385974e57ec21030a4 (patch) | |
tree | 57dedcb0382456d87152894601aa25778df7ccfd /prettyprint.c | |
parent | 85adea62d7e8eee9d0e3525d572325db4e58d21a (diff) |
Prettyprint lists for reals
Diffstat (limited to 'prettyprint.c')
-rw-r--r-- | prettyprint.c | 40 |
1 files changed, 37 insertions, 3 deletions
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 |