diff options
Diffstat (limited to 'print.c')
-rw-r--r-- | print.c | 97 |
1 files changed, 67 insertions, 30 deletions
@@ -6,6 +6,7 @@ void strdims(Rune *, int *, int *); Rune *printborder(Rune *, int *, int, int); +Rune *strline(Rune *, int); Rune * ppdatum(Datum d) @@ -61,7 +62,7 @@ ppdatums(Datum *ds, int n) Rune * pparray(Array *a) { - Rune **elemstrs = malloc(sizeof(Rune *) * a->size); + Rune **elemstrs = emalloc(sizeof(Rune *) * a->size); int rowcount = 1; if(a->rank > 0){ for(int i = 0; i < a->rank-1; i++) @@ -82,45 +83,55 @@ pparray(Array *a) int lastdim = a->rank ? a->shape[a->rank-1] : 1; int *widths = mallocz(sizeof(int) * lastdim, 1); + int *heights = mallocz(sizeof(int) * rowcount, 1); for(int i = 0; i < a->size; i++){ int w,h; strdims(elemstrs[i], &w, &h); if(w > widths[i%lastdim]) widths[i%lastdim] = w; + if(h > heights[i/lastdim]) + heights[i/lastdim] = h; } - /* Should do height padding here as well */ - for(int i = 0; i < a->size; i++){ - if(i%lastdim == 0) - rowstrs[i/lastdim] = runesmprint("%S", boxing ? L"│" : L""); - Rune *tmp = rowstrs[i/lastdim]; - char *fmt = smprint("%%%s%dS", align, widths[i%lastdim]); - Rune *elem = runesmprint(fmt, elemstrs[i]); - Rune *spacing; - if((i+1)%lastdim == 0) - spacing = boxing ? L"│" : L""; - else - spacing = boxing ? L"│" : L" "; - rowstrs[i/lastdim] = runesmprint("%S%S%S", tmp, elem, spacing); - free(tmp); - free(elem); - free(fmt); - free(elemstrs[i]); + Rune *tmp; + for(int row = 0; row < rowcount; row++){ + rowstrs[row] = runestrdup(L""); + for(int y = 0; y < heights[row]; y++){ + if(boxing){ + tmp = rowstrs[row]; + rowstrs[row] = runesmprint("%S│", tmp); + free(tmp); + } + for(int x = 0; x < lastdim; x++){ + int i = row * lastdim + x; + tmp = rowstrs[row]; + char *fmt = smprint("%%%s%dS", align, widths[x]); + Rune *line = strline(elemstrs[i], y); + Rune *padded = runesmprint(fmt, line); + Rune *spacing = boxing ? L"│" : (x == lastdim-1) ? L"" : L" "; + rowstrs[row] = runesmprint("%S%S%S", tmp, padded, spacing); + free(tmp); + free(fmt); + free(line); + free(padded); + if(y == heights[row]-1) + free(elemstrs[i]); + } + if(y < heights[row]-1){ + tmp = rowstrs[row]; + rowstrs[row] = runesmprint("%S\n", tmp); + free(tmp); + } + } } - free(elemstrs); - - if(rowstrs[0] == nil) - rowstrs[0] = runestrdup(L""); if(rowcount == 1 && !boxing) return rowstrs[0]; Rune *res = runesmprint(""); - Rune *tmp; for(int i = 0; i < rowcount; i++){ if(i == 0 && boxing) res = printborder(res, widths, lastdim, 0); - int j = 1; int blanks = 0; for(int dim = 0; dim < a->rank - 1 && i+1 != a->size; dim++){ @@ -138,14 +149,11 @@ pparray(Array *a) res = runesmprint("%S\n", tmp); free(tmp); } - if(blanks > 0 && i != 0 && i < rowcount-1 && boxing) res = printborder(res, widths, lastdim, 0); - tmp = res; res = runesmprint("%S%S\n", tmp, rowstrs[i]); free(tmp); - if(i == rowcount-1 && boxing) res = printborder(res, widths, lastdim, 2); @@ -208,7 +216,7 @@ printborder(Rune *input, int *widths, int lastdim, int type) int width = 1; for(int i = 0; i < lastdim; i++) width += widths[i]+1; - Rune *border = malloc(sizeof(Rune) * width + 1); + Rune *border = emalloc(sizeof(Rune) * (width + 1)); border[width] = 0; border[0] = borderchars[0]; @@ -224,7 +232,36 @@ printborder(Rune *input, int *widths, int lastdim, int type) } Rune *result = runesmprint("%S%S\n", input, border); - //free(border); - //free(input); + free(border); + free(input); return result; +} + +Rune * +strline(Rune *str, int n) +{ + Rune *start = str; + Rune *end = str; + int l = 0; + while(l<n){ + if(*start == '\n' || *start == 0) + l++; + if((l<n && *start != 0) || *start == '\n') + start++; + } + if(*start == 0) + return runestrdup(L""); + + l = 0; + while(l<(n+1)){ + if(*end == '\n' || *end == 0) + l++; + if(l<(n+1)) + end++; + } + int len = end-start; + Rune *line = emalloc(sizeof(Rune) * (len + 1)); + runestrncpy(line, start, len); + line[len] = 0; + return line; }
\ No newline at end of file |