home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Crawly Crypt Collection 2
/
crawlyvol2.bin
/
program
/
c
/
arc521s
/
arclst.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-11-16
|
4KB
|
193 lines
/*
* $Header: arclst.c,v 1.5 88/06/01 18:05:57 hyc Locked $
*/
/* ARC - Archive utility - ARCLST
Version 2.39, created on 04/22/87 at 13:48:29
(C) COPYRIGHT 1985-87 by System Enhancement Associates; ALL RIGHTS RESERVED
By: Thom Henderson
Description:
This file contains the routines used to list the contents
of an archive.
Language:
Computer Innovations Optimizing C86
*/
#include <stdio.h>
#include "arc.h"
void rempath(), openarc(), closearc();
int readhdr(), match();
void
lstarc(num, arg) /* list files in archive */
int num; /* number of arguments */
char *arg[]; /* pointers to arguments */
{
struct heads hdr; /* header data */
int list; /* true to list a file */
int did[MAXARG]; /* true when argument was used */
long tnum, tlen, tsize; /* totals */
int n; /* index */
void lstfile();
tnum = tlen = tsize = 0;/* reset totals */
for (n = 0; n < num; n++) /* for each argument */
did[n] = 0; /* reset usage flag */
rempath(num, arg); /* strip off paths */
if (note && !kludge) {
printf("Name Length ");
if (bose)
printf(" Stowage SF Size now");
printf(" Date ");
if (bose)
printf(" Time CRC");
printf("\n");
printf("============ ========");
if (bose)
printf(" ======== ==== ========");
printf(" =========");
if (bose)
printf(" ====== ====");
printf("\n");
}
openarc(0); /* open archive for reading */
if (num) { /* if files were named */
while (readhdr(&hdr, arc)) { /* process all archive files */
list = 0; /* reset list flag */
for (n = 0; n < num; n++) { /* for each template
* given */
if (match(hdr.name, arg[n])) {
list = 1; /* turn on list flag */
did[n] = 1; /* turn on usage flag */
break; /* stop looking */
}
}
if (list) { /* if this file is wanted */
if (!kludge)
lstfile(&hdr); /* then tell about it */
tnum++; /* update totals */
tlen += hdr.length;
tsize += hdr.size;
}
fseek(arc, hdr.size, 1); /* move to next header */
}
} else
while (readhdr(&hdr, arc)) { /* else report on all files */
if (!kludge)
lstfile(&hdr);
tnum++; /* update totals */
tlen += hdr.length;
tsize += hdr.size;
fseek(arc, hdr.size, 1); /* skip to next header */
}
closearc(0); /* close archive after reading */
if (note && !kludge) {
printf(" ==== ========");
if (bose)
printf(" ==== ========");
printf("\n");
}
if (note) {
printf("Total %6ld %8ld", tnum, tlen);
if (bose) {
if (tlen)
printf(" %3ld%%", 100L - (100L * tsize) / tlen);
else
printf(" ---");
printf(" %8ld", tsize);
}
printf("\n");
for (n = 0; n < num; n++) { /* report unused args */
if (!did[n]) {
printf("File not found: %s\n", arg[n]);
nerrs++;
}
}
}
}
void
lstfile(hdr) /* tell about a file */
struct heads *hdr; /* pointer to header data */
{
int yr, mo, dy; /* parts of a date */
int hh, mm; /* parts of a time */
static char *mon[] = /* month abbreviations */
{
"Jan", "Feb", "Mar", "Apr",
"May", "Jun", "Jul", "Aug",
"Sep", "Oct", "Nov", "Dec"
};
if (!note) { /* no notes means short listing */
printf("%s\n", hdr->name);
return;
}
yr = (hdr->date >> 9) & 0x7f; /* dissect the date */
mo = (hdr->date >> 5) & 0x0f;
dy = hdr->date & 0x1f;
hh = (hdr->time >> 11) & 0x1f; /* dissect the time */
mm = (hdr->time >> 5) & 0x3f;
/* ss = (hdr->time & 0x1f) * 2; seconds, not used. */
printf("%-12s %8ld ", hdr->name, hdr->length);
if (bose) {
switch (hdrver) {
case 1:
case 2:
printf(" -- ");
break;
case 3:
printf(" Packed ");
break;
case 4:
printf("Squeezed");
break;
case 5:
case 6:
case 7:
printf("crunched");
break;
case 8:
printf("Crunched");
break;
case 9:
printf("Squashed");
break;
default:
printf("Unknown!");
}
if (hdr->length)
printf(" %3ld%%", 100L - (100L * hdr->size) / hdr->length);
else
printf(" ---");
printf(" %8ld ", hdr->size);
}
printf("%2d %3s %02d", dy, mon[mo - 1], (yr + 80) % 100);
if (bose)
printf(" %2d:%02d%c %04x",
(hh > 12 ? hh - 12 : hh), mm, (hh > 11 ? 'p' : 'a'),
hdr->crc & 0xffff);
printf("\n");
}