summaryrefslogtreecommitdiff
path: root/print.c
diff options
context:
space:
mode:
Diffstat (limited to 'print.c')
-rw-r--r--print.c97
1 files changed, 67 insertions, 30 deletions
diff --git a/print.c b/print.c
index 1ebdecb..bf1be0c 100644
--- a/print.c
+++ b/print.c
@@ -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