#include "macunpack.h" #ifdef LZC #define LZC_INTERNAL #include "lzc.h" #include #include #include "globals.h" #include "../util/util.h" #include "../fileio/machdr.h" #include "../fileio/wrfile.h" #include "../util/masks.h" #include "../util/transname.h" #include "de_compress.h" #include "mcb.h" static void lzc_zivm(char *ohdr); static void lzc_wrfile(uint32_t obytes, uint32_t ibytes); static void lzc_zivu(char *ohdr); void lzc (char *ohdr) { core_compress((char *)NULL); if(!strncmp(ohdr + I_TYPEOFF, "ZIVM", 4)) { lzc_zivm(ohdr); } else { lzc_zivu(ohdr); } } static void lzc_zivm (char *ohdr) { char hdr[HEADERBYTES]; uint32_t dataLength, rsrcLength, dataCLength, rsrcCLength; char ftype[5], fauth[5]; if(fread(hdr, 1, HEADERBYTES, infp) != HEADERBYTES) { (void)fprintf(stderr, "Can't read file header\n"); #ifdef SCAN do_error("macunpack: Can't read file header"); #endif /* SCAN */ exit(1); } if(strncmp(hdr, MAGIC1, 4)) { (void)fprintf(stderr, "Magic header mismatch\n"); #ifdef SCAN do_error("macunpack: Magic header mismatch"); #endif /* SCAN */ exit(1); } dataLength = get4(hdr + C_DLENOFF); dataCLength = get4(hdr + C_DLENOFFC); rsrcLength = get4(hdr + C_RLENOFF); rsrcCLength = get4(hdr + C_RLENOFFC); write_it = 1; if(list) { copy(info, ohdr, INFOBYTES); copy(info + I_TYPEOFF, hdr + C_TYPEOFF, 4); copy(info + I_AUTHOFF, hdr + C_AUTHOFF, 4); copy(info + I_DLENOFF, hdr + C_DLENOFF, 4); copy(info + I_RLENOFF, hdr + C_RLENOFF, 4); copy(info + I_CTIMOFF, hdr + C_CTIMOFF, 4); copy(info + I_MTIMOFF, hdr + C_MTIMOFF, 4); copy(info + I_FLAGOFF, hdr + C_FLAGOFF, 8); transname(ohdr + I_NAMEOFF + 1, text, (int)ohdr[I_NAMEOFF]); transname(hdr + C_TYPEOFF, ftype, 4); transname(hdr + C_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); } } if(write_it) { define_name(text); } if(write_it) { start_info(info, rsrcLength, dataLength); } if(verbose) { (void)fprintf(stderr, "\tData: "); } if(write_it) { start_data(); } lzc_wrfile(dataLength, dataCLength); if(verbose) { (void)fprintf(stderr, ", Rsrc: "); } if(write_it) { start_rsrc(); } lzc_wrfile(rsrcLength, rsrcCLength); if(write_it) { end_file(); } if(verbose) { (void)fprintf(stderr, ".\n"); } } static void lzc_wrfile (uint32_t obytes, uint32_t ibytes) { int n, nbits; char subheader[3]; if(ibytes == 0) { if(verbose) { (void)fprintf(stderr, "empty"); } return; } if(ibytes == obytes) { if(verbose) { (void)fprintf(stderr, "No compression"); } if(write_it) { n = fread(out_buffer, 1, (int)ibytes, infp); if(n != ibytes) { (void)fprintf(stderr, "Premature EOF\n"); #ifdef SCAN do_error("macunpack: Premature EOF"); #endif /* SCAN */ exit(1); } } else { n = ibytes; while(n-- > 0) { if(getc(infp) == EOF) { (void)fprintf(stderr, "Premature EOF\n"); #ifdef SCAN do_error("macunpack: Premature EOF"); #endif /* SCAN */ exit(1); } } } } else { if(fread(subheader, 1, 3, infp) != 3) { (void)fprintf(stderr, "Premature EOF\n"); #ifdef SCAN do_error("macunpack: Premature EOF"); #endif /* SCAN */ exit(1); } if(strncmp(subheader, MAGIC2, 2)) { (void)fprintf(stderr, "Magic subheader mismatch\n"); #ifdef SCAN do_error("macunpack: Magic subheader mismatch"); #endif /* SCAN */ exit(1); } nbits = subheader[2] & 0x7f; if(verbose) { (void)fprintf(stderr, "LZC(%d) compressed (%4.1f%%)", nbits, 100.0 * ibytes / obytes); } if(write_it) { de_compress(ibytes - 3, nbits); } else { n = ibytes - 3; while(n-- > 0) { if(getc(infp) == EOF) { (void)fprintf(stderr, "Premature EOF\n"); #ifdef SCAN do_error("macunpack: Premature EOF"); #endif /* SCAN */ exit(1); } } } } } static void lzc_zivu (char *ohdr) { (void)fprintf(stderr, "\tMacCompress(Unix) not yet implemented, copied as MacBinary\n"); mcb(ohdr, (uint32_t)in_rsrc_size, (uint32_t)in_data_size, in_ds + in_rs); } #else /* LZC */ int lzc; /* keep lint and some compilers happy */ #endif /* LZC */