📄 zoolist.c
字号:
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 + -