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 / stf.c < prev    next >
C/C++ Source or Header  |  1995-09-18  |  5KB  |  224 lines

  1. #include "macunpack.h"
  2. #ifdef STF
  3. #include "stf.h"
  4. #include "globals.h"
  5. #include "huffman.h"
  6. #include "../util/curtime.h"
  7. #include "../fileio/wrfile.h"
  8. #include "../fileio/machdr.h"
  9. #include "../util/util.h"
  10.  
  11. extern void de_huffman();
  12. extern void set_huffman();
  13.  
  14. typedef struct{
  15.     int num;
  16.     int next;
  17. } table_struct;
  18.  
  19. static table_struct table[511];
  20. static char length[256];
  21.  
  22. static void stf_wrfile();
  23. static void stf_wrfork();
  24. static void stf_construct();
  25.  
  26. void stf(ibytes)
  27. unsigned long ibytes;
  28. {
  29.     char magic[3], fauth[5], ftype[5];
  30.     int filel, i;
  31.     unsigned int rsrcLength, dataLength;
  32.     unsigned long curtime;
  33.  
  34.     set_huffman(HUFF_LE);
  35.     for(i = 0; i < 3; i++) {
  36.     magic[i] = getb(infp);
  37.     }
  38.     if(strncmp(magic, MAGIC, 3)) {
  39.     (void)fprintf(stderr, "Error in magic header.\n");
  40. #ifdef SCAN
  41.     do_error("macunpack: Error in magic header");
  42. #endif /* SCAN */
  43.     exit(1);
  44.     }
  45.     for(i = 0; i < INFOBYTES; i++) {
  46.     info[i] = 0;
  47.     }
  48.     filel = getb(infp);
  49.     info[I_NAMEOFF] = filel;
  50.     i = filel;
  51.     for(i = 1; i <= filel; i++) {
  52.     info[I_NAMEOFF + i] = getb(infp);
  53.     }
  54.     for(i = 0; i < 4; i++) {
  55.     info[I_TYPEOFF + i] = getb(infp);
  56.     }
  57.     for(i = 0; i < 4; i++) {
  58.     info[I_AUTHOFF + i] = getb(infp);
  59.     }
  60.     curtime = (unsigned long)time((time_t *)0) + TIMEDIFF;
  61.     put4(info + I_CTIMOFF, curtime);
  62.     put4(info + I_MTIMOFF, curtime);
  63.     rsrcLength = 0;
  64.     for(i = 0; i < 4; i++) {
  65.     rsrcLength = (rsrcLength << 8) + getb(infp);
  66.     }
  67.     put4(info + I_RLENOFF, (unsigned long)rsrcLength);
  68.     dataLength = 0;
  69.     for(i = 0; i < 4; i++) {
  70.     dataLength = (dataLength << 8) + getb(infp);
  71.     }
  72.     put4(info + I_DLENOFF, (unsigned long)dataLength);
  73.     ibytes -= filel + 20;
  74.     write_it = 1;
  75.     if(list) {
  76.     transname(info + I_NAMEOFF + 1, text, (int)info[I_NAMEOFF]);
  77.     transname(info + I_TYPEOFF, ftype, 4);
  78.     transname(info + I_AUTHOFF, fauth, 4);
  79.     do_indent(indent);
  80.     (void)fprintf(stderr,
  81.         "name=\"%s\", type=%4.4s, author=%4.4s, data=%ld, rsrc=%ld",
  82.         text, ftype, fauth, (long)dataLength, (long)rsrcLength);
  83.     if(info_only) {
  84.         write_it = 0;
  85.     }
  86.     if(query) {
  87.         write_it = do_query();
  88.     } else {
  89.         (void)fputc('\n', stderr);
  90.     }
  91.     }
  92.     stf_wrfile((unsigned long)rsrcLength, (unsigned long)dataLength, ibytes);
  93. }
  94.  
  95. static void stf_wrfile(rsrcLength, dataLength, ibytes)
  96. unsigned long rsrcLength, dataLength, ibytes;
  97. {
  98.     unsigned long num = 0;
  99.  
  100.     if(write_it) {
  101.     define_name(text);
  102.     start_info(info, rsrcLength, dataLength);
  103.     start_rsrc();
  104.     stf_wrfork(&num, rsrcLength, 0);
  105.     start_data();
  106.     stf_wrfork(&num, rsrcLength + dataLength, (int)(rsrcLength & 0xfff));
  107.     end_file();
  108.     } else {
  109.     for(num = 0; num < ibytes; num++) {
  110.         (void)getb(infp);
  111.     }
  112.     }
  113.     if(verbose) {
  114.     (void)fprintf(stderr, "\tHuffman compressed (%4.1f%%).\n",
  115.         100.0 * ibytes / (rsrcLength + dataLength));
  116.     }
  117. }
  118.  
  119. static void stf_wrfork(num, towrite, offs)
  120. unsigned long *num, towrite;
  121. int offs;
  122. {
  123.     int c, k, max, i, i1;
  124.     char *tmp_out_ptr;
  125.  
  126.     while(*num < towrite) {
  127.     if((*num & 0xfff) == 0) {
  128.         clrhuff();
  129.         c = getb(infp) & 0xff;
  130.         k = c;
  131.         max = 0;
  132.         for(i = 0; i < k; i++) {
  133.         c = getb(infp) & 0xff;
  134.         nodelist[i + 1].flag = 1;
  135.         nodelist[i + 1].byte = i + 1;
  136.         table[i + 1].num = c;
  137.         table[i + 1].next = 0;
  138.         if(c > max) {
  139.             max = c;
  140.         }
  141.         }
  142.         for(i = k; i < 32; i++) {
  143.         nodelist[i + 1].flag = 1;
  144.         nodelist[i + 1].byte = i + 1;
  145.         table[i + 1].num = 0;
  146.         table[i + 1].next = 0;
  147.         }
  148.         k = 0;
  149.         for(i = 0; i <= max; i++) {
  150.         for(i1 = 1; i1 < 33; i1++) {
  151.             if(table[i1].num == i) {
  152.             table[k].next = i1;
  153.             k = i1;
  154.             }
  155.         }
  156.         }
  157.         stf_construct(32);
  158.         tmp_out_ptr = out_ptr;
  159.         out_ptr = length;
  160.         de_huffman((unsigned long)256);
  161.         out_ptr = tmp_out_ptr;
  162.         for(i = 1; i < 257; i++) {
  163.         table[i].num = 0x40000000 >> length[i - 1];
  164.         nodelist[i].flag = 1;
  165.         nodelist[i].byte = i - 1;
  166.         table[i].next = 0;
  167.         }
  168.         k = 0;
  169.         for(i = 1; i < 0x40000000; i <<= 1) {
  170.         for(i1 = 1; i1 < 257; i1++) {
  171.             if(table[i1].num == i) {
  172.             table[k].next = i1;
  173.             k = i1;
  174.             }
  175.         }
  176.         }
  177.         stf_construct(256);
  178.     }
  179.     i = 0x1000 - offs;
  180.     offs = 0;
  181.     if(i > towrite - *num) {
  182.         i = towrite - *num;
  183.     }
  184.     de_huffman((unsigned long)i);
  185.     *num += i;
  186.     }
  187. }
  188.  
  189. static void stf_construct(n)
  190. int n;
  191. {
  192.     int i, i1, i2, j1, k;
  193.  
  194.     j1 = n + 1;
  195.     i = table[0].next;
  196.     i1 = table[i].next;
  197.     while(table[i1].next != 0) {
  198.     k = table[i].num + table[i1].num;
  199.     table[j1].num = k;
  200.     nodelist[j1].flag = 0;
  201.     nodelist[j1].zero = nodelist + i;
  202.     nodelist[j1].one = nodelist + i1;
  203.     i2 = i1;
  204.     i = table[i2].next;
  205.     while(i != 0 && table[i].num <= k) {
  206.         i2 = i;
  207.         i = table[i].next;
  208.     }
  209.     table[j1].next = i;
  210.     table[i2].next = j1;
  211.     i = table[i1].next;
  212.     i1 = table[i].next;
  213.     j1++;
  214.     }
  215.     table[0].num = table[i].num + table[i1].num;
  216.     nodelist[0].flag = 0;
  217.     nodelist[0].zero = nodelist + i;
  218.     nodelist[0].one = nodelist + i1;
  219. }
  220. #else /* STF */
  221. int stf; /* keep lint and some compilers happy */
  222. #endif /* STF */
  223.  
  224.