home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / clarion / readdir.zip / READDIR.C < prev    next >
Text File  |  1989-12-19  |  3KB  |  109 lines

  1. #include <dir.h>
  2. #include <dos.h>
  3. #include <errno.h>
  4. #include "lm.h"
  5. #include "readdir.h"
  6.  
  7. #define    SECONDS_MASK    31
  8. #define    MINUTES_SHIFT    5
  9. #define    MINUTES_MASK    63
  10. #define    HOURS_SHIFT        6
  11. #define    DAY_MASK            31
  12. #define    MONTH_SHIFT        5
  13. #define    MONTH_MASK        15
  14. #define    YEAR_SHIFT        4
  15.  
  16. static struct ffblk ffBlk;
  17.  
  18. typedef struct {
  19.     struct {
  20.         char    ReadOnly;
  21.         char    Hidden;
  22.         char    System;
  23.         char    Label;
  24.         char    Directory;
  25.         char    Archive;
  26.     } Attr;
  27.  
  28.     long    Time;
  29.     long    Date;
  30.     long    FileSize;
  31.     char    FileName[12];
  32.  
  33. } DirType;
  34.  
  35. /***************
  36. /    CopyEntry()
  37. /***************/
  38. void CopyEntry ( DirType *DirEntry )
  39. {
  40.     register unsigned int X, Seconds, Minutes;
  41.  
  42.  
  43.     /* ---------- File Attributes ---------- */
  44.     DirEntry->Attr.ReadOnly        = ffBlk.ff_attrib & FA_RDONLY;
  45.     DirEntry->Attr.Hidden        = ffBlk.ff_attrib & FA_HIDDEN;
  46.     DirEntry->Attr.System        = ffBlk.ff_attrib & FA_SYSTEM;
  47.     DirEntry->Attr.Label            = ffBlk.ff_attrib & FA_LABEL;
  48.     DirEntry->Attr.Directory    = ffBlk.ff_attrib & FA_DIREC;
  49.     DirEntry->Attr.Archive        = ffBlk.ff_attrib & FA_ARCH;
  50.  
  51.     /* ---------- Creation Time ---------- */
  52.     Seconds            = (X = ffBlk.ff_ftime) & SECONDS_MASK;
  53.     Minutes            = (X >>= MINUTES_SHIFT) & MINUTES_MASK;
  54.     DirEntry->Time    = time2abs((X >>= HOURS_SHIFT), Minutes,
  55.                                     Seconds, (unsigned) 0);
  56.  
  57.  
  58.     /* ---------- Creation Date ---------- */
  59.     #define    Day        Seconds
  60.     #define    Month        Minutes
  61.     Day    = (X = ffBlk.ff_fdate) & DAY_MASK;
  62.     Month = (X >>= MONTH_SHIFT) & MONTH_MASK;
  63.     DirEntry->Date = date2abs(Month, Day, (X >>= YEAR_SHIFT)+1980);
  64.     #undef    Day
  65.     #undef    Month
  66.  
  67.     /* ---------- File Size ---------- */
  68.     DirEntry->FileSize = ffBlk.ff_fsize;
  69.  
  70.     /* ---------- File Name ---------- */
  71.     #define InString Seconds
  72.     for (X=0, InString=1; X < sizeof(DirEntry->FileName); X++) {
  73.         if (!ffBlk.ff_name[X]) InString=0;
  74.         DirEntry->FileName[X] = (InString) ? ffBlk.ff_name[X] : ' ';
  75.     }
  76.     #undef InString
  77. }
  78.  
  79. /****************
  80. /    FindFirstC()
  81. /****************/
  82. void pascal FindFirstC (    char        *MaskParm,
  83.                                     int        MaskLen,
  84.                                     DirType    *DirEntry )
  85. {
  86.     char    Mask[13];
  87.  
  88.     strncpy(Mask, MaskParm, MaskLen);
  89.     Mask[MaskLen] = '\0';
  90.  
  91.     if (findfirst(Mask, &ffBlk,    FA_RDONLY | FA_HIDDEN | FA_SYSTEM |
  92.                                             FA_LABEL  | FA_DIREC  | FA_ARCH ) != -1)
  93.         CopyEntry(DirEntry);
  94.  
  95.     else setclaerr(errno);
  96. }
  97.  
  98. /***************
  99. /    FindNextC()
  100. /***************/
  101. void pascal FindNextC ( DirType *DirEntry )
  102. {
  103.     if (findnext(&ffBlk) != -1)
  104.         CopyEntry(DirEntry);
  105.     else
  106.         setclaerr(errno);
  107. }
  108.  
  109.