home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Monster Media 1994 #1
/
monster.zip
/
monster
/
OS2
/
MR2_200.ZIP
/
UNQWK.CMD
< prev
next >
Wrap
OS/2 REXX Batch file
|
1994-03-13
|
6KB
|
158 lines
/*
MR/2 - UNQWK.CMD
Author: Nick Knight
Created: 03/26/93
Usage: unqwk packet.qwk
Purpose: Unqwk.cmd will analyze the file named as a parameter.
It will check the file for a valid archiver signiture
and branch to an appropriate unarchiving command. This
file, as is, should accomodate most existing QWK packet
archivers. This utility is easily extensible, either
by the original author, or by anyone with an urge to
tinker.
This was my first REXX program. I'm sure it will be enhanced and
extended ... and I'm sure there are plenty of inefficiencies. Feel
free to provide me with pointers, or just send me a copy of any
improvements/enhancements.
The author claims no copyright to this particular REXX script.
Feel free to copy it and/or use it for other purposes. I *would*
like to see the results of any improvements to it.
US Mail: Nick Knight, 1823 David Ave., Parma, Ohio 44134
Fidonet: 1:157/2 or 1:/157/200
Internet: nick.knight@pcohio.com
Compuserve: 76066,1240
BBS: Private messages on Nerd's Nook, 356-1772 or 356-1872
*/
/***********************************************************************/
/* A R C H I V E R C O M M A N D D E F I N I T I O N S */
/***********************************************************************/
/* To add support for a new unpacker, simply supply a new command
definition here. The file name to unpack will be appended to
the end of the supplied command. You can customize in more detail
by modifying the code directly, if need be.
*/
path = ''
zip_command = 'pkunzip -o'
arj_command = 'arj x'
zoo_command = 'zoo x'
lharc_command = 'lha x'
lha_command = 'lh x'
arc_command = 'arc x'
/***********************************************************************/
/* U N Q W K F I L E N A M E */
/***********************************************************************/
/*
Returns -1 if it the file appears not to be a packed "archive".
Returns -2 if the file doesn't exist
Otherwise, the "archive_id" is returned (1 -> 6).
*/
parse arg filename
/*
06/10/93 - Check for long file name - copy to 'shorter' 8.3 name for packer
*/
/*
01/23/94 - first 'if' was < 0. Case where file name was 12 chars long
and still non-DOS were being ignored. Thank you Wolfgang von Thuelen!
Now, if the file name is > 12 chars, it's assumed to be 'long'.
If it's 12 chars or less, the extension (anything past the first
period) is tested for length. If it's > 3 chars, it's marked as 'long'.
*/
flongname = length(filename) - lastpos('\',filename) - 12
if flongname <= 0 then do
flongname = length(filename) - pos('.',filename) - 3
end
if flongname > 0 then do
'copy "'filename'" MR2$TMP.QWK'
filename = 'MR2$TMP.QWK'
flongname = 1
end
if stream(filename,'c','query exists') = "" then do
return -2
end
/*
Book says file is open in read/write by default. This worried me,
although my tests proved that the file's datestamp remained unchanged.
Just to be safe, I wanted to open the file in read-only mode.
*/
status = stream(filename,'c','open read') /* read only */
header = charin(filename,1,16)
/* If it doesn't have at least 16 chars, it probably isn't real */
if chars(filename) = 0 then do
status = stream(filename,'c','close')
return -1
end
status = stream(filename,'c','close') /* Close the file - Important! */
archiver_id = which_archiver(header) /* call analyzer function, below */
select /* execute the corresponding command */
when archiver_id = -1 then do
say "UNKNOWN ARCHIVE TYPE: " filename
return -1
end
when archiver_id = 1 then path || zip_command '"'||filename'"'
when archiver_id = 2 then path || arj_command filename
when archiver_id = 3 then path || zoo_command filename
when archiver_id = 4 then path || lharc_command filename
when archiver_id = 5 then path || lha_command filename
when archiver_id = 6 then path || arc_command filename
otherwise
end
if RC <> 0 then return RC
idfile = "archiver.id" /* important for packing replies */
status = lineout(idfile,archiver_id,1) /* record unpacker id so */
status = lineout(idfile) /* compatible packer can be used */
if flongname > 0 then
'del MR2$TMP.QWK'
return archive_id /* return the ID type */
/***********************************************************************/
/* W H I C H A R C H I V E R */
/***********************************************************************/
/*
Returns -1 if it can't tell, otherwise it returns the archiver id
that I've assigned to the ones I know about. Others can be easily
added. Some of this may not be correct (lha vs lharc), but I tested
as much of it as I could. Looks OK.
*/
which_archiver:
parse arg header /* header is the first 16 bytes of file */
select
when substr(header,1,2) = "PK" then id = 1 /* PKWare */
when substr(header,1,1) = '`' && substr(header,2,1) = '\xEA' then id = 2 /* ARJ */
when substr(header,1,3) = "ZOO" then id = 3 /* ZOO */
when substr(header,3,5) = "-lh0-" then id = 4 /* LHARC */
when substr(header,3,5) = "-lh1-" then id = 4 /* LHARC */
when substr(header,3,3) = "-lh" then id = 5 /* LHA */
when c2d(substr(header,1,1)) = 26 then id = 6 /* ARC */
otherwise
id = -1 /* Archiver unknown or not an archive */
end
return id