⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zoolist.c

📁 一个很好的压缩与解压程序
💻 C
📖 第 1 页 / 共 2 页
字号:
   
         if (direntry.packing_method > MAX_PACK) {
            bad_pack = 1;
            expl_ver = 1;
         }  else
            bad_pack = 0;
      
         size_factor = cfactor (direntry.org_size, direntry.size_now);
   
         year  =  ((unsigned int) direntry.date >> 9) & 0x7f;
         month =  ((unsigned int) direntry.date >> 5) & 0x0f;
         day   =  direntry.date        & 0x1f;
   
         hours =  ((unsigned int) direntry.time >> 11)& 0x1f;
         min   =  ((unsigned int) direntry.time >> 5) & 0x3f;
         sec   =  ((unsigned int) direntry.time & 0x1f) * 2;
   
			/* Alignment in columns is a horrendously complex undertaking. */

         if (fast) {
				int space_left;
				int namelen;
				int next_col;
#if 0
            if ( (quiet && !first_ever || !first_time) && one_col)
               fputchar ('\n');
				first_ever = 0;
#endif
				/* If we are showing directories, whichname already contains the
				full pathname string.  Else we only use the filename as follows:
				long filename if possible, else short filename */
				if (!showdir) {
				   strcpy (whichname, 
				      (direntry.namlen != 0) ? direntry.lfname : direntry.fname);
					if (genson && zoo_header.vdata & VFL_ON)
						add_version (whichname, &direntry);	/* add version suffix */
				}
				namelen = strlen (whichname);

#define MARGIN			78
#define COL_WIDTH		16
#if 1
				/* if not enough space left, move to next line */
				if (!one_col && column != 0) {
					space_left = MARGIN - column;
					if (namelen > space_left) {
						neednl = 1;
						column = 0;
					}
				}
#endif
            if ( (quiet && !first_ever || !first_time) && (neednl || one_col))
					printf ("\n");
				first_ever = 0;
				neednl = 0;

            printf("%s", whichname);
				fflush (stdout);
				/* move to next column stop */
				column += namelen;
				next_col = ((column + (COL_WIDTH - 1)) / COL_WIDTH) * COL_WIDTH;
				if (next_col - column < 2)		/* need at least 2 spaces */
					next_col += COL_WIDTH;
				if (next_col > MARGIN) {
					neednl = 1;
					column = 0;
				} else {
					if (!one_col)
						printf ("%*s", (next_col - column), " ");
					column = next_col;
				}
   
         } else {
            if (talking && first_time && !show_name) {/*print archive header */
               printf ("Length    CF  Size Now  Date      Time\n");
               printf (tot_line);
            }
            printf ("%8lu %3u%% %8lu  %2d %-.3s %02d %02d:%02d:%02d",  
                     direntry.org_size, 
                     size_factor, direntry.size_now, 
                     day, &month_list[month*3], 
                     (day && month) ?  (year+80) % 100 : 0,
                     hours, min, sec);
               tot_org_siz += direntry.org_size;
               tot_siz_now += direntry.size_now;
#ifdef GETTZ
				printtz ((int) direntry.tz);	/* show timezone */
#else
				printf (" ");
#endif

				if (show_crc)
					printf ("%04x ", direntry.file_crc);
				if (show_gen) {
					if (direntry.vflag & VFL_ON)
						printf ("%2dg ", direntry.vflag & VFL_GEN);
					else
						printf ("--g ");
				}
   
            if (direntry.cmt_size) {
               expl_comment++;
               printf ("C");
            } else
               printf (" ");
   
            if (direntry.deleted) {
               expl_deleted++;
               printf ("D");
            }  else
               printf (" ");
            if (list_deleted)
               printf (" ");
            if (show_name)
               printf ("%-*s ", longest, this_zoo);

#ifdef FATTR
				if (show_mode) {
					if (direntry.fattr == 0)
						printf ("--- ");
					else if ((direntry.fattr >> 22) == 1)
						printf ("%03o ", direntry.fattr & 0x1ff);
					else
						printf ("??? ");
				}
#endif /* FATTR */

				/* new code to get around a common compiler bug */
				printf ("%s", whichname);
				if (direntry.dir_crc != 0) {
					expl_star++;
					printf ("*");
				}

            if (bad_pack)
               printf (" (V%d.%d)", direntry.major_ver, direntry.minor_ver);
            printf ("\n");
         }
         first_time = 0;
   
         /* if verbose listing requested show any comment.  f overrrides v */
         if (verb_list && !fast)
            show_comment (&direntry, zoo_file, 0, (char *) NULL);
      } /* end if (lots of conditions) */
   
		/* ..seek to next dir entry */
      zooseek (zoo_file, direntry.next, 0);
   } /* end while */
   
   givesummary:
   
	if (fast && talking) {
	   if (file_count) {
	   	if (del_count || (show_gen && zoo_header.type > 0))
	      	printf ("\n-----\n");
			else
	      	fputchar ('\n');
		}
		if (del_count)
			printf ("%d deleted.\n", del_count);
		if (show_gen && zoo_header.type > 0) {
			printf ("Generation limit %u",
						zoo_header.vdata & VFL_GEN);
			if ((zoo_header.vdata & VFL_ON) == 0)
				printf (" (off).\n");
			else
				printf (".\n");
		}
	} /* end if (fast && talking) */

   if (talking && !show_name) {
      if (!fast && file_count) {
         tot_sf = cfactor (tot_org_siz, tot_siz_now);
         printf (tot_line);
      
         printf (tot_fmt, tot_org_siz, tot_sf, tot_siz_now, file_count);
			if (file_count > 1)
				printf ("s\n");
			else
				printf ("\n");
         
         if (del_count || expl_ver || expl_deleted || expl_comment ||
					expl_star || (show_gen && (zoo_header.type > 0)))
            printf (dashes);
      }
   
      if (!fast) {
         if (del_count) {
            if (expl_deleted)
               printf ("D: deleted file.\n");
            else {
               if (del_count == 1)
                  printf ("There is 1 deleted file.\n");
               else
                  printf ("There are %d deleted files.\n", del_count);
            }
         }
      }
      if (expl_comment && !fast && !verb_list) 
         printf ("C: file has attached comment.\n");
      if (expl_ver && !fast)
         printf ("V: minimum version of Zoo needed to extract this file.\n");
      if (expl_star && !fast)
         printf ("*: directory entry may be corrupted.\n");
      if (!file_count)
         printf ("Zoo:  %s", no_match);
      
      if (!entrycount && !fiz_ofs)
         printf ("(The archive is empty.)\n");
		if (show_gen && (zoo_header.type > 0) && !fast) {
			printf ("Archive generation limit is %u",
						zoo_header.vdata & VFL_GEN);
			if ((zoo_header.vdata & VFL_ON) == 0)
				printf (" (generations off).\n");
			else
				printf (".\n");
		}
   } /* end if (talking && !show_name) */
loop_end:            /* jump here on badly structured archive */
   zooclose (zoo_file);
} /* end for */

if (talking && show_name) {
   if (file_count) {
      tot_sf = cfactor (tot_org_siz, tot_siz_now);
      printf (tot_line);
      printf (tot_fmt, tot_org_siz, tot_sf, tot_siz_now, file_count);
		if (file_count > 1)
			printf ("s\n");
		else
			printf ("\n");
   } 
} else if (fast && quiet)
	fputchar ('\n');
	

if (!file_count)
   zooexit (1);            /* Consider it an error if there were no files */
} /* zoolist() */

#ifdef GETTZ
void printtz (file_tz)
int file_tz;
{
	long gettz();
	int diff_tz;				/* timezone difference */
	if (file_tz == NO_TZ) 	/* if no timezone stored ..*/
		printf ("   ");			/* .. just pad with blanks */
	else {
		diff_tz = (file_tz / 4) - (int) (gettz() / 3600);
		if (diff_tz == 0)
			printf ("   ");					/* print nothing if same */
		else if (diff_tz > 0)			/* else print signed difference */
			printf ("+%1d ", diff_tz);
		else
			printf ("-%1d ", -diff_tz);
	}
}
#endif

/*
FOLLOWING CODE IS FOR DEBUGGING ONLY.  IT IS COMPILED IN ONLY
IF THE SYMBOL TRACE_LIST IS DEFINED
*/

#ifdef TRACE_LIST
/* code copied from portable.c near end */
/* dump contents of directory entry */
void show_dir (direntry)
struct direntry *direntry;
{
   printf ("Directory entry for file [%s][%s]:\n",
            direntry->fname, direntry->lfname);
   printf ("tag = [%8lx] type = [%d] PM = [%d] Next = [%8lx] Offset = [%8lx]\n",
            direntry->zoo_tag, (int) direntry->type, 
            (int) direntry->packing_method, direntry->next, 
            direntry->offset);
   printf ("Orig size = [%ld] Size now = [%ld] dmaj_v.dmin_v = [%d.%d]\n",
         direntry->org_size, direntry->size_now,
         (int) direntry->major_ver, (int) direntry->minor_ver);
   printf ("Struc = [%d] DEL = [%d] comment_offset = [%8lx] cmt_size = [%d]\n",
         (int) direntry->struc, (int) direntry->deleted, direntry->comment,
         direntry->cmt_size);
   printf ("var_dir_len = [%d] TZ = [%d] dir_crc = [%4x]\n",
            direntry->var_dir_len, (int) direntry->tz, direntry->dir_crc);
   printf ("system_id = [%d]  dirlen = [%d]  namlen = [%d] fattr=[%24lx]\n", 
		direntry->system_id, direntry->dirlen, direntry->namlen, direntry->fattr);
	printf ("vflag = [%4x] version_no = [%4x]\n",
				direntry->vflag, direntry->version_no);
   if (direntry->dirlen > 0)
      printf ("dirname = [%s]\n", direntry->dirname);
   printf ("---------\n");
}
#endif   /* TRACE_IO */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -