home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / prof_c / 08file / ls_list.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-08-11  |  3.6 KB  |  166 lines

  1. /*
  2.  *    ls_list -- list functions (long, single, multi) for ls
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include "ls.h"
  8.  
  9. #define MAXCOL        80
  10. #define MONTH_SHIFT    5
  11. #define MONTH_MASK    0x0F
  12. #define DAY_MASK    0x1F
  13. #define YEAR_SHIFT    9
  14. #define DOS_EPOCH    80
  15. #define HOUR_SHIFT    11
  16. #define HOUR_MASK    0x1F
  17. #define MINUTE_SHIFT    5
  18. #define MINUTE_MASK    0x3F
  19.  
  20. extern int Filetype;
  21.  
  22. /*
  23.  *    ls_long -- list items in "long" format (mode time size name)
  24.  */
  25.  
  26. int
  27. ls_long(buf, nelem)
  28. struct OUTBUF *buf;
  29. int nelem;
  30. {
  31.     int n = 0;
  32.     char modebuf[5];
  33.     static void modestr(unsigned short, char *);
  34.  
  35.     while (nelem-- > 0) {
  36.         /* convert mode number to a string */
  37.         modestr(buf->o_mode, modebuf);
  38.         printf("%s ", modebuf);
  39.  
  40.         /* display file size in bytes */
  41.         if ((buf->o_mode & SUBDIR) == SUBDIR)
  42.             printf("        ");
  43.         else
  44.             printf("%7ld ", buf->o_size);
  45.  
  46.         /* convert date and time values to formatted presentation */
  47.         printf("%02d-%02d-%02d ", (buf->o_date >> MONTH_SHIFT) & MONTH_MASK,
  48.             buf->o_date & DAY_MASK, (buf->o_date >> YEAR_SHIFT) + DOS_EPOCH);
  49.         printf("%02d:%02d ", (buf->o_time >> HOUR_SHIFT) & HOUR_MASK,
  50.             (buf->o_time >> MINUTE_SHIFT) & MINUTE_MASK);
  51.  
  52.         /* display filenames as lowercase strings */
  53.         printf("%s\n", strlwr(buf->o_name));
  54.  
  55.         ++buf;
  56.         ++n;
  57.     }
  58.  
  59.     /* tell caller how many entries were printed */
  60.     return (n);
  61. } /* end ls_long() */
  62.  
  63.  
  64. /*
  65.  *    ls_single -- list items in a single column
  66.  */
  67.  
  68. int
  69. ls_single(buf, nelem)
  70. struct OUTBUF *buf;
  71. int nelem;
  72. {
  73.     int n = 0;
  74.  
  75.     while (nelem-- > 0) {
  76.         printf("%s", strlwr(buf->o_name));
  77.         if (Filetype && (buf->o_mode & SUBDIR) == SUBDIR)
  78.             putchar('\\');
  79.         putchar('\n');
  80.         ++buf;
  81.         ++n;
  82.     }
  83.  
  84.     /* tell caller how many entries were printed */
  85.     return (n);
  86. } /* end ls_single() */
  87.  
  88.  
  89. /*
  90.  *    ls_multi -- list items in multiple columns that
  91.  *    vary in width and number based on longest item size
  92.  */
  93.  
  94. int
  95. ls_multi(buf, nelem)
  96. struct OUTBUF *buf;
  97. int nelem;
  98. {
  99.     int i, j;
  100.     int errcount = 0;
  101.     struct OUTBUF *tmp;    /* temporary buffer pointer */
  102.     struct OUTBUF *base;    /* buffer pointer for multi-col output */
  103.     int n;            /* number of items in list */
  104.     int len, maxlen;    /* pathname lengths */
  105.     int ncols;        /* number of columns to output */
  106.     int nlines;        /* number of lines to output */
  107.  
  108.     /*
  109.      *  get length of longest pathname and calculate number
  110.      *  of columns and lines (col width = maxlen + 1)
  111.      */
  112.     tmp = buf;
  113.     n = 0;
  114.     maxlen = 0;
  115.     for (tmp = buf, n = 0; n < nelem; ++tmp, ++n)
  116.         if ((len = strlen(tmp->o_name)) > maxlen)
  117.             maxlen = len;
  118.     /*
  119.      *  use width of screen - 1 to allow for newline at end of
  120.      *  line and leave two spaces between entries (one for optional
  121.      *  file type flag)
  122.      */
  123.     ncols = (MAXCOL - 1) / (maxlen + 2);
  124.     nlines = n / ncols;
  125.     if (n % ncols)
  126.         ++nlines;
  127.  
  128.     /* output multi-column list */
  129.     base = buf;
  130.     for (i = 0; i < nlines; ++i) {
  131.         tmp = base;
  132.         for (j = 0; j < ncols; ++j) {
  133.             len = maxlen + 2;
  134.             len -= printf("%s", strlwr(tmp->o_name));
  135.             if (Filetype && (tmp->o_mode & SUBDIR) == SUBDIR) {
  136.                 putchar('\\');
  137.                 --len;
  138.             }
  139.             while (len-- > 0)
  140.                 putchar(' ');
  141.             tmp += nlines;
  142.             if (tmp - buf >= nelem)
  143.                 break;
  144.         }
  145.         putchar('\n');
  146.         ++base;
  147.     }
  148.  
  149.     return (errcount);
  150. } /* end ls_multi() */
  151.  
  152.  
  153. static void
  154. modestr(mode, s)
  155. unsigned short mode;    /* file mode number */
  156. char s[];        /* mode string buffer */
  157. {
  158.  
  159.     /* fill in the mode string to show what's set */
  160.     s[0] = (mode & SUBDIR) == SUBDIR ? 'd' : '-';
  161.     s[1] = (mode & HIDDEN) == HIDDEN ? 'h' : '-';
  162.     s[2] = (mode & SYSTEM) == SYSTEM ? 's' : '-';
  163.     s[3] = (mode & READONLY) == READONLY ? 'r' : '-';
  164.     s[4] = '\0';
  165. } /* end modestr() */
  166.