home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 4 / FreshFish_May-June1994.bin / useful / dist / util / arc / zoo / zoolist.c < prev    next >
C/C++ Source or Header  |  1991-08-03  |  17KB  |  591 lines

  1. #ifndef LINT
  2. /* derived from: zoolist.c 2.27 88/08/15 11:03:16 */
  3. static char sccsid[]="$Source: /usr/home/dhesi/zoo/RCS/zoolist.c,v $\n\
  4. $Id: zoolist.c,v 1.4 91/07/09 01:54:16 dhesi Exp $";
  5. #endif /* LINT */
  6.  
  7. /*
  8. If TRACE_LIST is defined, any list command may be followed
  9. by 'D' to show verbose information about each directory
  10. entry in the archive.    Do not define both TRACE_LIST and
  11. TRACE_IO else a symbol conflict will occur and in any case
  12. duplicate information will be dumped.
  13. */
  14.  
  15. /* #define TRACE_LIST */
  16.  
  17. /*
  18. Copyright (C) 1986, 1987 Rahul Dhesi -- All rights reserved
  19. (C) Copyright 1988 Rahul Dhesi -- All rights reserved
  20. */
  21. #include "options.h"
  22. #include "portable.h"
  23. #include "zoomem.h"  /* to get ZOOCOUNT */
  24.  
  25. /* Lists files in archive */
  26. #include "zoo.h"
  27. #include "errors.i"
  28. #include "zooio.h"
  29. #include "various.h"
  30. #include "zoofns.h"
  31. #include <stdio.h>
  32.  
  33. #ifdef TRACE_LIST
  34. void show_dir PARMS ((struct direntry *direntry));
  35. static int trace_list = 0;
  36. #endif /* TRACE_LIST */
  37.  
  38. static char tot_fmt[] = "%8lu %3u%% %8lu  %4d file";
  39. static char tot_line[] =
  40.     /* "------------  --------  ---  --------  --------- --------\n"; */
  41.     "--------  --- --------  --------- --------\n";
  42.  
  43. static char dbl_percent[] = "Archive %s:  %s";
  44.  
  45. extern int quiet;             /* assumed initialized to zero */
  46.  
  47. void show_comment PARMS((struct direntry *, ZOOFILE, int, char *));
  48. int ver_too_high PARMS((struct zoo_header *));
  49. int needed PARMS((char *, struct direntry *, struct zoo_header *));
  50. void printtz PARMS((int));
  51.  
  52. void zoolist (argv, option, argc)
  53. char **argv, *option;
  54. int argc;
  55. {
  56. char whichname[PATHSIZE];    /* which name to use */
  57. char *this_zoo;                /* currently matched archive name */
  58. register ZOOFILE zoo_file;
  59. char *flist[ZOOCOUNT];          /* list of ptrs to input archive names */
  60. int fptr;                        /* will point to within list of archive names */
  61.  
  62. struct direntry direntry;
  63. struct zoo_header zoo_header;
  64. int size_factor;
  65. unsigned long tot_org_siz = 0L, tot_siz_now = 0L;
  66. int    tot_sf;
  67. int file_count = 0;
  68. int del_count = 0;                        /* number of deleted entries */
  69. int bad_pack;                        /* 1 if packing method is unknown */
  70. static char *month_list="000JanFebMarAprMayJunJulAugSepOctNovDec";
  71. static char dashes[] = "------------\n";
  72. int year, month, day, hours, min, sec;
  73. int list_deleted = 0;            /* list deleted files too */
  74. int fast = 0;                        /* fast list */
  75. long fiz_ofs = 0;                 /* offset where to start */
  76. long dat_ofs = 0;                 /* ... data offset of file data */
  77. int verb_list = 0;                /* if verbose listing needed */
  78. int show_name = 0;                /* if archive name to be included in listing */
  79. int show_crc = 0;                 /* if crc should be listed */
  80. int zoocount = 1;                 /* number of archives to list */
  81. int biglist = 0;                    /* multiarchive listing */
  82. int one_col = 0;                    /* one column listing requested */
  83. int showdir = 0;                    /* show directory name in fast listing */
  84. int longest;                        /* length of longest archive name */
  85. int talking;                        /* opposite of quiet */
  86. int column = 0;                    /* for column printing */
  87. int first_ever = 1;                /* first time ever -- very special case */
  88. int neednl = 0;                    /* whether to print a newline */
  89. int need_acmt = 0;                /* show archive comment */
  90. int show_gen = 0;                 /* show generation count */
  91. int genson = 1;                    /* enable/disable generations */
  92. #ifdef FATTR
  93. int show_mode = 0;                /* show file protection */
  94. #endif
  95. int first_dir = 1;                /* if first direntry -- to adjust dat_ofs */
  96.  
  97. while (*option) {
  98.     switch (*option) {
  99.         case 'a': show_name++; break;
  100. #ifdef TRACE_LIST
  101.         case 'D': trace_list++; break;
  102. #endif /* TRACE_LIST */
  103.         case 'd': list_deleted++; break;
  104.         case 'f': fast++; break;
  105.         case 'g': show_gen++; break;
  106.         case '/': showdir++; break;
  107.         case 'A':
  108.         case 'v': need_acmt++; break;
  109.         case 'V': need_acmt++; /* fall through */
  110.         case 'c': verb_list++; break;
  111.         case 'C': show_crc++; break;
  112.         case 'l': break;
  113.         case 'L': biglist++; zoocount = argc; break;
  114. #ifdef FATTR
  115.         case 'm': show_mode++; break;
  116. #endif
  117.         case '1': one_col++; break;
  118.         case '+': genson = 1; break;
  119.         case '-': genson = 0; break;
  120.         /* following code same as in zooext.c */
  121.         case '@':   /* if @m,n specified, fiz_ofs = m, dat_ofs = n */
  122.             {
  123.                 char *comma_pos;
  124.                 ++option;
  125.                 comma_pos = strchr(option, ',');
  126.                 if (comma_pos != NULL) {
  127.                     dat_ofs = calc_ofs (comma_pos + 1);
  128.                     *comma_pos = '\0';
  129.                 }
  130.                 fiz_ofs = calc_ofs(option);
  131.                 goto no_more;
  132.             }
  133.         case 'q': quiet++; break;
  134.         default:
  135.             prterror ('w', option_ignored, *option);
  136.     }
  137.     option++;
  138. }
  139.  
  140. no_more:  /* come from exit from while loop above */
  141.  
  142. if (fast && show_name) {      /* don't allow 'a' with 'f' */
  143.     show_name = 0;
  144.     prterror ('w', option_ignored, 'a');
  145. }
  146.  
  147. talking = !quiet;                 /* for convenience */
  148.  
  149. #ifdef WILDCARD
  150.     /* For each archive name supplied, if it is not a char range and
  151.         does not contain a dot, append "*.zoo". */
  152.     {
  153.         int i;
  154.         for (i = 0; i < argc;  i++) {
  155.             if (strchr (nameptr (argv[i]), EXT_CH) == NULL &&
  156.                                     !match_half (nameptr (argv[0]), "?-?"))
  157.                 argv[i] = newcat (argv[i], "*.zoo");
  158.         }
  159.     }
  160. #endif
  161.  
  162. makelist (zoocount, argv, flist,        ZOOCOUNT-2,   (char *) NULL,".","..", &longest);
  163. /*          ^argc      ^argv ^list_pointer ^max_no_files   ^exclude */
  164.  
  165. for (fptr = 0;  (this_zoo = flist[fptr]) != NULL; fptr++) {
  166.     int ercount;                        /* count of errors */
  167.     int entrycount;                    /* count of directory entries */
  168.     int expl_deleted;                 /* explain what D means */
  169.     int expl_comment;                 /* explain what comment means */
  170.     int expl_ver;                        /* Explain what V means */
  171.     int expl_star;                     /* Explain what * means */
  172.     int first_time;                    /* first time through loop for an archive */
  173.  
  174.     ercount = entrycount = del_count =
  175.         expl_deleted = expl_comment = expl_ver = expl_star = 0;
  176.  
  177.     if (talking)
  178.         column = 0;                     /* if quiet, names will run together */
  179.  
  180.     first_time = 1;
  181.  
  182. #ifndef WILDCARD
  183.     /* Add default extension if none supplied */
  184.     if (strchr (nameptr (this_zoo), EXT_CH) == NULL)
  185.         this_zoo = newcat (this_zoo, EXT_DFLT);
  186. #endif
  187.  
  188.     zoo_file = zooopen (this_zoo, Z_READ);
  189.  
  190.     if (zoo_file == NOFILE) {
  191.         prterror ('e', could_not_open, this_zoo);
  192.         continue;
  193.     } else if (!show_name && talking)
  194.         printf ("\nArchive %s:\n", this_zoo);
  195.  
  196. if (fiz_ofs != 0L) {                /* if offset specified, start there */
  197.     prterror ('m', start_ofs, fiz_ofs, dat_ofs);
  198.     zooseek (zoo_file, fiz_ofs, 0);
  199. } else {
  200.     if (frd_zooh (&zoo_header, zoo_file) == -1 ||
  201.                                                             zoo_header.zoo_tag != ZOO_TAG) {
  202.         prterror ('e', dbl_percent, this_zoo, invalid_header);
  203.         goto loop_end;
  204.     }
  205. #if 0
  206.     if (talking && (!show_name || verb_list || need_acmt))
  207. #else
  208.     if (need_acmt && talking)
  209. #endif
  210.     {
  211.         void show_acmt PARMS ((struct zoo_header *, ZOOFILE, int));
  212.         show_acmt (&zoo_header, zoo_file, 0);     /* show archive comment */
  213.     }
  214.  
  215.     /* Seek to the beginning of the first directory entry */
  216.     if (zooseek (zoo_file, zoo_header.zoo_start, 0) != 0) {
  217.         ercount++;
  218.         prterror ('e', dbl_percent, this_zoo, bad_directory);
  219.         goto loop_end;
  220.     }
  221.     if (!show_name && ver_too_high (&zoo_header)) {
  222.         ercount++;
  223.         if (ercount < 2)
  224.             prterror ('M', wrong_version,
  225.                                         zoo_header.major_ver, zoo_header.minor_ver);
  226.     }
  227. } /* end if (fiz_ofs !- 0L) */
  228.  
  229.     /* Now we print information about each file in the archive */
  230.  
  231.     if (!show_name) { /* initialize for each file only if not disk catalog */
  232.         tot_org_siz = 0L;
  233.         tot_siz_now = 0L;
  234.         file_count = 0;
  235.         del_count = 0;
  236.     }
  237.  
  238.     while (1) {
  239.         if (readdir (&direntry, zoo_file, 0) == -1) {
  240.             prterror ('F', dbl_percent, this_zoo, bad_directory);
  241.             goto givesummary;
  242.         }
  243.         if (direntry.zoo_tag != ZOO_TAG) {
  244.             long currpos, zoolength;
  245.             prterror ('F', dbl_percent, this_zoo, invalid_header);
  246.             if ((currpos = zootell (zoo_file)) != -1L)
  247.                 if (zooseek (zoo_file, 0L, 2) == 0)
  248.                     if ((zoolength = zootell (zoo_file)) != -1L)
  249.                         printf (cant_process, zoolength - currpos);
  250.             goto givesummary;
  251.         }
  252.  
  253.         if (direntry.next == 0L)      /* EXIT on end of chain */
  254.             break;
  255.         else
  256.             entrycount++;                    /* Number of directory entries */
  257.         /* first direntry read, change dat_ofs from abs. pos. to rel. offset */
  258.         if (first_dir && dat_ofs != 0) {
  259.             dat_ofs -= direntry.offset;
  260.             first_dir = 0;
  261.         }
  262.         direntry.next += dat_ofs;                /* allow for user-specified offset */
  263.         if (direntry.comme