home *** CD-ROM | disk | FTP | other *** search
- #include "macunpack.h"
- #ifdef JDW
- #include "jdw.h"
- #include "globals.h"
- #include "huffman.h"
- #include "../fileio/wrfile.h"
- #include "../fileio/machdr.h"
- #include "../util/util.h"
- #include "../util/masks.h"
-
- extern void de_huffman();
- extern void set_huffman();
- extern void read_tree();
- extern void clrhuff();
-
- static void jdw_wrfile();
- static void jdw_wrfork();
- static void jdw_block();
-
- void jdw(ibytes)
- unsigned long 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=%ld, rsrc=%ld",
- text, ftype, fauth, (long)dataLength, (long)rsrcLength);
- if(info_only) {
- write_it = 0;
- }
- if(query) {
- write_it = do_query();
- } else {
- (void)fputc('\n', stderr);
- }
- }
- jdw_wrfile((unsigned long)rsrcLength, (unsigned long)dataLength);
- }
-
- static void jdw_wrfile(rsrcLength, dataLength)
- unsigned long rsrcLength, 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(length)
- unsigned long length;
- {
- int olength, ilength, i;
- unsigned long 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(olength)
- int olength;
- {
- bytesread = 0;
- read_tree();
- /* Put reading back at a word boundary! */
- while(bytesread & 3) {
- (void)getb(infp);
- bytesread++;
- }
- clrhuff();
- de_huffman((unsigned long)olength);
- }
- #else /* JDW */
- int jdw; /* keep lint and some compilers happy */
- #endif /* JDW */
-
-