diff options
Diffstat (limited to 'print.c')
-rw-r--r-- | print.c | 42 |
1 files changed, 41 insertions, 1 deletions
@@ -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("<not printable %d>", 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+1<a->size)?" ":"]"); + 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+1<a->size)?" ":""); + free(tmp); + } + return res; + } }
\ No newline at end of file |