home *** CD-ROM | disk | FTP | other *** search
/ Hall of Fame / HallofFameCDROM.cdr / proglc / zoo141_c.lzh / ZOOADD2.C < prev    next >
C/C++ Source or Header  |  1987-02-07  |  6KB  |  185 lines

  1. /* zooadd2.c */
  2. /*
  3. Copyright (C) 1986 Rahul Dhesi -- All rights reserved
  4. */
  5. #include "options.h"
  6. #include "zoo.h"
  7. #include <stdio.h>
  8. #include "various.h"
  9. #include "zoofns.h"
  10. #include "errors.i"
  11. #include "assert.h"
  12. #include "debug.h"
  13. #include "parse.h"
  14.  
  15. /*
  16. Miscellaneous routines to support zooadd().
  17. */
  18.  
  19. /****************
  20. This function is called with zoo_file positioned to the first
  21. directory entry in an archive.  It skips past all existing files,
  22. counts the number of deleted files, saves the latest data and time
  23. encountered, and adds all filenames encountered to a global list. The
  24. long filename is added if available, else the MSDOS filename is
  25. added.  
  26. */
  27.  
  28. void skip_files (zoo_file, latest_date, latest_time, delcount, 
  29.                   latest_name, latest_pos)
  30. FILE *zoo_file;
  31. unsigned int *latest_date, *latest_time;
  32. int *delcount;
  33. char latest_name[];
  34. long *latest_pos;
  35. {
  36.    char *whichname;                    /* will point to name to use */
  37.    long save_offset, next_ptr;
  38.    struct direntry direntry;
  39.    struct direntry *drp = &direntry;
  40.  
  41.    *latest_pos = 0L;
  42.    do {
  43.       /* read a directory entry */
  44.       save_offset = ftell (zoo_file);     /* save pos'n of this dir entry */
  45.       readdir (&direntry, zoo_file, 1);   /* read directory entry */
  46.       if (drp->next == 0L) {                 /* END OF CHAIN */
  47.          fseek (zoo_file, save_offset, 0);      /* back up */
  48.          break;                                 /* EXIT on end of chain */
  49.       } else
  50.          *latest_pos = save_offset;
  51.       /* remember most recent date and time, for files not marked deleted */
  52.       if (!drp->deleted)
  53.          if (drp->date > *latest_date ||
  54.             (drp->date == *latest_date && drp->time > *latest_time)) {
  55.                *latest_date = drp->date;
  56.                *latest_time = drp->time;
  57.          }
  58.       next_ptr = drp->next;            /* ptr to next dir entry */
  59.       if (drp->deleted)
  60.          ++(*delcount);                      /* count deleted entries */
  61.       /* add name of file and position of direntry into global list */
  62.       /* but only if the entry is not deleted */
  63.       if (!drp->deleted) {
  64. #ifdef FOLD
  65.          strlwr(drp->fname);
  66. #endif
  67.          /* if long filename available, use it, else use short filename */
  68.          whichname = (drp->namlen > 0) ? drp->lfname : drp->fname;
  69.          addfname (whichname, save_offset, drp->date, drp->time);
  70.          strcpy (latest_name, whichname);   /* save as latest name */
  71.       }
  72.       fseek (zoo_file, next_ptr, 0);   /* ..seek to next dir entry */
  73.    } while (next_ptr != 0L);              /* loop terminates on null ptr */
  74. }
  75.  
  76. /*******************/
  77. /* kill_files() deletes all files in the supplied list of pointers to
  78. filenames */
  79.  
  80. int kill_files (flist, pathlength)
  81. char *flist[];                      /* list of ptrs to input fnames */
  82. int pathlength;                     /* length of longest pathname */
  83. {
  84.    int status = 0;
  85.    int fptr;
  86.    prterror ('M', "-----\nErasing added files...\n");
  87.    for (fptr = 0;  flist[fptr] != NULL; fptr++) {
  88.       prterror ('m', "%-*s -- ", pathlength, flist[fptr]);
  89.       if (unlink (flist[fptr]) == 0) {
  90.          prterror ('M', "erased\n");
  91.       } else {
  92.          prterror ('w', "Could not erase %s.\n", flist[fptr]);
  93.          status = 1;
  94.       }
  95.    }
  96.    return (status);
  97. }
  98.  
  99. #ifndef PORTABLE
  100. /*******************/
  101. void copyfields (drp, thp)
  102. struct direntry *drp;
  103. struct tiny_header *thp;
  104. {
  105.    drp->org_size = thp->org_size;
  106.    drp->file_crc = thp->file_crc;
  107.    drp->size_now = thp->size_now;
  108.    drp->major_ver = thp->major_ver;
  109.    drp->minor_ver = thp->minor_ver;
  110. }
  111. #endif
  112.  
  113. /*******************/
  114. /* processes option switches for zooadd() */
  115. void opts_add (option, zootime, quiet, suppress, move, new, pack,
  116.           update, add_comment, z_fmt, need_dir)
  117. char *option;
  118. int *zootime, *quiet, *suppress, *move, *new, *pack,
  119.    *update, *add_comment, *z_fmt, *need_dir;
  120.  
  121. {
  122.    if (*option == 'T') {
  123.       (*zootime)++;
  124.       option++;
  125.       while (*option) {
  126.          switch (*option) {
  127.             case 'q': (*quiet)++; break;
  128.             default:
  129.                prterror ('f', inv_option, *option);
  130.          }
  131.       option++;
  132.       }
  133.    }
  134.    
  135.    while (*option) {
  136.       switch (*option) {
  137.          case 'a': break;  
  138.          case 'f': (*suppress)++; break;        /* suppress compression */
  139.          case 'M': (*move)++; break;            /* delete files after adding them */
  140.          case 'n': (*new)++; break;             /* add only files not in archive */
  141.          case 'P': (*pack)++; break;            /* pack after adding */
  142.          case 'u': (*update)++;   break;        /* add only files already in archive */
  143.          case 'q': (*quiet)++; break;           /* be quiet */
  144.          case 'c': (*add_comment)++; break;     /* add comment */
  145.          case ':': *need_dir = 0; break;        /* don't store directories */
  146. #ifndef PORTABLE
  147.          case 'z': (*z_fmt)++; break;           /* look for Z format files */
  148. #endif
  149.          default:
  150.             prterror ('f', inv_option, *option);
  151.       }
  152.       option++;
  153.    } /* end while */
  154. }  
  155.  
  156.  
  157. /* 
  158. Stores long filename into direntry.lfname iff it is different from MSDOS
  159. filename.  Also stores directory name if need_dir is true.  Moved out of 
  160. zooadd() so zooadd() doesn't get too big for optimization.
  161. */
  162. void storefname (direntry, this_path, need_dir)
  163. struct direntry *direntry;
  164. char *this_path;
  165. int need_dir;
  166. {
  167.    struct path_st path_st;
  168.    parse (&path_st, this_path);
  169.    direntry->lfname[0] = '\0';
  170.    direntry->namlen = 0;
  171.    if (strcmp(path_st.lfname,direntry->fname) != 0) {
  172.          strcpy (direntry->lfname, path_st.lfname); /* full filename */
  173.          direntry->namlen = strlen(direntry->lfname) + 1;
  174.    }
  175.    if (need_dir) {
  176.       strcpy (direntry->dirname, path_st.dir);   /* directory name */
  177.       direntry->dirlen = strlen(direntry->dirname) + 1;
  178.       if (direntry->dirlen == 1) /* don't store trailing null alone */
  179.          direntry->dirlen = 0;
  180.    } else {
  181.       direntry->dirname[0] = '\0';
  182.       direntry->dirlen = 0;
  183.    }
  184. }
  185.