static int compute_columns(DISPLAY *dp, int *pnum) { int colwidth; extern int termwidth; int mywidth; colwidth = dp->maxlen; if (f_inode) colwidth += dp->s_inode + 1; if (f_size) colwidth += dp->s_block + 1; if (f_type || f_typedir) colwidth += 1; colwidth += 1; mywidth = termwidth + 1; /* no extra space for last column */ if (mywidth < 2 * colwidth) { printscol(dp); return (0); } *pnum = mywidth / colwidth; return (mywidth / *pnum); /* spread out if possible */ }
void printcol(DISPLAY *dp) { static FTSENT **array; static int lastentries = -1; FTSENT *p; int base, chcnt, col, colwidth, num; int numcols, numrows, row; if ((colwidth = compute_columns(dp, &numcols)) == 0) return; /* * Have to do random access in the linked list -- build a table * of pointers. */ if (dp->entries > lastentries) { FTSENT **a; if ((a = reallocarray(array, dp->entries, sizeof(FTSENT *))) == NULL) { free(array); array = NULL; dp->entries = 0; lastentries = -1; warn(NULL); printscol(dp); return; } lastentries = dp->entries; array = a; } for (p = dp->list, num = 0; p; p = p->fts_link) if (p->fts_number != NO_PRINT) array[num++] = p; numrows = num / numcols; if (num % numcols) ++numrows; if (dp->list->fts_level != FTS_ROOTLEVEL && (f_longform || f_size)) (void)printf("total %llu\n", howmany(dp->btotal, blocksize)); for (row = 0; row < numrows; ++row) { for (base = row, col = 0;;) { chcnt = printaname(array[base], dp->s_inode, dp->s_block); if ((base += numrows) >= num) break; if (++col == numcols) break; while (chcnt++ < colwidth) putchar(' '); } (void)putchar('\n'); } }
void printacol(DISPLAY *dp) { FTSENT *p; int chcnt, col, colwidth; int numcols; colwidth = dp->maxlen; if (f_inode) colwidth += dp->s_inode + 1; if (f_size) { if (f_humanize) colwidth += dp->s_size + 1; else colwidth += dp->s_block + 1; } if (f_type || f_typedir) colwidth += 1; colwidth += 1; if (termwidth < 2 * colwidth) { printscol(dp); return; } numcols = termwidth / colwidth; colwidth = termwidth / numcols; /* spread out if possible */ printtotal(dp); /* "total: %u\n" */ chcnt = col = 0; for (p = dp->list; p; p = p->fts_link) { if (IS_NOPRINT(p)) continue; if (col >= numcols) { chcnt = col = 0; (void)putchar('\n'); } chcnt = printaname(p, dp->s_inode, f_humanize ? dp->s_size : dp->s_block); while (chcnt++ < colwidth) (void)putchar(' '); col++; } (void)putchar('\n'); }
void printcol(const DISPLAY *dp) { static FTSENT **array; static int lastentries = -1; FTSENT *p; FTSENT **narray; int base; int chcnt; int cnt; int col; int colwidth; int endcol; int num; int numcols; int numrows; int row; int tabwidth; if (f_notabs) tabwidth = 1; else tabwidth = 8; /* * Have to do random access in the linked list -- build a table * of pointers. */ if (dp->entries > lastentries) { if ((narray = realloc(array, dp->entries * sizeof(FTSENT *))) == NULL) { printscol(dp); return; } lastentries = dp->entries; array = narray; } for (p = dp->list, num = 0; p; p = p->fts_link) if (p->fts_number != NO_PRINT) array[num++] = p; colwidth = dp->maxlen; if (f_inode) colwidth += dp->s_inode + 1; if (f_size) colwidth += dp->s_block + 1; if (f_type) colwidth += 1; colwidth = (colwidth + tabwidth) & ~(tabwidth - 1); if (termwidth < 2 * colwidth) { printscol(dp); return; } numcols = termwidth / colwidth; numrows = num / numcols; if (num % numcols) ++numrows; if ((dp->list == NULL || dp->list->fts_level != FTS_ROOTLEVEL) && (f_longform || f_size)) { xo_emit("{L:total} {:total-blocks/%lu}\n", howmany(dp->btotal, blocksize)); } xo_open_list("entry"); base = 0; for (row = 0; row < numrows; ++row) { endcol = colwidth; if (!f_sortacross) base = row; for (col = 0, chcnt = 0; col < numcols; ++col) { xo_open_instance("entry"); chcnt += printaname(array[base], dp->s_inode, dp->s_block); xo_close_instance("entry"); if (f_sortacross) base++; else base += numrows; if (base >= num) break; while ((cnt = ((chcnt + tabwidth) & ~(tabwidth - 1))) <= endcol) { if (f_sortacross && col + 1 >= numcols) break; xo_emit(f_notabs ? " " : "\t"); chcnt = cnt; } endcol += colwidth; } xo_emit("\n"); } xo_close_list("entry"); }
void printcol(DISPLAY *dp) { static FTSENT **array; static int lastentries = -1; FTSENT *p; int base, chcnt, col, colwidth, num; int numcols, numrows, row; colwidth = dp->maxlen; if (f_inode) colwidth += dp->s_inode + 1; if (f_size) { if (f_humanize) colwidth += dp->s_size + 1; else colwidth += dp->s_block + 1; } if (f_type || f_typedir) colwidth += 1; colwidth += 1; if (termwidth < 2 * colwidth) { printscol(dp); return; } /* * Have to do random access in the linked list -- build a table * of pointers. */ if (dp->entries > lastentries) { FTSENT **newarray; newarray = realloc(array, dp->entries * sizeof(FTSENT *)); if (newarray == NULL) { warn(NULL); printscol(dp); return; } lastentries = dp->entries; array = newarray; } for (p = dp->list, num = 0; p; p = p->fts_link) if (p->fts_number != NO_PRINT) array[num++] = p; numcols = termwidth / colwidth; colwidth = termwidth / numcols; /* spread out if possible */ numrows = num / numcols; if (num % numcols) ++numrows; printtotal(dp); /* "total: %u\n" */ for (row = 0; row < numrows; ++row) { for (base = row, chcnt = col = 0; col < numcols; ++col) { chcnt = printaname(array[base], dp->s_inode, f_humanize ? dp->s_size : dp->s_block); if ((base += numrows) >= num) break; while (chcnt++ < colwidth) (void)putchar(' '); } (void)putchar('\n'); } }