summaryrefslogtreecommitdiff
path: root/print.c
diff options
context:
space:
mode:
Diffstat (limited to 'print.c')
-rw-r--r--print.c42
1 files changed, 41 insertions, 1 deletions
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("<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