Public-domain ARC extraction tool
Joe Orost
joe at petsd.UUCP
Tue Dec 16 23:17:25 AEST 1986
::
#!/bin/sh
cat >README <<'------ EOF ------'
This directory contains the first cut at public-domain unix commands for
extracting a file from an ARC archive, and for printing out the name of the
file in an ARC archive.
I use them for extracting the files from the SIMTEL20 public-domain software
archives.
Usage: arcx <archive>
Extracts a file from the archive. Handles image, run-length, and
compress format archives (crunched). That is, codes 1, 2, 3, and 8.
Usage: arct <archive>
Prints the filename and encoding of the file in the archive.
Warning: ONLY ARCHIVES CONTAINING A SINGLE FILE ARE SUPPORTED.
Prerequisite: Must have my compress(1) program installed.
Please send any comments, upgrades, etc., to me at the address below.
regards,
joe
--
Full-Name: Joseph M. Orost
UUCP: ihnp4!vax135!petsd!joe
ARPA: vax135!petsd!joe at BERKELEY
Phone: (201) 758-7284
US Mail: MS 313; Concurrent Computer Corporation; 106 Apple St
Tinton Falls, NJ 07724
------ EOF ------
ls -l README
cat >arcname.c <<'------ EOF ------'
#include <stdio.h>
main()
{
char fnm[13];
register unsigned c, i, code;
if(getchar() != 0x1a) {
fprintf(stderr, "Not in ARC format\n");
exit(9);
}
code = getchar(); /* code (should be 8) */
for(i=0; i<13; i++) {
c = getchar();
if(c >= 'A' && c <= 'Z') {
c += 'a' - 'A';
}
fnm[i] = c;
}
printf("%s\n", fnm);
return code;
}
------ EOF ------
ls -l arcname.c
cat >arcstrip.c <<'------ EOF ------'
#include <stdio.h>
main()
{
register c, i, size;
if(getchar() != 0x1a) {
fprintf(stderr, "Not in ARC format\n");
exit(1);
}
c = getchar();
for(i=0; i<13; i++) {
c = getchar();
}
size = getchar(); size = (getchar() << 8) + size;
size = (getchar() << 16) + size; size = (getchar() << 24) + size;
for(i=10; i>0; i--) {
c = getchar();
}
while(size--) {
c = getchar();
putchar(c);
}
return 0;
}
------ EOF ------
ls -l arcstrip.c
cat >arct <<'------ EOF ------'
if test -z "$1"; then
echo "Usage: arct archive"
exit 1
fi
if test -f "$1"; then
NAME=`arcname <$1`
CODE="$?"
case $CODE in
1) echo "$NAME: image";;
2) echo "$NAME: image";;
3) echo "$NAME: run-length";;
8) echo "$NAME: crunched";;
9) exit 1;;
*) echo "$NAME: NOT HANDLED"
exit 1;;
esac
else
echo "arct: Cannot open $1"
exit 1
fi
------ EOF ------
chmod +x arct
ls -l arct
cat >arctoZ.c <<'------ EOF ------'
#include <stdio.h>
main()
{
register c, i, size;
if(getchar() != 0x1a) {
fprintf(stderr, "Not in ARC format\n");
exit(1);
}
if((c = getchar()) != 8) {
fprintf(stderr, "Can only handle code 8 ARC files\n");
fprintf(stderr, "This file is code %d\n", c);
exit(1);
}
for(i=0; i<13; i++) {
c = getchar();
}
size = getchar(); size = (getchar() << 8) + size;
size = (getchar() << 16) + size; size = (getchar() << 24) + size;
for(i=10; i>0; i--) {
c = getchar();
}
c = getchar();
putchar(0x1f); putchar(0x9d); putchar((0x80 | c));
while(--size) {
c = getchar();
putchar(c);
}
return 0;
}
------ EOF ------
ls -l arctoZ.c
cat >arcunrun.c <<'------ EOF ------'
#include <stdio.h>
#define CODE 0x90
main()
{
register c, lastc;
while((c = getchar()) != EOF) {
if(c == CODE) {
c = getchar(); /* count */
if(c) {
while(--c) {
putchar(lastc);
}
} else {
putchar(CODE);
}
} else {
putchar(c);
lastc = c;
}
}
}
------ EOF ------
ls -l arcunrun.c
cat >arcx <<'------ EOF ------'
if test -z "$1"; then
echo "Usage: arcx archive"
exit 1
fi
if test -f "$1"; then
NAME=`arcname <$1`
CODE="$?"
case $CODE in
1) arcstrip <$1 > "$NAME";;
2) arcstrip <$1 > "$NAME";;
3) arcstrip <$1 | arcunrun > "$NAME";;
8) arctoZ <$1 | compress -d | arcunrun > "$NAME";;
9) exit 1;;
*) echo "arcx: Cannot extract $NAME in code $CODE archive"
exit 1;;
esac
echo "arcx: File $NAME extracted"
else
echo "arcx: Cannot open $1"
exit 1
fi
------ EOF ------
chmod +x arcx
ls -l arcx
exit
More information about the Comp.sources.unix
mailing list