OSDN Git Service

*** empty log message ***
authorarai <arai@6a8cc165-1e22-0410-a132-eb4e3f353aba>
Tue, 11 Feb 2003 14:59:29 +0000 (14:59 +0000)
committerarai <arai@6a8cc165-1e22-0410-a132-eb4e3f353aba>
Tue, 11 Feb 2003 14:59:29 +0000 (14:59 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/lha/lha/trunk@646 6a8cc165-1e22-0410-a132-eb4e3f353aba

Hackinf_of_LHa

index 0f44bf8..2d4d9e0 100644 (file)
@@ -3796,13 +3796,13 @@ buf |  32 | c1  | c2  | len |    off    |  ...
 
 ----------------------------------------------------------------------------
 
-output_mask        128   64    32                16    8     4     2     1
-            +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
-buf         |  32 | c1  | c2  | len |    off    |  c3 |  c4 |  c5 |  c6 |  c7 |
-            +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
-            cpos                                                             /
-                                                                            /
-                                                                   output_pos
+output_mask    128   64    32                16    8     4     2     1
+        +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
+buf     |  32 | c1  | c2  | len |    off    |  c3 |  c4 |  c5 |  c6 |  c7 |
+        +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
+        cpos                                                             /
+                                                                        /
+                                                               output_pos
 
 ----------------------------------------------------------------------------
 
@@ -3961,10 +3961,10 @@ root 
 ÃÍ root ¤À)¡£¤³¤Î¤È¤­°Ê²¼¤Î¤è¤¦¤Ê½ÐÎϤˤʤ롣(TBIT{5}, CBIT{9} ¤Ç¤¢¤ë)
 
 ----------------------------------------------------------------------------
-      5bit
-   5bit   9bit 9bit
-   |--|--|----|----|
-   +--+--+----+----+
+      TBIT    CBIT
+   TBIT   CBIT
+   |--|--|----|----|               TBIT: 5
+   +--+--+----+----+               CBIT: 9
    | 0| 0|   0|root|
    +--+--+----+----+
 
@@ -4230,9 +4230,228 @@ count 
      0        20°Ê¾å    t_freq[2]++
    0°Ê³°                t_freq[c_len[i]+2]++;
 
-¤³¤ì¤¬¤É¤¦¤¤¤¦Íý¶þ¤Ç¤¢¤ë¤«¤Ï¤è¤¯¤ï¤«¤é¤Ê¤¤¤¬¡¢¤È¤Ë¤«¤¯ÉÑÅÙ·×»»¤ò
-¹Ô¤¦¾ì¹ç¤Ë t_freq[0], t_freq[1], t_freq[2] ¤òÆÃÊÌ°·¤¤¤·¤Æ¤¤¤ë¡£
+¤³¤ì¤¬¤É¤¦¤¤¤¦Íý¶þ¤Ç¤¢¤ë¤«¤Ï¤è¤¯¤ï¤«¤é¤Ê¤¤¤¬¡¢¤È¤Ë¤«¤¯ÉÑÅÙ·×»»¤ò¹Ô¤¦¾ì
+¹ç¤Ë t_freq[0], t_freq[1], t_freq[2] ¤òÆÃÊÌ°·¤¤¤·¤Æ¤¤¤ë¡£¤½¤·¤Æ¡¢ÉÑÅÙ
+·×»»¤ÎÂоݤ¬ c_len[] ¤Ç¤¢¤ë¤³¤È¤«¤é (B) ¤Î½èÍý¤Ï¡¢c_len[] ¤Ë´Ø¤·¤Æ 
+Huffman Éä¹æ²½¤ò¹Ô¤¦½èÍý¤Î¤è¤¦¤À¡£
+
+¤½¤¦¤·¤Æ¡¢make_tree() ¤Ç¡¢t_freq[] ¤Ë´Ø¤·¤Æ Huffman Éä¹æɽ¤òºîÀ®¤·¡¢
+write_pt_len() ¤Ç¡¢¤³¤ÎÉä¹æɽ(ʸ»ú¤Î Huffman Éä¹æ¤Î¥Ó¥Ã¥ÈĹ c_len ¤Î 
+Huffman Éä¹æ¤Î¥Ó¥Ã¥ÈĹ) pt_len[] ¤ò½ÐÎϤ¹¤ë¡£
+
+static void
+write_pt_len(n, nbit, i_special)
+    short           n;
+    short           nbit;
+    short           i_special;
+{
+    short           i, k;
+
+    while (n > 0 && pt_len[n - 1] == 0)
+        n--;
+    putbits(nbit, n);
+    i = 0;
+    while (i < n) {
+        k = pt_len[i++];
+        if (k <= 6)
+            putbits(3, k);
+        else
+            putbits(k - 3, USHRT_MAX << 1);
+        if (i == i_special) {
+            while (i < 6 && pt_len[i] == 0)
+                i++;
+            putbits(2, i - 3);
+        }
+    }
+}
+
+ºÇ½é¤Ë pt_len[] ¤ÎÍ×ÁÇ¿ô¤ò TBIT{5} ½ÐÎϤ·¡¢Â³¤±¤ÆÉä¹æ bit Ä¹ pt_len[] 
+¤ÎÍ×ÁǤò½ÐÎϤ·¤Æ¤¤¤ë¡£pt_len[] ¤ò½ÐÎϤ¹¤ë¤È¤­¤Ï¡¢¤½¤ÎÃͤ¬ 6 ¤è¤êÂ礭¤¤
+¤«¤É¤¦¤«¤Ç·Á¼°¤òÊѤ¨¤Æ½ÐÎϤ·¤Æ¤¤¤ë¡£6 °Ê²¼¤Ç¤¢¤ì¤Ð¤½¤Î¤Þ¤Þ 3 bit ¤Ç½Ð
+ÎϤ·¡¢7 bit °Ê¾å¤Ç¤¢¤ì¤Ð¡¢bit ¿ô¤Çɽ¸½¤¹¤ë¤é¤·¤¤¡£Î㤨¤Ð pt_len[i] ==
+7 ¤Ê¤é¡¢1110 ¤È¤Ê¤ë¡£ºÇ½é¤Î 3 bit ¤Ïɬ¤º 1 ¤Ë¤Ê¤ê¡¢ºÇ½é¤Î·Á¼°¤È¶èÊ̤¬
+¤Ä¤¯¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡£
+
+¤µ¤é¤Ë¡¢i_special ÈÖÌܤΠpt_len[i] ¤ò½ÐÎϸå¤Ï¡¢i_special ... 6 ¤ÎÈÏ°Ï
+¤Ç pt_len[i] == 0 ¤¬Â³¤¯¤³¤È¤ò 2 bit ¤Ç¡¢É½¸½¤·¤Æ¤¤¤ë¡£i_special ¤Ï
+write_pt_len() ¤Î 3 ÈÖÌܤΰú¿ô¤Ç¡¢º£²ó¤Î¾ì¹ç¤Ï 3 ¤À¡£Î㤨¤Ð 
+pt_len[3..5] ¤¬¤¹¤Ù¤Æ 0 ¤Ê¤é pt_len[3] ¤ò½ÐÎϸ塢i - 3 (= 3) ¤ò 2 bit 
+½ÐÎϤ¹¤ë¡£¤Ä¤Þ¤ê¡¢11 ¤¬½ÐÎϤµ¤ì¤ë¡£¤³¤Î¤è¤¦¤Ê¤³¤È¤ò¤·¤Æ¤¤¤ë°ÕÌ£¤Ï¤³¤ì
+¤Þ¤¿¤è¤¯¤ï¤«¤é¤Ê¤¤¡£¤Á¤ç¤Ã¤ÈÊ£»¨¤Ê¤Î¤Ç¿Þ¼¨¤·¤Æ¤ß¤¿¡£
+
+----------------------------------------------------------------------------
+< pt_len[] ¤Î½ÐÎÏ¥Õ¥©¡¼¥Þ¥Ã¥È >
+
+             0       TBIT{5}
+             +-------+-----------+-----------+--   --+-----------+
+             |   n   | pt_len[0] | pt_len[1] | ...    pt_len[n-1]|
+             +-------+-----------+-----------+--   --+-----------+
+
+pt_len[i] <= 6 ¤Î¾ì¹ç
+
+              0     3bit
+              +-----+
+    pt_len[i] | | | |
+              +-----+
+
+pt_len[i] >= 7 ¤Î¾ì¹ç
+
+              0             pt_len[i] - 3
+              +----------------+
+    pt_len[i] |1 1 1 1 ... 1 0 |
+              +----------------+
+
+pt_len[i_special] ¤Îľ¸å¤Ï 2 bit ¤Î¾ðÊó¤¬Éղ䵤ì¤ë¡£¤³¤ÎÃͤò x ¤È¤¹¤ë
+¤È¡¢pt_len[i_special .. x + 3] ¤ÎÈϰϤǠ0 ¤¬Â³¤¯¤³¤È¤ò°ÕÌ£¤¹¤ë¡£
+
+----------------------------------------------------------------------------
+
+ºÇ¸å¤Ë¡¢write_c_len() ¤Ç¡¢Éä¹æɽ c_len[] ¤È pt_code[] ¤ò½ÐÎϤ¹¤ë¡£
+
+static void
+write_c_len(/*void*/)
+{
+    short           i, k, n, count;
+
+    n = NC;
+    while (n > 0 && c_len[n - 1] == 0)
+        n--;
+    putbits(CBIT, n);
+    i = 0;
+    while (i < n) {
+        k = c_len[i++];
+        if (k == 0) {
+            count = 1;
+            while (i < n && c_len[i] == 0) {
+                i++;
+                count++;
+            }
+            if (count <= 2) {
+                for (k = 0; k < count; k++)
+                    putcode(pt_len[0], pt_code[0]);
+            }
+            else if (count <= 18) {
+                putcode(pt_len[1], pt_code[1]);
+                putbits(4, count - 3);
+            }
+            else if (count == 19) {
+                putcode(pt_len[0], pt_code[0]);
+                putcode(pt_len[1], pt_code[1]);
+                putbits(4, 15);
+            }
+            else {
+                putcode(pt_len[2], pt_code[2]);
+                putbits(CBIT, count - 20);
+            }
+        }
+        else
+            putcode(pt_len[k + 2], pt_code[k + 2]);
+    }
+}
+
+Á°¤Ë¡¢ÉÑÅÙ¤ò¿ô¤¨¤¿¤È¤­¤ÈƱÍͤξò·ï¤Ç½ÐÎÏ·Á¼°¤¬ÊѤï¤Ã¤Æ¤¤¤ë¡£½èÍýÆâÍƤÏ
+´Êñ¤Ê¤Î¤Ç¡¢°Ê²¼¤Î¿Þ¤ò¼¨¤¹¤À¤±¤Ë¤¹¤ë(Íý¶þ¤Ï¤è¤¯¤ï¤«¤é¤Ê¤¤)¡£
+
+----------------------------------------------------------------------------
+< c_len[] ¤Î½ÐÎÏ¥Õ¥©¡¼¥Þ¥Ã¥È >
+
+             0       CBIT{9}
+             +-------+-----------+-----------+--   --+-----------+
+             |   n   |  c_len[0] |  c_len[1] | ...     c_len[n-1]|
+             +-------+-----------+-----------+--   --+-----------+
+
+c_len[i] == 0 ¤Î¾ì¹ç
+
+ 0 ¤¬Â³¤¯¿ô¤ò count ¤È¤¹¤ë¤È¡¢
+
+ count == 0..2 ¤Î¾ì¹ç
+
+                pt_len[0]  
+              <----------> 
+             +------------+
+             | pt_code[0] |
+             +------------+
+
+ count == 3..18 ¤Î¾ì¹ç
+
+               pt_len[1]    4 bit
+              <----------> <------>
+             +------------+-------+
+             | pt_code[1] |count-3|
+             +------------+-------+
+
+ count == 19 ¤Î¾ì¹ç
+
+                pt_len[0]   pt_len[1]    4 bit
+              <----------> <----------> <------>
+             +------------+------------+-------+
+             | pt_code[0] | pt_code[1] |count-3|
+             +------------+------------+-------+
+
+  count >= 20 ¤Î¾ì¹ç
+
+                pt_len[2]    CBIT{9}
+              <----------> <------>
+             +------------+--------+
+             | pt_code[2] |count-20|
+             +------------+--------+
+
+c_len[i] != 0 ¤Î¾ì¹ç
+
+              pt_len[c_len[i]+2]
+             +-------------------+
+             |pt_code[c_len[i]+2]|
+             +-------------------+
+
+----------------------------------------------------------------------------
+
+¤³¤¦¤·¤Æ¡¢Ê¸»ú¤Î Huffman Éä¹æɽ¤Ï¡¢pt_len[] ¤È pt_code[](pt_code[] ¤Ï
+¤Ä¤Þ¤ê c_len[] ¤Î Huffman Éä¹æ)¤ò½ÐÎϤ¹¤ë¤³¤È¤Çɽ¸½¤µ¤ì¤ë¡£c_code[] ¤¬
+½ÐÎϤµ¤ì¤Æ¤Ê¤¤»×¤¦¤«¤â¤·¤ì¤Ê¤¤¤¬¡¢¤ª¤½¤é¤¯¡¢decode ½èÍý¤¬ c_len[] ¤ÎÃÍ
+¤«¤é·×»»¤·¤Æµá¤á¤Æ¤¤¤ë¤Î¤Ç¤Ï¤Ê¤¤¤«¤È»×¤ï¤ì¤ë¡£¤³¤ì¤Ï decode ½èÍý¤Î²òÆÉ
+¤ÇÌÀ¤é¤«¤Ë¤Ê¤ë¤À¤í¤¦¡£
+
+¤³¤Î¸å¡¢send_block() ¤Ï¡¢<off> ¤Î Huffman Éä¹æɽ¤ò½ÐÎϤ¹¤ë¤Î¤À¤¬¡¢¤³¤ì
+¤Ï¡¢Àè¤Î pt_len[] ¤Î½ÐÎÏ¥Õ¥©¡¼¥Þ¥Ã¥È¤ÈƱ¤¸¤Ê¤Î¤Ç¾ÜºÙ¤Ï¤Ï¤·¤ç¤í¤¦¡£
+
+¤Þ¤È¤á¤ë¤È LHA ¤Ë¤ª¤±¤ë°µ½Ì¥Õ¥¡¥¤¥ë¤Î¹½Â¤¤Ï°Ê²¼¤ÎϢ³¤Ç¤¢¤ë¤È¸À¤¨¤ë¤è
+¤¦¤À¡£
+
+----------------------------------------------------------------------------
+LHA ¥Õ¥¡¥¤¥ë¤Î¹½Â¤(1 ¥Ö¥í¥Ã¥¯Ê¬)
+
+    +-----------+
+    | blocksize |
+    +-----------+
+       16bit
+
+    +-----+--------------------+
+    | len |      pt_len        | c_len¤Î¥Ï¥Õ¥Þ¥óÉä¹æɽ
+    +-----+--------------------+
+      5bit        ?? bit
+      TBIT
+
+    +-------+------------------+
+    |  len  |     c_len        | Ê¸»ú¤ÈŤµ¤Î¥Ï¥Õ¥Þ¥óÉä¹æɽ
+    +-------+------------------+
+      9bit        ?? bit
+      CBIT
+
+    +---------+--------------------+
+    |   len   |   pt_len           | °ÌÃ֤ΥϥեޥóÉä¹æɽ
+    +---------+--------------------+
+     pbit         ?? bit
+                               (pbit=14bit(lh4,5) or 16bit(lh6) or 17bit(lh7))
+
+    +---------------------+
+    |  °µ½Ìʸ             |
+    +---------------------+
+
+----------------------------------------------------------------------------
 
+¤³¤³¤Þ¤Ç¤Î²òÆɤǤϺÙÉô¤ò¤«¤Ê¤ê¤Ï¤·¤ç¤Ã¤¿¤¬¡¢decode ½èÍý¤ò¸«¤ì¤Ð¤ï¤«¤ë
+¤³¤È¤â¤¢¤ë¤Ç¤¢¤í¤¦¤³¤È¤ò´üÂÔ¤·¤Æ¤¤¤ë¡£°Ê¹ß¡¢decode ½èÍý¤ÎÆâÍƤò½èÍý¤Î
+ή¤ì¤òÄɤ¦¤³¤È¤Ç³Îǧ¤·¤è¤¦¡£
 
 # Local Variables:
 # mode : indented-text