macutils/macunpack/jdw.c

160 lines
3.4 KiB
C

#include "macunpack.h"
#ifdef JDW
#define JDW_INTERNAL
#include "jdw.h"
#include "globals.h"
#include "huffman.h"
#include "de_huffman.h"
#include "../fileio/wrfile.h"
#include "../fileio/machdr.h"
#include "../util/util.h"
#include "../util/transname.h"
#include "../util/masks.h"
static void jdw_wrfile(uint32_t rsrcLength, uint32_t dataLength);
static void jdw_wrfork(uint32_t length);
static void jdw_block(int olength);
void
jdw (uint32_t ibytes)
{
char fauth[5], ftype[5];
int filel, i;
unsigned int rsrcLength, dataLength;
set_huffman(HUFF_BE);
for(i = 0; i < 6; i++) (void)getb(infp);
for(i = 0; i < INFOBYTES; i++) {
info[i] = 0;
}
for(i = 0; i < 4; i++) {
info[I_TYPEOFF + i] = getb(infp);
}
for(i = 0; i < 4; i++) {
info[I_AUTHOFF + i] = getb(infp);
}
for(i = 0; i < 8; i++) {
info[I_FLAGOFF + i] = getb(infp);
}
for(i = 0; i < 4; i++) {
info[I_DLENOFF + i] = getb(infp);
}
for(i = 0; i < 4; i++) {
info[I_RLENOFF + i] = getb(infp);
}
for(i = 0; i < 4; i++) {
info[I_CTIMOFF + i] = getb(infp);
}
for(i = 0; i < 4; i++) {
info[I_MTIMOFF + i] = getb(infp);
}
filel = getb(infp);
info[I_NAMEOFF] = filel;
i = filel;
for(i = 1; i <= filel; i++) {
info[I_NAMEOFF + i] = getb(infp);
}
(void)getb(infp);
rsrcLength = get4(info + I_RLENOFF);
dataLength = get4(info + I_DLENOFF);
ibytes -= filel + 40;
write_it = 1;
if(list) {
transname(info + I_NAMEOFF + 1, text, (int)info[I_NAMEOFF]);
transname(info + I_TYPEOFF, ftype, 4);
transname(info + I_AUTHOFF, fauth, 4);
do_indent(indent);
(void)fprintf(stderr,
"name=\"%s\", type=%4.4s, author=%4.4s, data=%d, rsrc=%d",
text, ftype, fauth, (int32_t)dataLength, (int32_t)rsrcLength);
if(info_only) {
write_it = 0;
}
if(query) {
write_it = do_query();
} else {
(void)fputc('\n', stderr);
}
}
jdw_wrfile((uint32_t)rsrcLength, (uint32_t)dataLength);
}
static void
jdw_wrfile (uint32_t rsrcLength, uint32_t dataLength)
{
if(write_it) {
define_name(text);
start_info(info, rsrcLength, dataLength);
start_data();
}
if(verbose) {
(void)fprintf(stderr, "\tData: ");
}
jdw_wrfork(dataLength);
if(write_it) {
start_rsrc();
}
if(verbose) {
(void)fprintf(stderr, ", Rsrc: ");
}
jdw_wrfork(rsrcLength);
if(write_it) {
end_file();
}
if(verbose) {
(void)fprintf(stderr, ".\n");
}
}
static void
jdw_wrfork (uint32_t length)
{
int olength, ilength, i;
uint32_t origlength, comprlength;
if(length == 0) {
(void)fprintf(stderr, "empty");
return;
}
(void)fprintf(stderr, "Huffman compressed ");
comprlength = 0;
origlength = length;
while(length > 0) {
olength = getb(infp) & BYTEMASK;
olength = (olength << 8) | (getb(infp) & BYTEMASK);
ilength = getb(infp) & BYTEMASK;
ilength = (ilength << 8) | (getb(infp) & BYTEMASK);
if(write_it) {
jdw_block(olength);
} else {
for(i = 0; i < ilength; i++) {
(void)getb(infp);
}
}
comprlength += ilength + 4;
length -= olength;
}
if(verbose) {
(void)fprintf(stderr, "(%4.1f%%)", 100.0 * comprlength / origlength);
}
}
static void
jdw_block (int olength)
{
bytesread = 0;
read_tree();
/* Put reading back at a word boundary! */
while(bytesread & 3) {
(void)getb(infp);
bytesread++;
}
clrhuff();
de_huffman((uint32_t)olength);
}
#else /* JDW */
int jdw; /* keep lint and some compilers happy */
#endif /* JDW */