¤âÌÀ¼¨Åª¤À¡£¤³¤Î½ñ¤´¹¤¨¤ò¹Ô¤¦¾ì¹ç¡¢scan_beg ¤¬Éé¤ÎÃͤˤʤë²ÄǽÀ¤¬¤¢
¤ë¡£¸µ¤â¤È¤Î½èÍý¤Ç¤Ï scan_end Åù¤ÎÊÑ¿ô¤ò unsigned ¤Ë¤·¤Æ¤¤¤ë¤Î¤Ç¡¢¤³¤ì
¤é¤ò int ¤Ë¤·¤Æ while ¾ò·ï¤ÇÉé¤Î scan_beg ¤ò¤Ï¤¸¤«¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤³¤È
-¤ËÃí°Õ¡£¤½¤¦¤¹¤ë¤È¡¢scan_beg != NIL ¤ÏɬÍפʤ¯¤Ê¤ë¤Î¤À¤¬¤ï¤«¤ê¤ä¤¹¤µ¤ò
+¤ËÃí°Õ¡£¤½¤¦¤¹¤ë¤È¡¢scan_pos != NIL ¤ÏɬÍפʤ¯¤Ê¤ë¤Î¤À¤¬¤ï¤«¤ê¤ä¤¹¤µ¤ò
Äɵᤷ¤¿¡£
¤³¤ì¤Ç match_insert() ¤Î²òÆɤϽª¤ê¤À¡£match_insert() ¤Î½èÍý¤È¤Ï°Ê²¼¤Î
avail ¤ÏºÇ½é n (nparm)¤À¤Ã¤¿¡£freq[] ¤Ï¡¢Ê¸»ú¤Î½Ð¸½²ó¿ô¤Ê¤Î¤ÇºÇ½éʸ»ú
¤Î¼ïÎà¿ôʬ(nparm)¤ÎÍ×ÁǤ·¤«¤Ê¤¤¤¬¥Ï¥Õ¥Þ¥óÌÚ¤ÎÀá¤Î½Ð¸½²ó¿ô(¤È¤¤¤¦¤«Í¥Àè
-½ç°Ì)¤ò³ÊǼ¤¹¤ë¤¿¤á¤Ë freq[] ¤Ï¡¢nparm * 2 ¤Î³ÊǼ°è¤¬É¬ÍפȤʤ뤳¤È¤¬
-¤ï¤«¤ë¡£
+½ç°Ì)¤ò³ÊǼ¤¹¤ë¤¿¤á¤Ë freq[] ¤Ï¡¢nparm * 2 - 1 ¤Î³ÊǼ°è¤¬É¬ÍפȤʤ뤳
+¤È¤¬¤ï¤«¤ë¡£(ÍÕ¤¬ n ¸Ä¤¢¤ë 2 ʬÌڤˤϡ¢À᤬ n - 1 ¸Ä¤¢¤ë)
+
+----------------------------------------------------------------------------
+
+ +-----------------------+-----------------------+
+freq | | |
+ +-----------------------+-----------------------+
+ 0 nparm nparm * 2 - 1
+
+ |-----------------------|-----------------------|
+ ʸ»ú(¥Ï¥Õ¥Þ¥óÌÚ¤ÎÍÕ) ¥Ï¥Õ¥Þ¥óÌÚ¤ÎÀá¤ÎÍ¥Àè½ç°Ì
+ ¤ÎÍ¥Àè½ç°Ì
- freq[0 ... nparm] ʸ»ú(¥Ï¥Õ¥Þ¥óÌÚ¤ÎÍÕ)¤ÎÍ¥Àè½ç°Ì
- freq[nparm ... nparm * 2 - 1] ¥Ï¥Õ¥Þ¥óÌÚ¤ÎÀá¤ÎÍ¥Àè½ç°Ì
+
+ Îã:
+ . ... freq[4]
+ / \
+ . \ ... freq[3]
+ /\ \
+ a b c ... freq[0 .. 2]
+
+----------------------------------------------------------------------------
¤³¤³¤Þ¤Ç¤Ç¡¢½Ð¸½²ó¿ô¤ÎÄ㤤2¤Ä¤ÎÍ×ÁǤò¼è¤ê½Ð¤·¤½¤Î½Ð¸½²ó¿ô¤ÎϤò
freq[k] ¤ËÀßÄꤹ¤ë¤³¤È¤Ë¤Ê¤ë¡£½Ð¸½²ó¿ô¤ÎÏÂ¤Ï heap[] ¤ËºÆÀßÄꤵ¤ì¡¢
¤È¤¹¤ë¤È¡¢
/* (E) */
- sort = codeparm;
do {
left = delete_pqueue(heap);
right = delete_pqueue(heap);
- k = avail++;
- freq[k] = freq[i] + freq[j];
+ node = avail++;
+ freq[node] = freq[left] + freq[right];
- insert_pqueue(heap, freq[k]);
+ insert_pqueue(heap, freq[node]);
- make_huff(&huff, k, left, right);
+ make_huff(&huff, node, left, right);
} while (heapsize > 1);
¤³¤ó¤Ê¤È¤³¤í¤À¤í¤¦¤«¡£¸µ¤Î½èÍý¤Ç¤Ï¥Ò¡¼¥×¤«¤é¤ÎÍ×ÁǤμè¤ê½Ð¤·¤ÈÁÞÆþ¤Ç̵
¤³¤ì¤Ï¤Á¤ç¤Ã¤È¹Í¤¨¤µ¤»¤é¤ì¤ë¤È¤³¤í¤À¡£
¥ë¡¼¥×¤òÈ´¤±¤¿½ê¤Ç k (avail - 1) ¤Ï¡¢¥Ï¥Õ¥Þ¥óÌڤꬤòɽ¤·¤Æ¤¤¤ë¡£
-left[0:avail], right[0:avail] ¤¬¥Ï¥Õ¥Þ¥óÌÚ¤ò¼¨¤·¡¢left[nparm...avail],
-right[nparm...avail] ¤¬Àá¤ò¼¨¤·¤Æ¤¤¤ë¡£left[0...nparm],
-right[0...nparm] ¤Ï»È¤ï¤ì¤Ê¤¤¤è¤¦¤À¡£(¥Æ¥¥¹¥È¤Ç¤ÏÌÚ¹½Â¤¤ò¿Þ¼¨¤¹¤ë¤Î¤Ï
-¤¤Ä¤¤¤Î¤Ç¤ä¤á¤Æ¤ª¤³¤¦)
+left[0:avail], right[0:avail] ¤Ç¥Ï¥Õ¥Þ¥óÌÚ¤òɽ¤·¡¢¤½¤Î¤¦¤Á
+left[nparm...avail], right[nparm...avail] ¤¬Àá¤Î»Ò¤ò¼¨¤·¤Æ¤¤¤ë¡£
+left[0...nparm], right[0...nparm] ¤Ï»È¤ï¤ì¤Ê¤¤¤è¤¦¤À¡£
+
+----------------------------------------------------------------------------
+ Îã:
+ . -- k (= avail-1)
+ / \
+ left[k] -- . \
+ /\ \
+ a b c -- right[k]
+ | \
+ | right[left[k]]
+ left[left[k]]
+
+----------------------------------------------------------------------------
¤³¤ì¤Ç¡¢¥Ï¥Õ¥Þ¥óÌڤι½ÃۤϽª¤ê¤Ê¤Î¤À¤¬¡¢¥Ï¥Õ¥Þ¥óË¡¤ÎÉä¹æ²½¤Ç¤Ï¥Ï¥Õ¥Þ¥ó
ÌÚ¤ÎÍÕ¤«¤éº¬¤Ë¸þ¤«¤Ã¤ÆÌÚ¤òé¤ëɬÍפ¬¤¢¤ë¤Ï¤º¤Ê¤Î¤Ë¡¢left[]¡¢right[] ¤Î
c 2 2 4 2^14 10000000 00000000
d 2 2 4 2^14 11000000 00000000
-¤À¡£¤È¤Ë¤«¤¯ code[] (¼ÂºÝ¤Ë¤Ï codeparm) ¤òÍøÍѤ¹¤ë¤³¤È¤Çɽ°ú¤¤Çʸ»ú¤Ë
+¤À¡£°Ê¹ß¡¢code[] (¼ÂºÝ¤Ë¤Ï codeparm) ¤òÍøÍѤ¹¤ë¤³¤È¤Çɽ°ú¤¤Çʸ»ú¤Ë
Âбþ¤¹¤ë¥Ï¥Õ¥Þ¥óÉä¹æ¤òÆÀ¤ë¤³¤È¤¬¤Ç¤¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë(code[c]¤Î¤¦¤Á¾å
-°Ìlen[c]¥Ó¥Ã¥È¤À¤±¤ò¸«¤ë)¡£Éä¹æ²½¤ÎºÝ¤ËÌÚ¤òé¤ëɬÍפϤʤ¯¡¢¹â®¤ÊÉä¹æ
+°Ì len[c] ¥Ó¥Ã¥È¤À¤±¤ò¸«¤ë)¡£Éä¹æ²½¤ÎºÝ¤ËÌÚ¤òé¤ëɬÍפϤʤ¯¡¢¹â®¤ÊÉä¹æ
²½¤¬²Äǽ¤Ë¤Ê¤ë(¤È´üÂÔ¤µ¤ì¤ë¡£¤É¤ÎÄøÅÙ¸ú²Ì¤¬¤¢¤ë¤«¤Ï¤¤¤º¤ì¸¡¾Ú¤·¤Æ¤ß¤¿
¤¤¡£¤½¤¦¤¤¤¨¤Ð¡¢ÍÕ¤«¤éº¬¤Ë¸þ¤«¤Ã¤ÆÌÚ¤òé¤ë¤¿¤á¤Î¾ðÊó¤¬É¬Íפʤ«¤Ã¤¿¤³¤È
¤â¤³¤ì¤Ç¤ï¤«¤Ã¤¿)¡£
/\ /\ .. len_cnt[15] = 0000000000000000
o p q r .. len_cnt[16] = 0000000000000100
+ʸ»ú¤«¤é Huffman Éä¹æ¤¬ÆÀ¤é¤ì¤ë¤è¤¦¤Ë¤Ê¤Ã¤¿¤Î¤Ç¡¢°µ½Ì½èÍý¤ò¹Ô¤¦Æ»¶ñ¤Ï
+·¤Ã¤¿¡£¤¤¤è¤¤¤è Huffman Ë¡¤Ë¤è¤ë°µ½Ì½èÍýÁ´ÈÌ (huf.c) ¤ò¸«¤ë¤³¤È¤Ë¤·¤è
+¤¦¡£
+
+¤Þ¤º huf.c ¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¥Ç¡¼¥¿¹½Â¤¤«¤é³Îǧ¤·¤è¤¦¡£¥Ç¡¼¥¿¹½Â¤¤¬¤ï¤«¤Ã
+¤Æ¤·¤Þ¤¨¤Ð¥¢¥ë¥´¥ê¥º¥à¤Î 90% ¤Ï¤ï¤«¤Ã¤¿¤âƱÁ³¤À(¸ØÄ¥)¡£
+
+huf.c ¤Ë¤Ï°Ê²¼¤ÎÊÑ¿ô¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¡£
+
+unsigned short left[2 * NC - 1], right[2 * NC - 1];
+unsigned char c_len[NC], pt_len[NPT];
+unsigned short c_freq[2 * NC - 1], c_table[4096], c_code[NC], p_freq[2 * NP - 1],
+ pt_table[256], pt_code[NPT], t_freq[2 * NT - 1];
+
+static unsigned char *buf;
+static unsigned int bufsiz;
+static unsigned short blocksize;
+static unsigned short output_pos, output_mask;
+static int pbit;
+static int np;
+
+»ÈÍѤµ¤ì¤Æ¤¤¤ëÄê¿ô¤â³Îǧ¤¹¤ë lha_macro.h ¤À¡£
+
+#define NP (MAX_DICBIT + 1)
+#define NT (USHRT_BIT + 3)
+#define PBIT 5 /* smallest integer such that (1 << PBIT) > * NP */
+#define TBIT 5 /* smallest integer such that (1 << TBIT) > * NT */
+#define NC (UCHAR_MAX + MAXMATCH + 2 - THRESHOLD)
+/* #if NT > NP #define NPT NT #else #define NPT NP #endif */
+#define NPT 0x80
+#define CBIT 9 /* $\lfloor \log_2 NC \rfloor + 1$ */
+
+¤¿¤¯¤µ¤ó¤¢¤ë¡£¤¿¤¯¤µ¤ó¤¢¤ê¤¹¤®¤Æ¤¯¤¸¤±¤½¤¦¤À¤¬(»ö¼Â¡¢¤¯¤¸¤±¤¿)¡¢¸½»þÅÀ
+¤Ç¤ï¤«¤ëÊÑ¿ô¤â¤¢¤ë¡£left[] ¤ä right[] ¤Ï Huffman ÌÚ¤ò¹½ÃÛ¤¹¤ë¤Î¤Ë»ÈÍÑ
+¤·¤¿ÊÑ¿ô¤À¤Ã¤¿¡£¤½¤³¤«¤é NC ¤Ïʸ»ú¼ï¤ÎºÇÂç¿ô¤Ç¤¢¤ë¤³¤È¤¬¤ï¤«¤ë¡£NC ¤Ë
+MAXMATCH{256} Åù¤ÎÃͤ¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¤Î¤ÏÆæ¤À¤¬¡¢¸½»þÅÀ¤Ç¤Ï̵»ë¤·¤Æ¤ª¤³
+¤¦¡£
+
+c_freq[] ¤ä c_len[], p_freq[], pt_len[] ¤â make_tree() ¤Ç½Ð¤ÆÍ褿ÊÑ¿ô
+̾¤Ë»÷¤Æ¤¤¤ë¡£¤ª¤½¤é¤¯ make_tree() ¤ËÅϤ¹ÊÑ¿ô¤À¤í¤¦¡£³Îǧ¤·¤Æ¤ß¤¿¤È¤³
+¤í huf.c ¤«¤é make_tree() ¤Î¸Æ¤Ó½Ð¤·¤ò¹Ô¤Ã¤Æ¤¤¤ëÉôʬ¤òÈ´¤½Ð¤¹¤È¡¢
+
+ root = make_tree(NC, c_freq, c_len, c_code);
+ root = make_tree(NT, t_freq, pt_len, pt_code);
+ root = make_tree(np, p_freq, pt_len, pt_code);
+
+¤Î 3 ²Õ½ê¤¬½Ð¤ÆÍ褿¡£¤Ä¤Þ¤ê¡¢
+
+ ʸ»ú¼ï¤Î¿ô ʸ»ú¤Î½Ð¸½²ó¿ô Éä¹æ²½¤·¤¿Ê¸»ú ʸ»ú¤ËÂбþ¤¹¤ë
+ ¤Î bit Ĺ Huffman Éä¹æɽ
+ -----------------------------------------------------------
+ NC c_freq c_len c_code
+ NT t_freq pt_len pt_code
+ np p_freq pt_len pt_code
+
+¤È¤¤¤¦´Ø·¸¤Î¤è¤¦¤À¡£¤É¤¦¤ä¤é c_code¡¢pt_code ¤È¤¤¤¦ 2 ¼ïÎà¤Î
+Huffman Éä¹æɽ¤ò»ÈÍѤ¹¤ë¤é¤·¤¤¡£
+
+¤½¤Î¾¤ÎÊÑ¿ô¤Ë´Ø¤·¤Æ¤âͽÁÛ¤òΩ¤Æ¤¿¤¤½ê¤À¤¬¡¢¤â¤¦¤¯¤¸¤±¤¿¤Î¤Ç¡¢½èÍýÆâÍÆ
+¤«¤é¹¶¤á¤ë¤³¤È¤Ë¤·¤¿¡£
+
+slide ¼½ñË¡¤Î²òÆÉ¤Ç Huffman Ë¡¤Ë´ØÏ¢¤·¤¿½èÍý¤Î¸Æ¤Ó½Ð¤·¤¬¤¤¤¯¤Ä¤«¤¢¤Ã
+¤¿¡£
+
+ /* initialize */
+ alloc_buf()
+
+ /* encoder */
+ encode_set.encode_start()
+ encode_set.output(c, off)
+ encode_set.encode_end()
+
+ /* decoder */
+ decode_set.decode_start()
+ decode_set.decode_c()
+ decode_set.decode_p()
+
+°Ê¾å¤À¡£lh4, 5, 6, 7 ¤Ç¤Ï¡¢¾åµ¤Î¤½¤ì¤¾¤ì¤Ï¡¢huf.c ¤Î°Ê²¼¤Î´Ø¿ô¤Î¸Æ¤Ó
+½Ð¤·¤ËÂбþ¤·¤Æ¤¤¤ë¡£¤³¤ì¤Ï¡¢slide.c ¤ÎËÁƬÉôʬ¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¡£
+
+ /* encoder */
+ encode_start() -> encode_start_st1()
+ output() -> output_st1()
+ encode_end() -> encode_end_st1()
+
+ /* decoder */
+ decode_start() -> decode_start_st1()
+ decode_c() -> decode_c_st1()
+ decode_p() -> decode_p_st1()
+
+¤³¤Î¤¦¤Á¤Î°µ½Ì½èÍý¤Ë¤¢¤¿¤ëÉôʬ encode_start_st1(), output_st1(),
+encode_end_st1() ¤ò¸«¤Æ¤¤¤³¤¦¡£¤Þ¤º¤Ï¡¢½é´ü²½½èÍý¤Ç¤¢¤ë
+encode_start_st1() ¤«¤é¡¢
+
+void
+encode_start_st1( /* void */ )
+{
+ int i;
+
+ if (dicbit <= 13) {
+ pbit = 4; /* lh4,5 etc. */
+ np = 14;
+ } else {
+ pbit = 5; /* lh6,7 */
+ if (dicbit == 16)
+ np = 17;
+ else
+ np = 16;
+ }
+
+ for (i = 0; i < NC; i++)
+ c_freq[i] = 0;
+ for (i = 0; i < np; i++)
+ p_freq[i] = 0;
+ output_pos = output_mask = 0;
+ init_putbits();
+ buf[0] = 0;
+}
+
+dicbit (¤³¤ì¤Ï¼½ñ¤Î bit ¥µ¥¤¥º¤À¤Ã¤¿)¤Ë¤è¤Ã¤Æ¡¢np, pbit ¤ÎÃͤ¬ÊѤï¤ë¡£
+dicbit ¤Î°ã¤¤¤È¤¤¤¦¤Î¤Ï LHa ¤Î encoding ¥á¥½¥Ã¥É¤Î°ã¤¤¤À¡£¤½¤ì¤¾¤ì°Ê²¼
+¤ÎÂбþ¤Ë¤Ê¤ë¡£
+
+ method dicbit np pbit
+ --------------------------
+ -lh4- 12 14 4
+ -lh5- 13 14 4
+ -lh6- 15 16 5
+ -lh7- 16 17 5
+
+np ¤È¤¤¤¦¤Î¤Ï¡¢ÀèÄø make_tree() ¤ò¸Æ¤Ó½Ð¤·¤Æ¤¤¤ë²Õ½ê¤ÎÀö¤¤½Ð¤·¤Ç¸«¤«¤±
+¤¿ÊÑ¿ô¤À¤Ã¤¿¡£¤Þ¤À¡¢¤³¤Î´ØÏ¢¤Ï¤è¤¯¤ï¤«¤é¤Ê¤¤¡£
+
+½èÍý¤Î¸åȾ¤Ç¤Ï¡¢Ê¸»ú¤Î½Ð¸½ÉÑÅÙ¤òɽ¤¹ c_freq[]¡¢p_freq[] ¤Î½é´ü²½¤ò
+¹Ô¤Ã¤Æ¤¤¤ë¡£¤µ¤é¤Ë
+
+ output_pos
+ output_mask
+ buf[]
+
+¤È¤¤¤¦½é½Ð¤ÎÊÑ¿ô¤â 0 ¤Ë½é´ü²½¤·¤Æ¤¤¤ë¡£(buf ¤Ï¡¢buf[0] ¤Î¤ß½é´ü²½¤·¤Æ
+¤¤¤ë) init_putbits() ¤Î¸Æ¤Ó½Ð¤·¤Ï bit ½ÐÎϥ롼¥Á¥ó¤Î½é´ü²½½èÍý¤À¤Ã¤¿¡£
+°Ê¹ß¡¢putbits(), putcode() ¤ò»ÈÍѤǤ¤ë¡£
+
+¼¡¤Ë output_st1(c, p) ¤ò¸«¤ë¡£slide.c ¤Ç¤³¤Î´Ø¿ô¤Ï°Ê²¼¤Î¤è¤¦¤Ë»ÈÍѤµ¤ì
+¤Æ¤¤¤¿¡£
+
+ output_st1(c, 0) ʸ»ú c ¤ò½ÐÎÏ
+ output_st1(len, off) <len, off> ¤Î¥Ú¥¢¤ò½ÐÎÏ
+
+¤³¤Î¤³¤È¤òƧ¤Þ¤¨¤¿¾å¤Ç¡¢½èÍýÆâÍƤò¸«¤Æ¤ß¤è¤¦¡£
+
+void
+output_st1(c, p)
+ unsigned short c;
+ unsigned short p;
+{
+ static unsigned short cpos;
+
+ /* (A) */
+ output_mask >>= 1;
+ if (output_mask == 0) {
+ output_mask = 1 << (CHAR_BIT - 1);
+ if (output_pos >= bufsiz - 3 * CHAR_BIT) {
+ send_block();
+ if (unpackable)
+ return;
+ output_pos = 0;
+ }
+ cpos = output_pos++;
+ buf[cpos] = 0;
+ }
+ /* (B) */
+ buf[output_pos++] = (unsigned char) c;
+ c_freq[c]++;
+ /* (C) */
+ if (c >= (1 << CHAR_BIT)) {
+ buf[cpos] |= output_mask;
+ buf[output_pos++] = (unsigned char) (p >> CHAR_BIT);
+ buf[output_pos++] = (unsigned char) p;
+ c = 0;
+ while (p) {
+ p >>= 1;
+ c++;
+ }
+ p_freq[c]++;
+ }
+}
+
+(A) ¤Ï¡¢output_mask ¤ÎÃͤ˱þ¤¸¤Æ½èÍý¤ò¹Ô¤¦¤è¤¦¤À¡£½é´ü²½¤Ç output_mask
+¤Ï 0 ¤À¤«¤é (A) ¤Î½èÍý¤ÏºÇ½é¤«¤é¼Â¹Ô¤µ¤ì¤ë¤¬¡¢¤Ò¤È¤Þ¤ºÌµ»ë¤·¤è¤¦¡£
+
+(B) ¤Ï¡¢buf ¤Ë°ú¿ô¤ÇÅϤµ¤ì¤¿Ê¸»ú c ¤ò³ÊǼ¤·¡¢c_freq[c] ¤ÎÃÍ(ʸ»ú¤Î½Ð¸½
+ÉÑÅÙ)¤ò¤·¤Æ¤¤¤ë¡£¤É¤¦¤ä¤é´ðËܤÏÅϤµ¤ì¤¿Ê¸»ú c ¤ò±ä¡¹¤È buf ¤Ë³ÊǼ¤·¡¢
+¸å¤Ç¡¢(¤ª¤½¤é¤¯ (A) ¤À¤í¤¦)°µ½Ì¤ò¹Ô¤¦¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤è¤¦¤À¡£
+
+¤³¤Î buf ¤Î¥µ¥¤¥º¤Ï¤È¸À¤¦¤È¡¢¤³¤ì¤Ï alloc_buf() ¤Ç³ä¤êÅö¤Æ¤é¤ì¤Æ¤¤¤¿¡£
+
+unsigned char *
+alloc_buf( /* void */ )
+{
+ bufsiz = 16 * 1024 *2; /* 65408U; */ /* t.okamoto */
+ while ((buf = (unsigned char *) malloc(bufsiz)) == NULL) {
+ bufsiz = (bufsiz / 10) * 9;
+ if (bufsiz < 4 * 1024)
+ break;
+ }
+ return buf;
+}
+
+bufsiz ¤¬ buf ¤Î¥µ¥¤¥º¤é¤·¤¤¡£¤³¤ì¤Ï¤Ç¤¤ë¤À¤±Â礤¯¼è¤ë¤è¤¦¤Ë¤·¤Æ¤¤¤ë
+¤¬¡¢Â礤¯¼è¤ì¤Ê¤±¤ì¤Ð¤½¤ì¤Ï¤½¤ì¤ÇÎɤ¤¤è¤¦¤À¡£
+
+¤µ¤é¤Ë¡¢(C) ¤Î½èÍý¤ò¹Ô¤¦¤«¤É¤¦¤«¤Ï¡¢c >= (1 << CHAR_BIT) ¤È¤¤¤¦¾ò·ï¤Ç
+ȽÃǤµ¤ì¤Æ¤¤¤ë¡£¤³¤Î¾ò·ï¤¬¿¿¤È¤Ê¤ë¾ì¹ç¤Ï²¿¤«¤È¸À¤¦¤È c ¤¬¡ÖŤµ¡×¤òɽ
+¤¹¾ì¹ç¤À¡£¤³¤Î¤È¤°ú¿ô p ¤Ç¡Ö°ÌÃ֡פ¬ÅϤµ¤ì¤Æ¤¤¤ë¤Î¤Ç¤³¤ì¤â buf ¤Ë¥»¥Ã
+¥È¤·¤Æ¤¤¤ë¡£¤½¤Î¶ñÂÎŪÆâÍƤϤȤ¤¤¦¤È¡¢²¿¤ä¤é cpos ¤È¤¤¤¦¤³¤Î´Ø¿ôÆâ¤Ç
+static ¤ÊÊÑ¿ô¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¡£¤è¤¯¤ï¤«¤é¤Ê¤¤¤¬Ê¸»ú c ¤ä <len,off> ¤Î
+¥Ú¥¢¤Ï¡¢buf ¾å¤Ç°Ê²¼¤Î¤è¤¦¤Ëɽ¤µ¤ì¤ë¤é¤·¤¤¡£
+
+----------------------------------------------------------------------------
+
+output_st1(c1, 0)
+output_st1(c2, 0)
+output_st1(len, off)
+
+¤È¸Æ¤Ó½Ð¤·¤¿¾ì¹ç¤Î buf ¤Î¾õÂÖ
+
+ +-----+-----+-----+-----+-----+
+buf | c1 | c2 | len | off |
+ +-----+-----+-----+-----+-----+
+
+----------------------------------------------------------------------------
+
+(C) ¤Î½èÍý¤ÎºÇ¸å¤ÎÉôʬ
+
+ c = 0;
+ while (p) {
+ p >>= 1;
+ c++;
+ }
+ p_freq[c]++;
+
+¤Ï¡¢½Ð¸½ÉÑÅÙ p_freq[] ¤òµá¤á¤ë½èÍý¤À¤¬¡¢p_freq ¤Ï¡¢off Ãͤνи½ÉÑÅÙ¤ò
+ɽ¤·¤Æ¤¤¤ë¤é¤·¤¤¡£¤³¤³¤Ç¤Î c ¤Ï¡¢p (off) ¤Î bit Ĺ¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡£off ¤Î
+ÃͤÏÂ礤¤(¼½ñ¥µ¥¤¥º¤À¤«¤éºÇÂç(lh7)¤Ç¡¢64KB)¤Î¤Ç¡¢Âå¤ï¤ê¤Ë bit ŤòÍø
+ÍѤ·¤Æ¤¤¤ë¤È¤¤¤Ã¤¿¤È¤³¤í¤«¡£¤½¤¦¤¤¤¨¤Ð¡¢¡ÖŤµ¡×¤Ï¤½¤Î¤Þ¤Þ c_freq[] ¤Ç
+ÉÑÅÙ¤¬·×¾å¤µ¤ì¤Æ¤¤¤¿¡£NC ¤ÎÃͤ¬
+
+#define NC (UCHAR_MAX + MAXMATCH + 2 - THRESHOLD)
+
+¤Ê¤Î¤Ï¡¢¤½¤¦¤¤¤¦¤³¤È¤À¡£
+
+¤³¤³¤Þ¤Ç¤Ç¡¢°µ½Ì¤ò¹Ô¤¦½èÍý¤Ï¸½¤ï¤ì¤Ê¤«¤Ã¤¿¡£¤ä¤Ï¤ê (A) ¤ÎÉôʬ¤¬°µ½Ì½è
+Íý¤À¡£
+
+ /* (A) */
+ output_mask >>= 1;
+ if (output_mask == 0) {
+ output_mask = 1 << (CHAR_BIT - 1);
+ if (output_pos >= bufsiz - 3 * CHAR_BIT) {
+ send_block();
+ if (unpackable)
+ return;
+ output_pos = 0;
+ }
+ cpos = output_pos++;
+ buf[cpos] = 0;
+ }
+
+ºÇ½é¡¢output_mask ¤Ï¡¢0 ¤Ê¤Î¤Ç if ¾ò·ï¤òËþ¤¿¤¹¡£¤½¤·¤Æ¡¢output_mask ¤Ï¡¢
+(1 << (CHAR_BIT - 1)) ¤Ä¤Þ¤ê¡¢128 ¤Ë¤Ê¤ë¡£(A) ¤ÎËÁƬ¤Ç¡¢>>= 1 ¤·¤Æ¤¤¤ë
+¤Î¤Ç¡¢output_mask ¤Ï¡¢128, 64, 32, ..., 1, 128 ¤È¤¤¤¦Ãͤò¼è¤ë¤é¤·¤¤¡£¤½
+¤·¤Æ¡¢ËÜÅö¤Î½é´üÃÍ¤Ï 128 ¤À¡£
+
+¼¡¤Î¾ò·ï
+
+ output_pos >= bufsiz - 3 * CHAR_BIT
+
+¤È¤¤¤¦¤Î¤Ï¡¢buf ¤¬ bufsiz - 24 ¤è¤ê¤âÂ礤¯¤Ê¤Ã¤¿¤È¤¤ÎÃͤÀ¡£¤Ò¤È¤Þ¤º
+̵»ë¤·¤è¤¦¡£¤½¤·¤Æ¡¢cpos = output_pos++ ¤È¤·¤Æ¡¢buf[cpos] = 0 ¤Ë¥»¥Ã¥È
+¤µ¤ì¤Æ¤¤¤ë¡£¤É¤¦¤ä¤é¡¢Àè¤Ë¤³¤Á¤é¤ò¸«¤ë¤Ù¤¤À¤Ã¤¿¤è¤¦¤À¡£cpos ¤ÎÃÍ
+¤È output_pos++ ¤¬ (A) ¤Ç¹Ô¤ï¤ì¤Æ¤¤¤ë¤³¤È¤òƧ¤Þ¤¨¤Æ¤â¤¦°ìÅÙ (B)¡¢(C)
+¤Î½èÍý¤ò¸«¤ë¤È¡¢buf ¤Ï°Ê²¼¤Î¤è¤¦¤Ë»ÈÍѤµ¤ì¤Æ¤¤¤ë¤é¤·¤¤¡£
+
+----------------------------------------------------------------------------
+
+output_st1(c1, 0)
+output_st1(c2, 0)
+output_st1(len, off)
+
+¤È¸Æ¤Ó½Ð¤·¤¿¾ì¹ç¤Î buf ¤Î¾õÂÖ
+
+
+ +-----+-----+-----+-----+-----+-----+--
+buf | 32 | c1 | c2 | len | off | ...
+ +-----+-----+-----+-----+-----+-----+--
+ cpos output_pos
+
+----------------------------------------------------------------------------
+
+<len, off> ¤Î¥Ú¥¢¤ò½ÐÎϤ¹¤ë¤È¤ buf[cpos] ¤Ë¤Ï°Ê²¼¤Î¤è¤¦¤ÊÃͤ¬ÀßÄꤵ¤ì
+¤Æ¤¤¤¿¤³¤È¤â¿Þ¤Ë½ñ¤¤¤Æ¤¢¤ë¡£
+
+ buf[cpos] |= output_mask;
+
+¤â¤¦¾¯¤·Ãí°Õ¿¼¤¯¤³¤Î¤¢¤¿¤ê¤ò¹Í¤¨¤è¤¦¡£output_mask ¤Ï¡¢¤³¤Î´Ø¿ô¤¬¸Æ¤Ð¤ì
+¤ë¤¿¤Ó¤Ë 128, 64, 32, ..., 1, 128, 64, ... ¤È¤¤¤¦Ãͤˤʤ롣¤½¤·¤Æ¡¢buf
+¤Ï¡¢¸Æ¤Ð¤ì¤ë¤¿¤Ó¤Ë c (1¥Ð¥¤¥È)¡¢¤¢¤ë¤¤¤Ï <len, off> (3¥Ð¥¤¥È)¤ÎÃͤ¬Àß
+Äꤵ¤ì¤ë¤¬¡¢output_mask ¤¬ 128 ¤Ë¤Ê¤Ã¤¿¤È¤¤Ï¡¢Í¾Ê¬¤Ë 1 ¥Ð¥¤¥È¶õ¤¤¬¤Ç
+¤¤ë(¤³¤ì¤Ï¡¢buf[cpos]¤Ç¼¨¤µ¤ì¤ë)¡£¤³¤Î¶õ¤¤Ë¤Ï <len,off> ¤¬ÀßÄꤵ¤ì¤ë
+¤¿¤Ó¤Ë¤½¤Î»þÅÀ¤Î output_mask Ãͤ¬ÀßÄꤵ¤ì¤ë¤è¤¦¤À¡£(A) ¤¬¸Æ¤Ð¤ì¤ë¤È¤
+¤È¸À¤¦¤Î¤Ï¡¢°ìÈֺǽé¤Î output_mask = 0 ¤Î¾ì¹ç¤ò½ü¤±¤Ð¡¢
+
+----------------------------------------------------------------------------
+
+output_mask 128 64 32 16 8 4 2 1
+ +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
+buf | 32 | c1 | c2 | len | off | c3 | c4 | c5 | c6 | c7 |
+ +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
+ cpos /
+ /
+ output_pos
+
+----------------------------------------------------------------------------
+
+¤³¤Î¤è¤¦¤Ê¾õÂ֤ˤʤ俤Ȥ¤È¤¤¤¦¤³¤È¤À¡£¤µ¤é¤Ë¡¢buf[cpos] ¤Ë¤Ï¡¢
+<len,off> ¤¬³ÊǼ¤µ¤ì¤Æ¤¤¤ë°ÌÃÖ¤òɽ¤·¤Æ¤¤¤ë¡£¤³¤Î¾õÂÖ¤ò 1 ¥Ö¥í¥Ã¥¯¤È¤·
+¤Æ¤³¤Î¥Ö¥í¥Ã¥¯Ã±°Ì¤Ë¾ðÊó¤¬ buf ¤Ë³ÊǼ¤µ¤ì¡¢buf ¤¬¤¤¤Ã¤Ñ¤¤¤Ë¤Ê¤Ã¤¿¤é
+(A) ¤Î½èÍý¤Î̵»ë¤·¤¿if ʸ¤ÎÃæ¿È¤Ç
+
+ if (output_pos >= bufsiz - 3 * CHAR_BIT) {
+ send_block();
+ if (unpackable)
+ return;
+ output_pos = 0;
+ }
+
+¤Î¤è¤¦¤Ë send_block() ¤¬¸Æ¤Ð¤ì¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤è¤¦¤À¡£¤³¤Î if ¤Î¾ò·ï
+¤Ç¡¢3 * CHAR_BIT ¤È¤¤¤¦¤Î¤Ï <len, off> ¤Î³ÊǼ¥Ð¥¤¥È¿ô¤ò¼¨¤·¤Æ¤¤¤ë¡£
+
+output_pos = 0 ¤È¤·¤Æ¤¤¤ë¤³¤È¤«¤é¤³¤Î»þÅÀ¤Î buf ¤ÎÃæ¿È¤¬¤¹¤Ù¤Æ
+send_block() ¤Ç°µ½Ì¤µ¤ì¥Õ¥¡¥¤¥ë¤Ë½ÐÎϤµ¤ì¤ë¤À¤í¤¦¤³¤È¤¬ÁÛÁü¤Ç¤¤ë¡£
+
+¤³¤Î 1 ¥Ö¥í¥Ã¥¯¤ËËþ¤¿¤Ê¤¤¾õÂ֤ǥե¡¥¤¥ë¤Î½ª¤ê¤¬Í褿¾ì¹ç¡¢¸å½èÍý
+encode_end_st1() ¤Ç send_block() ¤¬¸Æ¤Ð¤ì¤ë¤Ç¤¢¤í¤¦¤³¤È¤âÁÛÁü¤Ç¤¤ë¡£
+
+encode_end_st1( /* void */ )
+{
+ if (!unpackable) {
+ send_block();
+ putbits(CHAR_BIT - 1, 0); /* flush remaining bits */
+ }
+}
+
+»×¤Ã¤¿Ä̤ê¤Ç¤¢¤ë¡£putbits(7, 0) ¤È¤¤¤¦¤Ï¡¢bitbuf ¤Ë»Ä¤Ã¤¿ bit ¤òÅǤ½Ð¤¹
+¤¿¤á¤Ç¤¢¤ë¤³¤È¤Ï¡¢bit Æþ½ÐÎϥ롼¥Á¥ó¤Î²òÆɤdzÎǧºÑ¤ß¤À¡£
+
+¤½¤¦¤¤¤¦¤ï¤±¤Ç¡¢send_block() ¤¬°µ½Ì¤Î¥á¥¤¥ó¥ë¡¼¥Á¥ó¤Ç¤¢¤ë¡£
+send_block() ¤ÎÆþÎϤȤÏÀè¤Ë¼¨¤·¤¿¿Þ¤Î¾õÂ֤Πbuf ¤À¡£huf.c:send_block()
+¤ò¸«¤Æ¤ß¤è¤¦¡£
+
+static void
+send_block( /* void */ )
+{
+ unsigned char flags;
+ unsigned short i, k, root, pos, size;
+
+ /* (A) */
+ root = make_tree(NC, c_freq, c_len, c_code);
+ size = c_freq[root];
+ putbits(16, size);
+ /* (B) */
+ if (root >= NC) {
+ count_t_freq();
+ root = make_tree(NT, t_freq, pt_len, pt_code);
+ if (root >= NT) {
+ write_pt_len(NT, TBIT, 3);
+ } else {
+ putbits(TBIT, 0);
+ putbits(TBIT, root);
+ }
+ write_c_len();
+ } else {
+ putbits(TBIT, 0);
+ putbits(TBIT, 0);
+ putbits(CBIT, 0);
+ putbits(CBIT, root);
+ }
+ /* (C) */
+ root = make_tree(np, p_freq, pt_len, pt_code);
+ if (root >= np) {
+ write_pt_len(np, pbit, -1);
+ }
+ else {
+ putbits(pbit, 0);
+ putbits(pbit, root);
+ }
+ /* (D) */
+ pos = 0;
+ for (i = 0; i < size; i++) {
+ if (i % CHAR_BIT == 0)
+ flags = buf[pos++];
+ else
+ flags <<= 1;
+ if (flags & (1 << (CHAR_BIT - 1))) {
+ encode_c(buf[pos++] + (1 << CHAR_BIT));
+ k = buf[pos++] << CHAR_BIT;
+ k += buf[pos++];
+ encode_p(k);
+ } else
+ encode_c(buf[pos++]);
+ if (unpackable)
+ return;
+ }
+ /* (E) */
+ for (i = 0; i < NC; i++)
+ c_freq[i] = 0;
+ for (i = 0; i < np; i++)
+ p_freq[i] = 0;
+}
+
+¤Ê¤«¤Ê¤«Â礤ʴؿô¤Ç¤¢¤ë¤¬¡¢¤½¤ì¤Û¤ÉÆñ¤·¤¤¤³¤È¤Ï¤Ê¤¤¡£¤Þ¤º¡¢(A)
+
+ /* (A) */
+ root = make_tree(NC, c_freq, c_len, c_code);
+ size = c_freq[root];
+ putbits(16, size);
+
+make_tree() ¤Ç Huffman ɽ c_len[], c_code[] ¤ò¹½ÃÛ¤¹¤ë¡£Ìá¤êÃͤΠroot
+¤Ï¡¢Huffman Ìڤꬤò¼¨¤·¡¢c_freq[root] ¤Ï¡¢Ê¸»ú¤Î½Ð¸½²ó¿ô¤ÎÁíϤǤ¢¤ë
+¤«¤é¡¢size ¤Ï¡¢Ê¿Ê¸¤ÎÁí¥Ð¥¤¥È¿ô¤À(size ¤Ë <off> ¤Îʬ¤Î¥µ¥¤¥º¤Ï´Þ¤Þ¤ì¤Ê
+¤¤¡£c_freq[] ¤¬¡¢<off> ¤Î½Ð¸½ÉÑÅÙ¤ò¿ô¤¨¤Ê¤«¤Ã¤¿¤«¤é)¡£¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¤³
+¤Î size ¤¬¤Þ¤º½ñ¤½Ð¤µ¤ì¤Æ¤¤¤ë(¤½¤¦¤¤¤¨¤Ð¡¢¤³¤Î bit Æþ½ÐÎϥ롼¥Á¥ó¤ò»È
+ÍѤ¹¤ë¤È¥Ð¥¤¥È¥ª¡¼¥À¡¼¤Ë´Ø¤·¤Æ¹Íθ¤¹¤ëɬÍפ¬¤Ê¤¯¤Ê¤ë)¡£
+
+----------------------------------------------------------------------------
+
+ 16bit
+ |---------|
+ +----+----+
+ | size |
+ +----+----+
+
+----------------------------------------------------------------------------
+
+³¤¤¤Æ¡¢(B)
+
+ if (root >= NC) {
+ count_t_freq();
+ root = make_tree(NT, t_freq, pt_len, pt_code);
+ if (root >= NT) {
+ write_pt_len(NT, TBIT, 3);
+ } else {
+ putbits(TBIT, 0);
+ putbits(TBIT, root);
+ }
+ write_c_len();
+ } else {
+ putbits(TBIT, 0);
+ putbits(TBIT, 0);
+ putbits(CBIT, 0);
+ putbits(CBIT, root);
+ }
+
+root ¤¬ NC ¤è¤ê¤âÂ礤¤¾ì¹ç¤òȽÃǤ·¤Æ¤¤¤ë¤¬¡¢¥Ï¥Õ¥Þ¥óÌڤꬤÏɬ¤º NC ¤è
+¤ê¤âÂ礤¤(make_tree() ¤Î avail ¤Î½é´üÃͤò³Îǧ¤·¤è¤¦)¡£¤Ç¤Ï¡¢¤³¤Î
+¾ò·ï¤òËþ¤¿¤µ¤Ê¤¤¾ì¹ç¤È¸À¤¦¤Î¤Ï²¿¤«¤È¸À¤¦¤È¡¢Æ±¤¸¤¯ make_tree() ¤ò³Îǧ¤¹¤ë¤È¡¢
+
+ if (heapsize < 2) {
+ codeparm[heap[1]] = 0;
+ return heap[1];
+ }
+
+¤È¤¤¤¦Îã³°¾ò·ï¤¬¤¢¤Ã¤¿¡£¤³¤ì¤Ï¡¢°µ½Ì¤¹¤ëʸ»ú¤¬¤Ê¤¤¡¢¤¢¤ë¤¤¤Ï1¼ïÎष¤«
+¤Ê¤¤¾ì¹ç¤Î½èÍý¤À¡£°µ½Ì¤¹¤ëʸ»ú¤¬¤Ê¤¤¾ì¹ç¤Ë send_block() ¤¬¸Æ¤Ð¤ì¤ë¤³¤È
+¤Ï¤Ê¤¤¤À¤í¤¦¤«¤é¡¢(B) ¤Î½èÍý¤Î else ¤Ï 1 ¥Ö¥í¥Ã¥¯Ãæ¤Ë°µ½Ì¤¹¤ëʸ»ú¤¬ 1
+¼ïÎष¤«¤Ê¤¤¾ì¹ç¤Î½èÍý¤Ç¤¢¤ë(¤³¤Î 1 ¼ïÎà¤Îʸ»ú¤È¤Ï¡¢make_tree() ¤ÎÌá¤ê
+ÃÍ root ¤À)¡£¤³¤Î¤È¤°Ê²¼¤Î¤è¤¦¤Ê½ÐÎϤˤʤ롣(TBIT{5}, CBIT{9} ¤Ç¤¢¤ë)
+
+----------------------------------------------------------------------------
+ 5bit
+ 5bit 9bit 9bit
+ |--|--|----|----|
+ +--+--+----+----+
+ | 0| 0| 0|root|
+ +--+--+----+----+
+
+----------------------------------------------------------------------------
+
+¤³¤ì¤¬¡¢1¥Ö¥í¥Ã¥¯¤Ë1¼ïÎष¤«Ê¸»ú¤¬¤Ê¤¤¾ì¹ç¤Î¥Õ¥¡¥¤¥ë¤Î¾õÂÖ¤À(off¤Î¾ðÊó
+¤Ï¤Þ¤À´Þ¤Þ¤Ê¤¤)¡£(B)¤Î if ¤¬¿¿¤Î¤È¤¤¬¤É¤¦¤Ê¤ë¤«¤ÏÊ£»¨¤½¤¦¤Ê¤Î¤Ç¸å¤Ç¸«
+¤ë¤³¤È¤Ë¤·¤è¤¦¡£
+
+³¤¤¤Æ (C)
+
+ root = make_tree(np, p_freq, pt_len, pt_code);
+ if (root >= np) {
+ write_pt_len(np, pbit, -1);
+ }
+ else {
+ putbits(pbit, 0);
+ putbits(pbit, root);
+ }
+
+p_freq[] ¤ò¸«¤Æ¤¤¤ë¤³¤È¤«¤éº£ÅÙ¤Ï <off> ¤Î¾ðÊó¤Î Huffman ÌÚ¤ò¹½ÃÛ¤·¤Æ
+¤¤¤ë¤³¤È¤¬¤ï¤«¤ë¡£ÀèÄø¤ÈƱÍͤˡ¢<off> ¤ÎÃͤ¬¤¹¤Ù¤ÆƱ¤¸¾ì¹ç¤Ï¡¢else ¤Î
+¾ò·ï¤Ë¤Ê¤ê¡¢°Ê²¼¤Î½ÐÎϤ¬¹Ô¤ï¤ì¤ë¡£(np ¤ÎÃͤϡ¢-lh7- ¤Î¾ì¹ç¤Ç¡¢17 ¤À)
+
+----------------------------------------------------------------------------
+
+ np bit np bit method np
+ |---------|---------| ----------
+ +----+----+---------+ -lh4- 14
+ | 0 | root | -lh5- 14
+ +----+----+---------+ -lh6- 16
+ -lh7- 17
+
+----------------------------------------------------------------------------
+
+¤³¤³¤Þ¤Ç¤Ë½ÐÎϤ·¤¿¾ðÊ󤬲¿¤ò¼¨¤¹¤«¤ï¤«¤ë¤À¤í¤¦¤«¡©Huffman Ë¡¤ÎÉä¹æ²½½è
+Íý¤Ïʸ»ú¤ò bit Îó¤ËÊÑ´¹¤¹¤ë¡£¤³¤ì¤òÉü¹æ¤¹¤ë¾ì¹ç¤Ï bit Îó¤ËÂбþ¤¹¤ëʸ»ú
+¤òÃΤëɬÍפ¬¤¢¤ë¡£¤¹¤Ê¤ï¤Á Huffman ÌڤǤ¢¤ë(¼ÂºÝ¤Ë¤Ï Huffman ɽ)¡£¿Þ¼¨
+¤·¤¿¤Î¤Ï¡¢Huffman ÌÚ¤ò¹½ÃÛ¤¹¤ëɬÍפ¬¤Ê¤¤(¹½ÃۤǤ¤Ê¤¤)¾ì¹ç¤Î¾ðÊó¤Ë¤Ê¤ë
+¤¬¡¢¸½ºß²òÆɤòÈô¤Ð¤·¤Æ¤¤¤ë½èÍý¤Ï Huffman ɽ¤ò¥Õ¥¡¥¤¥ë¤Ë½ÐÎϤ·¤Æ¤¤¤ë²Õ
+½ê¤Ç¤¢¤ë¤³¤È¤ÏÍưפËÁÛÁü¤¬¤Ä¤¯¡£¤È¤¤¤¦¤³¤È¤Ï»Ä¤ê¤Î (D) ¤¬ËÜÅö¤Î°µ½Ìʸ
+¤ò½ÐÎϤ¹¤ë²Õ½ê¤À¡£
+
+ /* (D) */
+ pos = 0;
+ for (i = 0; i < size; i++) {
+ if (i % CHAR_BIT == 0)
+ flags = buf[pos++];
+ else
+ flags <<= 1;
+ if (flags & (1 << (CHAR_BIT - 1))) {
+ encode_c(buf[pos++] + (1 << CHAR_BIT));
+ k = buf[pos++] << CHAR_BIT;
+ k += buf[pos++];
+ encode_p(k);
+ } else
+ encode_c(buf[pos++]);
+ if (unpackable)
+ return;
+ }
+
+size ¿ôʬ¥ë¡¼¥×¤·¤Æ¤¤¤ë¡£size ¤Ï¡¢<off> ¤ò½ü¤¤¤¿ buf ¤Îʸ»ú¿ô¤ò¼¨¤·¤Æ
+¤¤¤ë¤ÈÁ°¤Ë½ñ¤¤¤¿¤¬¡¢¤É¤¦¤ä¤é <len, off> ¤ò 1 ʸ»ú¤È¿ô¤¨¤¿¤È¤¤Î buf ¤Î
+ʸ»ú¿ô¤ò¼¨¤·¤Æ¤¤¤ë¤È¹Í¤¨¤¿Êý¤¬Îɤµ¤½¤¦¤À¡£
+
+ºÇ½é¤Î if ¤Ç¡¢
+
+ if (i % CHAR_BIT == 0)
+ flags = buf[pos++];
+ else
+ flags <<= 1;
+
+¤³¤ì¤¬¿¿¤Ë¤Ê¤ë¾ò·ï¤Ï buf[pos] ¤¬ buf[cpos] ¤Ç¤¢¤ë¾ì¹ç¤À(output_mask ¤¬
+128, 64, ..., 1 ¤È 8 ¤Ä¤ÎÃͤò½ä²ó¤·¤Æ¤¤¤¿¤³¤È¤ò»×¤¤½Ð¤½¤¦)¡£
+flags ¤Ï¡¢<len, off> ¤Î buf ¾å¤Î°ÌÃÖ¤ò¼¨¤¹ bit ¥Þ¥¹¥¯¤Ë¤Ê¤ë¡£
+
+ if (flags & (1 << (CHAR_BIT - 1))) {
+ encode_c(buf[pos++] + (1 << CHAR_BIT));
+ k = buf[pos++] << CHAR_BIT;
+ k += buf[pos++];
+ encode_p(k);
+ } else
+ encode_c(buf[pos++]);
+
+flags ¤¬¡¢127 ¤Ç¤¢¤ë¤È¤ buf[pos] ¤Ï¡¢<len, off> ¤ò»Ø¤·¡¢
+
+ encode_c(len + 256)
+ encode_p(off)
+
+¤Ç¡¢°µ½Ì¤ò¹Ô¤¦¤è¤¦¤À¡£len ¤Ë 256 ¤ò¤·¤Æ¤¤¤ë¤Î¤Ï¡¢buf[] ¤Ë len ¤ò³ÊǼ
+¤¹¤ë¤È¤(output_st1() ¤Î (B) ¤Î½èÍý)¤Ë
+
+ buf[output_pos++] = (unsigned char) c;
+
+¤Î¤è¤¦¤ËºÇ¾å°Ì bit ¤ò¼Î¤Æ¤Æ¤¤¤¿¤«¤é¤À¡£len ¤Ï¾ï¤Ë 256 °Ê¾å¤Ê¤Î¤Ç¡¢256
+¤ò¤¹¤³¤È¤Ç¸µ¤Î len ¤ÎÃͤò°µ½Ì¥ë¡¼¥Á¥ó¤ËÅϤ·¤Æ¤¤¤ë¡£
+
+Ä̾ï¤Îʸ»ú¤Ï
+
+ encode_c(buf[pos])
+
+¤Ç°µ½Ì¤µ¤ì¤Æ¤¤¤ë¡£encode_c() ¤Î½èÍýÆâÍƤϴÊñ¤Ê¤Î¤Ç¸«¤Æ¤ß¤è¤¦¡£
+
+static void
+encode_c(c)
+ short c;
+{
+ putcode(c_len[c], c_code[c]);
+}
+
+c_len[], c_code[] ¤¬Ê¸»ú c ¤ËÂбþ¤¹¤ë Huffman Éä¹æ¤Î bit ŤÈÉä¹æ¤ò¼¨
+¤·¤Æ¤¤¤ë¤Î¤Ç¡¢¤½¤ì¤ò¤½¤Î¤Þ¤Þ½ÐÎϤ·¤Æ¤¤¤ë¡£´Êñ¤À¡£
+
+encode_p() ¤Ï¤â¤¦¾¯¤·Ê£»¨¤À¡£
+
+static void
+encode_p(p)
+ unsigned short p;
+{
+ unsigned short c, q;
+
+ c = 0;
+ q = p;
+ while (q) {
+ q >>= 1;
+ c++;
+ }
+ putcode(pt_len[c], pt_code[c]);
+ if (c > 1)
+ putbits(c - 1, p);
+}
+
+ºÇ½é¤Î while ʸ¤Ç¡¢<off> ¤Î bit Ťòµá¤á¡¢¤½¤Î bit Ĺ¤Î¾ðÊó¤ò
+Huffman Éä¹æ²½¤·¤Æ¤¤¤ë¡£¤½¤Î¸å¡¢putbits() ¤Ç¡¢É¬Í× bit ¿ô¤À¤±
+½ÐÎϤ¹¤ë¡£¤Ä¤Þ¤ê¡¢<off> ¤Ï°Ê²¼¤Î¤è¤¦¤ËÉä¹æ²½¤µ¤ì¤ë¡£
+
+----------------------------------------------------------------------------
+off = 64 ¤Î°µ½Ì
+
+ |---- 16 bit -------|
+ +----+----+----+----+
+off |0000 0000 0100 0000|
+ +----+----+----+----+
+ |-7 bit-|
+
+¤³¤Î°µ½Ìʸ¤Ï°Ê²¼(Ťµ¤¬ 7 bit ¤Ç¤¢¤ë¤È¤¤¤¦¾ðÊó(HuffmanÉä¹æ²½)¤ÈÃͤΥڥ¢)
+
+ |-6 bit-|
+ +-----------------+-------+
+ | 7 ¤ÎHuffmanÉä¹æ |00 0000|
+ +-----------------+-------+
+
+----------------------------------------------------------------------------
+
+¤³¤³¤Ç¡¢Ãͤò 6 bit ¤·¤«½ÐÎϤ·¤Ê¤¤(putbits() ¤Ç c-1 ¤òÅϤ·¤Æ¤¤¤ë)¤Î¤Ï¡¢
+7 bit Ìܤ¬ 1 ¤Ç¤¢¤ë¤³¤È¤¬¼«ÌÀ¤À¤«¤é¤Ç¤¢¤ë¡£¾ï¤Ë off != 0 ¤À¤«¤é¡¢½ñ¤
+½Ð¤¹¾ðÊó¤ò 1 bit ºï¸º¤Ç¤¤ë¤ï¤±¤À¡£¤·¤¿¤¬¤Ã¤Æ¡¢off=1 ¤Î¤È¤¤Ï bit Ť¬
+1 ¤È¤¤¤¦¾ðÊó¤·¤«½ñ¤½Ð¤µ¤Ê¤¤¡£
+
+ºÇ¸å¤Î (E) ¤ÏÉÑÅÙɽ¤ò¥¯¥ê¥¢¤·¤Æ¤¤¤ë¤À¤±¤À¡£
+
+ /* (E) */
+ for (i = 0; i < NC; i++)
+ c_freq[i] = 0;
+ for (i = 0; i < np; i++)
+ p_freq[i] = 0;
+
+°Ê¾å¤Ç¡¢°µ½Ì½èÍýÁ´ÂΤγµÍפ¬¤ï¤«¤Ã¤¿¡£¸å¤Ï̵»ë¤·¤Æ¤¤¤¿ Huffman ɽ¤ò½Ð
+ÎϤ¹¤ë²Õ½ê¤À¤±¤À¡£
+
+ /* (B) */
+ if (root >= NC) {
+ count_t_freq();
+ root = make_tree(NT, t_freq, pt_len, pt_code);
+ if (root >= NT) {
+ write_pt_len(NT, TBIT, 3);
+ } else {
+ putbits(TBIT, 0);
+ putbits(TBIT, root);
+ }
+ write_c_len();
+
+¤³¤³¤Ç¤Ï¡¢c_len[], c_code[] ¤È¤¤¤¦ Huffman ɽ¤ò½ÐÎϤ¹¤ë¤À¤±¤Î¤Ï¤º¤À¤¬¡¢
+¤µ¤é¤Ë Huffman ɽ pt_len[], pt_code[] ¤Î¹½ÃÛ¤ò¹Ô¤Ã¤Æ¤¤¤ë¡£¤³¤ì¤Ï¡¢
+<off> ¤Î bit ŤΠHuffman Éä¹æɽ¤Ç¤â¤¢¤Ã¤¿ÊÑ¿ô¤À¤¬¡¢Ã±¤ËÊÑ¿ô¤ò»È¤¤²ó¤·
+¤Æ¤¤¤ë¤À¤±¤À¡£¤³¤³¤Ç¤Î pt_len[], pt_code[] ¤¬²¿¤ÎÉä¹æɽ¤«¤Ï¡¢
+count_t_freq() ¤ò¸«¤ëɬÍפ¬¤¢¤ë¡£
+
+static void
+count_t_freq(/*void*/)
+{
+ short i, k, n, count;
+
+ for (i = 0; i < NT; i++)
+ t_freq[i] = 0;
+ n = NC;
+ while (n > 0 && c_len[n - 1] == 0)
+ 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)
+ t_freq[0] += count;
+ else if (count <= 18)
+ t_freq[1]++;
+ else if (count == 19) {
+ t_freq[0]++;
+ t_freq[1]++;
+ }
+ else
+ t_freq[2]++;
+ } else
+ t_freq[k + 2]++;
+ }
+}
+
+ºÇ½é¤ËÉÑÅÙɽ t_freq[] ¤ò½é´ü²½¤¹¤ë¡£Â³¤¤¤Æ¡¢
+
+ n = NC;
+ while (n > 0 && c_len[n - 1] == 0)
+ n--;
+
+¤Ç¡¢c_len[n] != 0 ¤Ç¤¢¤ëºÇÂç¤Î 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)
+ t_freq[0] += count;
+ else if (count <= 18)
+ t_freq[1]++;
+ else if (count == 19) {
+ t_freq[0]++;
+ t_freq[1]++;
+ }
+ else
+ t_freq[2]++;
+ } else
+ t_freq[k + 2]++;
+ }
+
+c_len[i] ¤Ï¡¢Ê¸»ú i ¤Î Huffman Éä¹æ¤Ç¤Î bit ŤǤ¢¤Ã¤¿¡£¤³¤Î
+c_len[i] ¤ÎÃͤò°Ê²¼¤Î¾ì¹çʬ¤±¤Ç t_freq[] ¤ËÉÑÅÙ·×»»¤·¤Æ¤¤¤ë¡£
+count ¤Ï¡¢c_len[i] ¤¬Ï¢Â³¤Ç²¿²ó 0 ¤Ç¤¢¤ë¤«¤Î¿ô¤À¡£
+
+ c_len[i] count t_freq[]
+ -------------------------------------------
+ 0 0 .. 2 t_freq[0] += count
+ 0 3 ..18 t_freq[1]++
+ 0 19 t_freq[0]++, t_freq[1]++
+ 0 20°Ê¾å t_freq[2]++
+ 0°Ê³° t_freq[c_len[i]+2]++;
+
+¤³¤ì¤¬¤É¤¦¤¤¤¦Íý¶þ¤Ç¤¢¤ë¤«¤Ï¤è¤¯¤ï¤«¤é¤Ê¤¤¤¬¡¢¤È¤Ë¤«¤¯ÉÑÅÙ·×»»¤ò
+¹Ô¤¦¾ì¹ç¤Ë t_freq[0], t_freq[1], t_freq[2] ¤òÆÃÊÌ°·¤¤¤·¤Æ¤¤¤ë¡£
+
+
# Local Variables:
# mode : indented-text
# indent-tabs-mode: nil