home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d5xx / d540 / browser.lha / Browser / BrowserII_Src.LZH / File.c < prev    next >
C/C++ Source or Header  |  1991-07-20  |  4KB  |  150 lines

  1. /*
  2.  *    File.c - Copyright © 1991 by S.R. & P.C.
  3.  *
  4.  *    Created:    13 Apr 1991  15:35:28
  5.  *    Modified:    20 Jul 1991  12:25:54
  6.  *
  7.  *    Make>> make
  8.  */
  9.  
  10. #include "Global.h"
  11. #include "DosVar.h"
  12. #include "proto/File.h"
  13. #include "proto/String.h"
  14. #include "proto/Request.h"
  15.  
  16.  
  17. /*
  18.  *    Examine() the file, assume it is in the current dir. If Request is TRUE
  19.  *  user will be requested for an answer. If not and file can't be locked
  20.  *    or examined, return A_SKIP to tell "couldn't get fib"!
  21.  */
  22.  
  23. short GetFib(char *Name, struct FileInfoBlock *fib, BOOL Request)
  24. {
  25.     BPTR L;
  26.     short Ok = A_RETRY;
  27.  
  28.     while (Ok == A_RETRY && !(L = Lock(Name, ACCESS_READ))) {
  29.         if (Request)
  30.             Ok = ThreeGadRequest("Retry", "Skip", "Couldn't access \"%s\"\n%s.", Name, StrIoErr());
  31.         else
  32.             Ok = A_SKIP;
  33.     }
  34.     if (Ok == A_RETRY) {
  35.         while (Ok == A_RETRY && !Examine(L, fib)) {
  36.             if (Request)
  37.                 Ok = ThreeGadRequest("Retry", "Skip", "Couldn't get info for \"%s\"\n%s.", Name, StrIoErr());
  38.             else
  39.                 Ok = A_SKIP;
  40.         }
  41.         UnLock(L);
  42.     }
  43.     return Ok;
  44. }
  45.  
  46.  
  47. /* Convert DateStamp into a number of seconds since 1-Jan-78 */
  48.  
  49. long Date2Secs(struct DateStamp *ds)
  50. {
  51.     return ds->ds_Days*86400 + ds->ds_Minute*60 + ds->ds_Tick/50;
  52. }
  53.  
  54.  
  55. /* Free memory used by FileInfo, not the FileInfo itself */
  56.  
  57. void CleanFileInfo(struct FileInfo *FileInfo)
  58. {
  59.     FreeStr(FileInfo->fi_Comment);
  60.     FileInfo->fi_Comment = NULL;
  61. }
  62.  
  63.  
  64. /* duplicate a FileInfo */
  65.  
  66. void CopyFileInfo(struct FileInfo *Dest, struct FileInfo *Src)
  67. {
  68.     CleanFileInfo(Dest);
  69.     *Dest = *Src;
  70.     if (Src->fi_Comment)
  71.         Dest->fi_Comment = CopyStr(Src->fi_Comment);
  72. }
  73.  
  74.  
  75. /* Convert a FileInfoBlock into a FileInfo */
  76.  
  77. BOOL Fib2Fi(struct FileInfo *fi, struct FileInfoBlock *fib)
  78. {
  79.     CleanFileInfo(fi);                        /* Free comment before alloc of new one */
  80.     fi->fi_Type = (fib->fib_DirEntryType < 0) ? DLX_FILE : DLX_DIR;
  81.     strcpy(fi->fi_Name, fib->fib_FileName);
  82.     fi->fi_Size = fib->fib_Size;
  83.     fi->fi_NumBlocks = fib->fib_NumBlocks;
  84.     fi->fi_DiskKey = fib->fib_DiskKey;
  85.     fi->fi_Date = fib->fib_Date;
  86.     fi->fi_Secs = Date2Secs(&fib->fib_Date);
  87.     fi->fi_Protection = fib->fib_Protection ^ 0x0F;    /* Complement 4 lower bits so all work the same way */
  88.     if (strlen(fib->fib_Comment) > 0) {
  89.         if (!(fi->fi_Comment = CopyStr(fib->fib_Comment)))
  90.             return FALSE;
  91.         fi->fi_Protection |= FIBF_COMMENT;    /* our magic bit! */
  92.     }
  93.     return TRUE;
  94. }
  95.  
  96.  
  97. static BOOL Match(struct FileInfo *FileInfo, struct SelectInfo *SelectInfo)
  98. {
  99.     char buf[PATTERN_BUF_SIZE];
  100.  
  101.     if (FileInfo->fi_Type == DLX_FILE) {
  102.         if (SelectInfo->si_Flags & SI_ALL_FILES)
  103.             return TRUE;
  104.         else if (!(SelectInfo->si_Flags & SI_MATCH_FILES))
  105.             return FALSE;
  106.     }
  107.     else {    /* DLX_DIR */
  108.         if (SelectInfo->si_Flags & SI_ALL_DIRS)
  109.             return TRUE;
  110.         else if (!(SelectInfo->si_Flags & SI_MATCH_DIRS))
  111.             return FALSE;
  112.     }
  113.     if (SelectInfo->si_Flags & SI_NAME) {
  114.         UStrcpy(buf, FileInfo->fi_Name);
  115.         if (!(PatternMatch(SelectInfo->si_PatTok, buf)))
  116.             return FALSE;
  117.     }
  118.     if (FileInfo->fi_Size < SelectInfo->si_MinSize)
  119.         return FALSE;
  120.     if (SelectInfo->si_MaxSize && (FileInfo->fi_Size > SelectInfo->si_MaxSize))
  121.         return FALSE;
  122.     if (SelectInfo->si_Flags & SI_SINCEDATE) {
  123.         if (FileInfo->fi_Secs < SelectInfo->si_SinceSecs)
  124.             return FALSE;
  125.     }
  126.     if (SelectInfo->si_Flags & SI_BEFOREDATE) {
  127.         if (FileInfo->fi_Secs > SelectInfo->si_BeforeSecs)
  128.             return FALSE;
  129.     }
  130.     if (SelectInfo->si_Flags & SI_POSPROTECTION) {
  131.         if (!(FileInfo->fi_Protection & SelectInfo->si_PosProtect))
  132.             return FALSE;
  133.     }
  134.     if (SelectInfo->si_Flags & SI_NEGPROTECTION) {
  135.         if (FileInfo->fi_Protection & SelectInfo->si_NegProtect)
  136.             return FALSE;
  137.     }
  138.     return TRUE;
  139. }
  140.  
  141.  
  142. BOOL MatchFilters(struct FileInfo *FileInfo, struct SelectInfo *SelectInfo)
  143. {
  144.     BOOL ret;
  145.  
  146.     ret = Match(FileInfo, SelectInfo);
  147.     return (SelectInfo->si_Flags & SI_INVERT) ? !ret : ret;
  148. }
  149.  
  150.