#include "mcb.h" #include #include "globals.h" #include "../fileio/machdr.h" #include "../fileio/wrfile.h" #include "../util/masks.h" #include "../util/util.h" #include "../util/transname.h" static int mcb_read; static void mcb_wrfile(uint32_t ibytes); void mcb (char *hdr, uint32_t rsrcLength, uint32_t dataLength, int toread) { register int i; int n; char ftype[5], fauth[5]; mcb_read = toread; for(i = 0; i < INFOBYTES; i++) { info[i] = hdr[i]; } n = hdr[I_NAMEOFF] & BYTEMASK; if(n > F_NAMELEN) { n = F_NAMELEN; } info[I_NAMEOFF] = n; transname(hdr + I_NAMEOFF + 1, text, n); if(hdr[I_LOCKOFF] & 1) { hdr[I_FLAGOFF + 1] = PROTCT_MASK; hdr[I_LOCKOFF] &= ~1; } write_it = 1; if(list) { transname(hdr + I_TYPEOFF, ftype, 4); transname(hdr + 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); } } if(write_it) { define_name(text); start_info(info, rsrcLength, dataLength); start_data(); } mcb_wrfile(dataLength); if(write_it) { start_rsrc(); } mcb_wrfile(rsrcLength); if(write_it) { end_file(); } } static void mcb_wrfile (uint32_t ibytes) { int n; if(write_it) { if(ibytes == 0) { return; } n = fread(out_buffer, 1, (int)ibytes, infp); if(n != ibytes) { (void)fprintf(stderr, "Premature EOF\n"); exit(1); } mcb_read -= n; n = ((n + 127) / 128) * 128 - n; if(n > mcb_read) { n = mcb_read; } mcb_read -= n; while(n-- > 0) { if(getc(infp) == EOF) { (void)fprintf(stderr, "Premature EOF\n"); exit(1); } } } else { n = ((ibytes + 127) / 128) * 128; if(n > mcb_read) { n = mcb_read; } mcb_read -= n; while(n-- > 0) { if(getc(infp) == EOF) { (void)fprintf(stderr, "Premature EOF\n"); exit(1); } } } }