#include #include #include #include "apl9.h" Rune * ppdatum(Datum d) { 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 * ppdatums(Datum *ds, int n) { int i; Rune *res = runesmprint(""); Rune *tmp; for(i = 0; i < n; i++){ tmp = res; res = runesmprint("%S %S", res, ppdatum(ds[i])); free(tmp); } return res; } Rune * pparray(Array *a) { Rune **elemstrs = malloc(sizeof(Rune *) * a->size); for(int i = 0; i < a->size; i++){ if(a->type == AtypeArray){ Rune *arrstr = pparray(a->arraydata[i]); elemstrs[i] = runesmprint("[%S]", arrstr); free(arrstr); }else if(a->type == AtypeInt) elemstrs[i] = runesmprint("%lld", a->intdata[i]); } /* Should do some width and height padding here */ Rune *res = runesmprint(""); Rune *tmp; for(int i = 0; i < a->size; i++){ tmp = res; res = runesmprint("%S%S", res, elemstrs[i]); free(tmp); free(elemstrs[i]); int j = 1; int spaceprinted = 0; for(int dim = 0; dim < a->rank && i+1 != a->size; dim++){ j *= a->shape[dim]; tmp = res; if((i+1)%j == 0){ spaceprinted = 1; res = runesmprint("%S\n", res); free(tmp); }else if(!spaceprinted){ spaceprinted = 1; res = runesmprint("%S ", res); free(tmp); } } } return res; }