home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_01_02 / 1n02057a < prev    next >
Text File  |  1990-07-09  |  6KB  |  198 lines

  1. /*
  2. **  Listing 5 - A simple directory lister
  3. */
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <ctype.h>
  9.  
  10. /* For portability, make everything look like MSC 6 */
  11.  
  12. #ifdef __ZTC__
  13.  #include <mflfiles.h>  /* ZTC doesn't do recursive find first/next...  */
  14.  #include <msport.h>    /* ...so use MFLZT library functions            */
  15. #elif defined(__TURBOC__)
  16.  #include <dir.h>
  17.  #include <dos.h>
  18.  #define _dos_findfirst(f,a,b) findfirst(f,b,a)
  19.  #define _dos_findnext(b)      findnext(b)
  20.  #define _dos_getdiskfree(d,s) getdfree(d,s)
  21.  #define find_t ffblk
  22.  #define diskfree_t dfree
  23.  #define _A_SUBDIR FA_DIREC
  24.  #define attrib ff_attrib
  25.  #define name ff_name
  26.  #define size ff_fsize
  27.  #define wr_time ff_ftime
  28.  #define wr_date ff_fdate
  29.  #define avail_clusters df_avail
  30.  #define sectors_per_cluster df_sclus
  31.  #define bytes_per_sector df_bsec
  32. #else                   /* assume MSC/QC                                */
  33.  #include <dos.h>
  34.  #include <errno.h>
  35. #endif
  36.  
  37. #ifndef SUCCESS
  38.  #define SUCCESS 0
  39. #endif
  40.  
  41. #ifndef __ZTC__         /* these are included with mflfiles.h           */
  42.  #ifdef TRUE
  43.   #undef TRUE
  44.  #endif
  45.  #ifdef FALSE
  46.   #undef FALSE
  47.  #endif
  48.  #ifdef ERROR
  49.   #undef ERROR
  50.  #endif
  51.  enum LOGICAL {FALSE, TRUE};
  52. #endif
  53.  
  54. #ifndef CAST
  55.  #define CAST(new_type,old_object) (*((new_type *)&(old_object)))
  56. #endif
  57.  
  58. struct DOS_TIME {
  59.         unsigned int ss : 5;
  60.         unsigned int mm : 6;
  61.         unsigned int hh : 5;
  62.         } ;
  63. #define dos_time(t) CAST(struct DOS_TIME, (t))
  64.  
  65. struct DOS_DATE {
  66.         unsigned int da : 5;
  67.         unsigned int mo : 4;
  68.         unsigned int yr : 7;
  69.         } ;
  70. #define dos_date(t) CAST(struct DOS_DATE, (t))
  71.  
  72. main(int argc, char *argv[])
  73. {
  74.         int i, files = 0, dirs = 0, argptr = 0, errflag = FALSE, cols;
  75.         long siz_tot = 0L;
  76.         char *p, *fname, *ext, name[13], buf[67], numbuf[12];
  77.         struct find_t ff;
  78.         struct diskfree_t df;
  79.         int one_column(), five_column(), (*display)() = one_column;
  80.         char *sprintfc(char *, long);
  81.  
  82.         strcpy(buf, fname = "*.*");
  83.         if(argc != 1)   for (i = 1; i < argc; ++i)
  84.         {
  85.                 if ('/' == argv[i][0])
  86.                 {
  87.                         if ('W' == toupper(argv[i][1]))
  88.                                 display = five_column;
  89.                         else
  90.                         {
  91.                                 puts("\aUsage: LSDIR [/W] [file]");
  92.                                 errflag = TRUE;
  93.                         }
  94.                 }
  95.                 else    if (!argptr)    argptr = i;
  96.         }
  97.         if (argptr)
  98.         {
  99.                 fname = argv[argptr];
  100.                 if (!(_dos_findfirst(fname, _A_SUBDIR, &ff)))
  101.                 {
  102.                         if (ff.attrib & _A_SUBDIR)
  103.                                 strcat(strcpy(buf, fname), "\\*.*");
  104.                         else    strcpy(buf, fname);
  105.                 }
  106.                 else    errflag = TRUE;
  107.         }
  108.         if (!errflag && !(_dos_findfirst(buf, 0xff, &ff))) do
  109.         {
  110.                 siz_tot += ff.size;
  111.                 if (ff.attrib & _A_SUBDIR)
  112.                         ++dirs;
  113.                 else    ++files;
  114.                 strcpy(name, ff.name);
  115.                 if (NULL != (p = strchr(name, '.')) && p != name)
  116.                 {
  117.                         *p  = '\0';
  118.                         ext = ++p;
  119.                 }
  120.                 else    ext = "";
  121.                 cols = (*display)(name, ext, ff.size,
  122.                         ff.attrib, ff.wr_date, ff.wr_time);
  123.         } while (SUCCESS == _dos_findnext(&ff));
  124.         else
  125.         {
  126.                 fprintf(stderr, "Cannot do directory on '%s'\n", fname);
  127.                 exit(-1);
  128.         }
  129.         if (cols)
  130.                 fputc('\n', stdout);
  131.         sprintfc(numbuf,siz_tot);
  132.         printf("\n%3d Files totalling %s bytes\n", files, numbuf);
  133.         printf("%3d Director%s\n", dirs, (1 == dirs) ? "y" : "ies");
  134.         _dos_getdiskfree(0, &df);
  135.         sprintfc(numbuf, (long)df.avail_clusters * df.sectors_per_cluster *
  136.                 df.bytes_per_sector);
  137.         printf("%s bytes free\n", numbuf);
  138.         exit(0);
  139. }
  140.  
  141. int one_column(char    *name,
  142.                char    *ext,
  143.                long     size,
  144.                unsigned attribs,
  145.                unsigned date,
  146.                unsigned time)
  147. {
  148.         register int i, mask;
  149.         static char *atr = "RHSVDA";
  150.  
  151.         printf("%-8s %-3s %9ld  ", name, ext, size);
  152.         for (i = 0, mask = 1; i < 6; ++i, mask <<= 1)
  153.                 if (attribs & mask)
  154.                         fputc(atr[i], stdout);
  155.                 else    fputc('.'   , stdout);
  156.         printf("%4d-%02d-%02d%4d:%02d:%02d\n",
  157.                 dos_date(date).mo,
  158.                 dos_date(date).da,
  159.                 (dos_date(date).yr + 80) % 100,
  160.                 dos_time(time).hh,
  161.                 dos_time(time).mm,
  162.                 dos_time(time).ss);
  163.         return 0;
  164. }
  165.  
  166. int five_column(char    *name,
  167.                 char    *ext,
  168.                 long     size,
  169.                 unsigned attribs,
  170.                 unsigned date,
  171.                 unsigned time)
  172. {
  173.         static int cols = 0;
  174.  
  175.         printf("%-8s %-3s%s", name, ext, (5 > ++cols) ? "    " : "");
  176.         if (0 == (cols %= 5))
  177.                 putchar('\n');
  178.         return (cols);
  179. }
  180.  
  181. char *sprintfc(char *string, long num)
  182. {
  183.         if (num > 999999L)
  184.                 sprintf(string, "%d,%03d,%03d",
  185.                         (int)(num / 1000000L),
  186.                         (int)((num % 1000000L) / 1000L),
  187.                         (int)(num % 1000L));
  188.         else
  189.         {
  190.                 if (num > 999L)
  191.                         sprintf(string, "%d,%03d",
  192.                                 (int)(num / 1000L),
  193.                                 (int)(num % 1000L));
  194.                 else sprintf(string, "%d", (int)num);
  195.         }
  196.         return string;
  197. }
  198.