From 325cfd6354dcccaa095767e0419760a3f9462fed Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Sun, 9 Jan 2022 22:03:36 +0000 Subject: Add basic code for parser/evaluator. Can do simple stranding --- print.c | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) (limited to 'print.c') diff --git a/print.c b/print.c index c457647..7935413 100644 --- a/print.c +++ b/print.c @@ -7,7 +7,22 @@ Rune * ppdatum(Datum d) { - return runestrdup(d.strrep); + Rune *result; + switch(d.tag){ + case ArrayTag: result = pparray(d.array); break; + case FunctionTag: result = runesmprint("%C", primfuncnames[d.code]); break; + case HybridTag: result = runesmprint("%C", primhybridnames[d.code]); break; + case MonadicOpTag: result = runesmprint("%C", primmonopnames[d.code]); break; + case DyadicOpTag: result = runesmprint("%C", primdyadopnames[d.code]); break; + case LParTag: result = runestrdup(L"("); break; + case RParTag: result = runestrdup(L")"); break; + case LCurlTag: result = runestrdup(L"{"); break; + case RCurlTag: result = runestrdup(L"}"); break; + case LBracketTag: result = runestrdup(L"["); break; + case RBracketTag: result = runestrdup(L"]"); break; + default: result = runesmprint("", d.tag); + } + return result; } Rune * @@ -22,4 +37,29 @@ ppdatums(Datum *ds, int n) free(tmp); } return res; +} + +Rune * +pparray(Array *a) +{ + /* can only print integer vectors and scalars for now, also nested */ + if(a->type == AtypeArray){ + Rune *res = runesmprint("["); + Rune *tmp; + for(int i = 0; i < a->size; i++){ + tmp = res; + res = runesmprint("%S%S%s", res, pparray(a->arraydata[i]), (i+1size)?" ":"]"); + free(tmp); + } + return res; + }else{ + Rune *res = runesmprint(""); + Rune *tmp; + for(int i = 0; i < a->size; i++){ + tmp = res; + res = runesmprint("%S%lld%s", res, a->intdata[i], (i+1size)?" ":""); + free(tmp); + } + return res; + } } \ No newline at end of file -- cgit v1.2.3