dir.c32: show long directories in pages
authorH. Peter Anvin <hpa@zytor.com>
Mon, 15 Mar 2010 05:01:19 +0000 (22:01 -0700)
committerH. Peter Anvin <hpa@zytor.com>
Mon, 15 Mar 2010 05:02:50 +0000 (22:02 -0700)
When columnizing large directories, columnize only inside of a page,
i.e. show:

a d g
b e h
c f i

j m p
k n q
l o r

This seems to have the best readability.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
com32/modules/dir.c

index 10fa5c2..c9d9370 100644 (file)
@@ -71,10 +71,11 @@ static int display_directory(const char *dirname)
     struct dirent *de;
     struct dirent **dex = NULL;
     size_t n_dex = 0, n_de = 0;
-    size_t i, j;
-    unsigned int nrows, ncols;
+    size_t i, j, k;
+    size_t nrows, ncols, perpage;
+    size_t endpage;
     int maxlen = 0;
-    int pos, tpos, colwidth, pagerow;
+    int pos, tpos, colwidth;
 
     dir = opendir(dirname);
     if (!dir) {
@@ -115,24 +116,29 @@ static int display_directory(const char *dirname)
     ncols = min(ncols, n_de);
     ncols = max(ncols, 1U);
     colwidth = (cols + 2)/ncols;
-    nrows = (n_de + ncols - 1) / ncols;
-
-    pagerow = 1;               /* Need one row for the cursor */
-    for (i = 0; i < nrows; i++) {
-       pos = tpos = 0;
-       for (j = i; j < n_de; j += nrows) {
-           pos += printf("%*s%-5s %s",
-                         (tpos - pos), "",
-                         type_str(dex[j]->d_type),
-                         dex[j]->d_name);
-           tpos += colwidth;
-       }
-       printf("\n");
-       pagerow++;
-       if (pagerow >= rows) {
-           get_key(stdin, 0);
-           pagerow = 1;
+    perpage = ncols * (rows - 1);
+
+    for (i = 0; i < n_de; i += perpage) {
+       /* Rows on this page */
+       endpage = min(i+perpage, n_de);
+       nrows = ((endpage-i) + ncols - 1)/ncols;
+
+       for (j = 0; j < nrows; j++) {
+           pos = tpos = 0;
+           for (k = i+j; k < endpage; k += nrows) {
+               pos += printf("%*s%-5s %s",
+                             (tpos - pos), "",
+                             type_str(dex[k]->d_type),
+                             dex[k]->d_name);
+               tpos += colwidth;
+           }
+           printf("\n");
        }
+
+       if (endpage >= n_de)
+           break;
+
+       get_key(stdin, 0);
     }
 
     free_dirents(dex, n_de);