----------------------------------------------------------------------------
-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
----------------------------------------------------------------------------
ÃÍ root ¤À)¡£¤³¤Î¤È¤°Ê²¼¤Î¤è¤¦¤Ê½ÐÎϤˤʤ롣(TBIT{5}, CBIT{9} ¤Ç¤¢¤ë)
----------------------------------------------------------------------------
- 5bit
- 5bit 9bit 9bit
- |--|--|----|----|
- +--+--+----+----+
+ TBIT CBIT
+ TBIT CBIT
+ |--|--|----|----| TBIT: 5
+ +--+--+----+----+ CBIT: 9
| 0| 0| 0|root|
+--+--+----+----+
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