OSDN Git Service

*** empty log message ***
authorarai <arai@6a8cc165-1e22-0410-a132-eb4e3f353aba>
Sat, 8 Feb 2003 20:09:25 +0000 (20:09 +0000)
committerarai <arai@6a8cc165-1e22-0410-a132-eb4e3f353aba>
Sat, 8 Feb 2003 20:09:25 +0000 (20:09 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/lha/lha/trunk@645 6a8cc165-1e22-0410-a132-eb4e3f353aba

Hackinf_of_LHa

index 9e04394..0f44bf8 100644 (file)
@@ -1946,7 +1946,7 @@ scan_beg, scan_end 
 ¤âÌÀ¼¨Åª¤À¡£¤³¤Î½ñ¤­´¹¤¨¤ò¹Ô¤¦¾ì¹ç¡¢scan_beg ¤¬Éé¤ÎÃͤˤʤë²ÄǽÀ­¤¬¤¢
 ¤ë¡£¸µ¤â¤È¤Î½èÍý¤Ç¤Ï scan_end Åù¤ÎÊÑ¿ô¤ò unsigned ¤Ë¤·¤Æ¤¤¤ë¤Î¤Ç¡¢¤³¤ì
 ¤é¤ò int ¤Ë¤·¤Æ while ¾ò·ï¤ÇÉé¤Î scan_beg ¤ò¤Ï¤¸¤«¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤³¤È
-¤ËÃí°Õ¡£¤½¤¦¤¹¤ë¤È¡¢scan_beg != NIL ¤ÏɬÍפʤ¯¤Ê¤ë¤Î¤À¤¬¤ï¤«¤ê¤ä¤¹¤µ¤ò
+¤ËÃí°Õ¡£¤½¤¦¤¹¤ë¤È¡¢scan_pos != NIL ¤ÏɬÍפʤ¯¤Ê¤ë¤Î¤À¤¬¤ï¤«¤ê¤ä¤¹¤µ¤ò
 Äɵᤷ¤¿¡£
 
 ¤³¤ì¤Ç match_insert() ¤Î²òÆɤϽª¤ê¤À¡£match_insert() ¤Î½èÍý¤È¤Ï°Ê²¼¤Î
@@ -2849,11 +2849,29 @@ heap[1] 
 
 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[] ¤ËºÆÀßÄꤵ¤ì¡¢
@@ -2882,17 +2900,16 @@ downheap(1) 
 ¤È¤¹¤ë¤È¡¢
 
     /* (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);
 
 ¤³¤ó¤Ê¤È¤³¤í¤À¤í¤¦¤«¡£¸µ¤Î½èÍý¤Ç¤Ï¥Ò¡¼¥×¤«¤é¤ÎÍ×ÁǤμè¤ê½Ð¤·¤ÈÁÞÆþ¤Ç̵
@@ -2902,10 +2919,22 @@ downheap(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[] ¤Î
@@ -3361,9 +3390,9 @@ a, b, c 
   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] ¥Ó¥Ã¥È¤À¤±¤ò¸«¤ë)¡£Éä¹æ²½¤ÎºÝ¤ËÌÚ¤òé¤ëɬÍפϤʤ¯¡¢¹â®¤ÊÉä¹æ
 ²½¤¬²Äǽ¤Ë¤Ê¤ë(¤È´üÂÔ¤µ¤ì¤ë¡£¤É¤ÎÄøÅÙ¸ú²Ì¤¬¤¢¤ë¤«¤Ï¤¤¤º¤ì¸¡¾Ú¤·¤Æ¤ß¤¿
 ¤¤¡£¤½¤¦¤¤¤¨¤Ð¡¢ÍÕ¤«¤éº¬¤Ë¸þ¤«¤Ã¤ÆÌÚ¤òé¤ë¤¿¤á¤Î¾ðÊó¤¬É¬Íפʤ«¤Ã¤¿¤³¤È
 ¤â¤³¤ì¤Ç¤ï¤«¤Ã¤¿)¡£
@@ -3451,6 +3480,760 @@ lenparm[] 
                  /\    /\      .. 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