home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / APPS / macutils.lzh / MACUTILS / MACUNPACK / mcb.c < prev    next >
C/C++ Source or Header  |  1995-09-18  |  3KB  |  138 lines

  1. #include "globals.h"
  2. #include "../fileio/machdr.h"
  3. #include "../fileio/wrfile.h"
  4. #include "../util/masks.h"
  5. #include "../util/util.h"
  6.  
  7. static int mcb_read;
  8.  
  9. static void mcb_wrfile();
  10.  
  11. void mcb(hdr, rsrcLength, dataLength, toread)
  12. char *hdr;
  13. unsigned long rsrcLength, dataLength;
  14. int toread;
  15. {
  16.     register int i;
  17.     int n;
  18.     char ftype[5], fauth[5];
  19.  
  20.     mcb_read = toread;
  21.     for(i = 0; i < INFOBYTES; i++) {
  22.     info[i] = hdr[i];
  23.     }
  24.  
  25.     n = hdr[I_NAMEOFF] & BYTEMASK;
  26.     if(n > F_NAMELEN) {
  27.     n = F_NAMELEN;
  28.     }
  29.     info[I_NAMEOFF] = n;
  30.     transname(hdr + I_NAMEOFF + 1, text, n);
  31.     if(hdr[I_LOCKOFF] & 1) {
  32.     hdr[I_FLAGOFF + 1] = PROTCT_MASK;
  33.     hdr[I_LOCKOFF] &= ~1;
  34.     }
  35.  
  36.     write_it = 1;
  37.     if(list) {
  38.     transname(hdr + I_TYPEOFF, ftype, 4);
  39.     transname(hdr + I_AUTHOFF, fauth, 4);
  40.     do_indent(indent);
  41.     (void)fprintf(stderr,
  42.         "name=\"%s\", type=%4.4s, author=%4.4s, data=%ld, rsrc=%ld",
  43.         text, ftype, fauth, (long)dataLength, (long)rsrcLength);
  44.     if(info_only) {
  45.         write_it = 0;
  46.     }
  47.     if(query) {
  48.         write_it = do_query();
  49.     } else {
  50.         (void)fputc('\n', stderr);
  51.     }
  52.     }
  53.  
  54.     if(write_it) {
  55.     define_name(text);
  56.     }
  57.     if(write_it) {
  58.     start_info(info, rsrcLength, dataLength);
  59.     }
  60.     if(verbose) {
  61.     (void)fprintf(stderr, "\tData: ");
  62.     }
  63.     if(write_it) {
  64.     start_data();
  65.     }
  66.     mcb_wrfile(dataLength);
  67.     if(verbose) {
  68.     (void)fprintf(stderr, ", Rsrc: ");
  69.     }
  70.     if(write_it) {
  71.     start_rsrc();
  72.     }
  73.     mcb_wrfile(rsrcLength);
  74.     if(write_it) {
  75.     end_file();
  76.     }
  77.     if(verbose) {
  78.     (void)fprintf(stderr, ".\n");
  79.     }
  80. }
  81.  
  82. static void mcb_wrfile(ibytes)
  83. unsigned long ibytes;
  84. {
  85.     int n;
  86.  
  87.     if(ibytes == 0) {
  88.     if(verbose) {
  89.         (void)fprintf(stderr, "empty");
  90.     }
  91.     return;
  92.     }
  93.     if(verbose) {
  94.     (void)fprintf(stderr, "No compression");
  95.     }
  96.     if(write_it) {
  97.     n = fread(out_buffer, 1, (int)ibytes, infp);
  98.     if(n != ibytes) {
  99.         (void)fprintf(stderr, "Premature EOF\n");
  100. #ifdef SCAN
  101.         do_error("macunpack: Premature EOF");
  102. #endif /* SCAN */
  103.         exit(1);
  104.     }
  105.     mcb_read -= n;
  106.     n = ((n + 127) / 128) * 128 - n;
  107.     if(n > mcb_read) {
  108.         n = mcb_read;
  109.     }
  110.     mcb_read -= n;
  111.     while(n-- > 0) {
  112.         if(getc(infp) == EOF) {
  113.         (void)fprintf(stderr, "Premature EOF\n");
  114. #ifdef SCAN
  115.         do_error("macunpack: Premature EOF");
  116. #endif /* SCAN */
  117.         exit(1);
  118.         }
  119.     }
  120.     } else {
  121.     n = ((ibytes + 127) / 128) * 128;
  122.     if(n > mcb_read) {
  123.         n = mcb_read;
  124.     }
  125.     mcb_read -= n;
  126.     while(n-- > 0) {
  127.         if(getc(infp) == EOF) {
  128.         (void)fprintf(stderr, "Premature EOF\n");
  129. #ifdef SCAN
  130.         do_error("macunpack: Premature EOF");
  131. #endif /* SCAN */
  132.         exit(1);
  133.         }
  134.     }
  135.     }
  136. }
  137.  
  138.