OSDN Git Service

*** empty log message ***
authorarai <arai@6a8cc165-1e22-0410-a132-eb4e3f353aba>
Sun, 19 Jan 2003 08:28:31 +0000 (08:28 +0000)
committerarai <arai@6a8cc165-1e22-0410-a132-eb4e3f353aba>
Sun, 19 Jan 2003 08:28:31 +0000 (08:28 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/lha/lha/trunk@630 6a8cc165-1e22-0410-a132-eb4e3f353aba

ChangeLog
Hackinf_of_LHa

index 8f6d14d..ba95fbb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2003-01-19  Koji Arai  <jca02266@nifty.ne.jp>
+
+       * src/slide.c: took off the debug flag.
+
+       * src/slide.c (search_dict): split into 2 parts.
+
+       * src/slide.c: refined: use the structure `matchdata'.
+
 2003-01-18  Koji Arai  <jca02266@nifty.ne.jp>
 
        * src/lha.h (decode_count): rename a global variable `count' to
index 3002b5a..7d28b73 100644 (file)
@@ -1,6 +1,6 @@
 $Id$
 
-               The Hacking of LHa for UNIX (1st draft)
+               The Hacking of LHa for UNIX (2nd draft)
              -------------------------------------------
 
                                 Koji Arai <mailto:jca02266@nifty.ne.jp>
@@ -12,15 +12,6 @@ $Id$
 ¤ß¤¿¤À¤±¤Î¤â¤Î¤À¡£(µÙ¤ß¤¬ÌÀ¤±¤ë¤È¤Þ¤¿Ë»¤·¤¯¤Ê¤ë¤Î¤Ç¡¢¤³¤ì°Ê¾å¤Þ¤Ã¤¿¤¯
 ²¿¤â¤·¤Ê¤¤¤«¤â¤·¤ì¤Ê¤¤)
 
-¸½»þÅÀ¤Ç¤Ï¡¢slide.c ¤Î²òÀϤÀ¤±¤Ç¤¢¤ë¡£huf.c ¤âƱ»þ¿Ê¹Ô¤Ç²òÀÏÃæ¤À¤¬¡¢Ê¸
-ÂΤ¬°Û¤Ê¤ë(Æɤߤâ¤Î¤È¤·¤Æ¤ÎÂκۤòÀ°¤¨¤Æ¤¤¤Ê¤¤)¤Î¤Ç¸ø³«¤¹¤ë¤È¤·¤Æ¤âÊÌʸ
-½ñ¤Ë¤Ê¤ë¤À¤í¤¦(huf.c ¤Î²òÀÏʸ½ñ¤Ï¸½»þÅÀ¤Ç¥Ç¥Ð¥Ã¥¬¤Ë¤è¤ë¤ª¤Ã¤«¤±¤¬Ãæ¿´
-¤Î¥á¥â¤Ç¤·¤«¤Ê¤¤)
-
-# ËÜÅö¤Ï¡¢huf.c ¤Î²òÀϤòÀè¤Ë¹Ô¤Ã¤Æ¤¤¤¿ slide ¼­½ñ¤Î encoding Éô¤Ï¤Ê¤¯
-# ¤Æ¤â LHA ¸ß´¹¥¢¡¼¥«¥¤¥Ð¤Ïºî¤ì¤½¤¦¤À¤Ã¤¿¤«¤é¤À¤¬¡¢huf.c ¤Ï slide.c
-# ¤ËÈæ¤Ù¤ÆÆñ²ò¤ÊÉôʬ¤¬Â¿¤½¤¦¤À¤«¤é¡¢¸å²ó¤·¤Ë¤·¤¿¡£
-
 Ëܽñ¤Ï¡¢¤Þ¤À̤´°À®¤Ç¤¢¤ë¡£¤Ë¤â¤«¤«¤ï¤é¤º¸ø³«¤¹¤ë¤Î¤Ï¤³¤ì°Ê¾å³¤«¤Ê¤¤¤«
 ¤â¤·¤ì¤Ê¤¤¤«¤é¤Ç¤¢¤ë(µ¤¤¬¸þ¤¤¤¿¤é¤Þ¤¿Â³¤­¤ò½ñ¤¯¤À¤í¤¦¡£¤¢¤ë¤¤¤Ï±þ±ç¤Î
 ¤ª¼ê»æ¤¬¤¯¤ì¤Ð¤ä¤ëµ¤¤¬½Ð¤ë¤«¤â¤·¤ì¤Ê¤¤)¡£
@@ -35,11 +26,33 @@ $Id$
 ===============================================================================
 o É½µ­¤Ë¤Ä¤¤¤Æ
 
-* ´Ø¿ô¤Ï¡¢¤½¤ÎÄêµÁ¥½¡¼¥¹file.c ¤È´Ø¿ô̾ func() ¤ò¼¨¤¹¤Î¤Ë
+* ´Ø¿ô¤Ï¡¢¤½¤ÎÄêµÁ¥½¡¼¥¹ file.c ¤È´Ø¿ô̾ func() ¤ò¼¨¤¹¤Î¤Ë
      file.c:func()
   ¤È¤¤¤¦µ­½Ò¤ò»È¤¦
 
-*
+* ÇÛÎó¤Îź»ú¤Ï¡¢Python¸À¸ì¤Î¥¹¥é¥¤¥¹±é»»»Ò¤Îµ­Ë¡¤Ë½à¤¸¤¿
+
+    a[m:n] ¤Ï¡¢m <= i < m+n ¤ÎÈϰϤΠa[i] ¤ò°ÕÌ£¤¹¤ë¡£
+
+* ÃͤÎÈϰϤϡ¢Ruby¸À¸ì¤ÎÈϰϱ黻»Ò¤Îµ­Ë¡¤Ë½à¤¸¤¿¡£¤³¤ì¤òÇÛÎó¤Î
+  Åº»ú¤Ë»ÈÍѤ¹¤ë¾ì¹ç¤â¤¢¤ë¡£
+
+    m <= i <= n   -> i = m..n
+    m <= i < n    -> i = m...n
+
+    a[m..n] ¤Ï¡¢m <= i <= n ¤ÎÈϰϤΠa[i] ¤ò°ÕÌ£¤¹¤ë¡£
+
+* m ¤Î n ¾è ¤Ï¡¢m^n ¤Çɽ¤¹¡£^ ¤Ï¡¢ÇÓ¾ŪÏÀÍýϤȤ·¤Æ¤âÍøÍѤµ¤ì¤ë¤¬
+  Ê¸Ì®¤«¤éȽÃǤ·¤Æ¤â¤é¤¦¡£
+
+* v{n} ¤Ï¡¢ÊÑ¿ô v ¤ÎÃͤ¬ n ¤Ç¤¢¤ë¤³¤È¤òɽ¤¹¡£n ¤Ï¡¢¥µ¥ó¥×¥ë¤ÎÃͤǤ¢¤Ã¤¿¤ê
+  Äê¿ô¤ÎÃͤǤ¢¤Ã¤¿¤ê¤¹¤ë¡£
+
+  v=n ¤ÏÂåÆþʸ
+
+  ÇÛÎó¤ÎÆâÍƤϡ¢
+    ary[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 }
+  ¤Î¤è¤¦¤Ë½ñ¤¯
 
 o ÍѸì¤Ë¤Ä¤¤¤Æ
 
@@ -49,8 +62,19 @@ o 
 * Éü¹æ
         Éü¹æ²½¡¢Éü¹æ¸ì¡¢Éü¹æʸ
 
+* ¥Õ¥ì¡¼¥º
+
+* slide ¼­½ñË¡
+
+* Huffman ˡ
+   Æ°Åª Huffman Ë¡¡¢ÀÅŪ Huffman Ë¡
+
 ===============================================================================
 
+\f
+slide ¼­½ñË¡ (slide.c)
+----------------------
+
 ¤Þ¤º¡¢¹½Â¤¤Ë¤Ä¤¤¤Æ¹Í¤¨¤ë¡£
 
 slide¼­½ñË¡¤Ï¡¢encoding ¤Ë¤µ¤Þ¤¶¤Þ¤Ê¹©Éפ¬¶Å¤é¤µ¤ì¤ë¤Î¤Ç¤È¤Æ¤âÊ£»¨¤À¤¬¡¢
@@ -1408,8 +1432,8 @@ search_dict() 
  °ÌÃÖ  lastmatchoffset & (dicsiz-1)
 
 ¤È¤Ê¤Ã¤Æ¤¤¤ë¡£ËÁƬ¤Î decode() ¤Î²òÀϤǡ¢Ä¹¤µ¤Ï 253 ¤ò­¤¹»ö¤Ï³ÎǧºÑ¤ß
-¤À(¤Õ¤È -lhs- ¤Î¾ì¹ç 254 ¤ò­¤¹¤È¤¤¤¦Æ°ºî¤¬¡¢encoding Éôʬ¤Ç¤Ï¹Í褵¤ì
-¤Æ¤¤¤Ê¤¤¤è¤¦¤À¤Èµ¤¤Å¤¯¡£¤¤¤¤¤Î¤«¤½¤ì¤Ç¡©)¡£¤È¤³¤í¤Ç¡¢°ìÃ×Ĺ 
+¤À(-lhs- ¤Î¾ì¹ç 254 ¤ò­¤¹¤È¤¤¤¦Æ°ºî¤¬¡¢encoding Éôʬ¤Ç¤Ï¹Í褵¤ì
+¤Æ¤Ê¤¤¤Î¤Ï¡¢-lhs- ¤Î encoding µ¡Ç½¤¬¤Ê¤¤¤«¤é¤À)¡£¤È¤³¤í¤Ç¡¢°ìÃ×Ĺ 
 lastmatchlen ¤Ï 3 °Ê¾å¤Ç½é¤á¤Æ 255 ¤ò±Û¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡£°ÊÁ°Í½ÁÛ¤·¤¿¡¢
 THRESHOLD ¤Î°ÕÌ£¡ÖºÇÄã¸Â°ìÃפ·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤Ä¹¤µ¡×¤Ï¤¢¤Ã¤Æ¤¤¤ë¤é¤·¤¤¡£
 
@@ -1619,7 +1643,7 @@ update() 
 match_insert() ¤Ï¡¢text[pos] ¤«¤é»Ï¤Þ¤ëʸ»úÎó¤ò¼­½ñ¤«¤é¸¡º÷¤·¡¢¸«¤Ä¤«¤Ã
 ¤¿°ÌÃ֤ȰìÃ׍ò matchpos, matchlen ¤ËÀßÄꤹ¤ë½èÍý¤À¡£¤½¤·¤Æ¡¢¤Ä¤¤¤Ç¤Ë 
 insert() ¤Ç¡¢text[pos] ¤Î°ÌÃÖ¤ò¥Ï¥Ã¥·¥åÇÛÎó¤Ëµ­Ï¿¤·¡¢¼¡²ó¤Î¸¡º÷¤ËÈ÷¤¨
줳¤È¤â¤·¤Æ¤¤¤ë¡£
뤳¤È¤â¤·¤Æ¤¤¤ë¡£
 
 ¤Ç¤Ï¡¢ÉÔÌÀ¤ÊÉôʬ¤Ï¤Ê¤ó¤À¤Ã¤¿¤«¤È¤¤¤¦¤È too_flag[] ¤Þ¤ï¤ê¤Ç¤¢¤ë¡£
 too_flag ¤Î¥Õ¥é¥°¤¬Î©¤Ã¤Æ¤¤¤ë¤È¡£¼­½ñ¸¡º÷¤ÎÍê¤ê¤È¤Ê¤ë¥Ï¥Ã¥·¥åÃͤòÊѹ¹
@@ -1858,16 +1882,78 @@ text   |             x'|  |  |  |                    |  |  |x |  |  |  |
 ¤á¤ë»ö¤Ë¤Ê¤ë¤«¤È¸À¤¦¤È while ¥ë¡¼¥×¤ÏºÇÂç°ìÃ׍Îʸ»úÎ󤬸«¤Ä¤«¤Ã¤¿¤é
 ¤¹¤°¤ËÈ´¤±¤ë¤«¤é¤À)¡£
 
-ºÙÉô¤Ï̤¤ÀÌܤò¤Ä¤Ö¤Ã¤Æ¤¤¤ë¤Î¤À¤¬¤³¤ì¤Ç match_insert() ¤Î²òÆɤϽª¤ê¤À¡£
+¤È¤³¤í¤Ç¡¢match_insert() ¤ÎÀè¤Î½èÍý¤Ï°Ê²¼¤Î½ñ¤­´¹¤¨¤ò¹Ô¤¦¤È¤â¤¦¾¯¤·¸«
+¤ä¤¹¤¯¤Ê¤ë¡£(¤È»×¤¦)¡£
+
+o scan_beg ¤È¤¤¤¦ÊÑ¿ô¤òÍÑ°Õ¤·¡¢¤³¤ì¤ò scan_pos - off ¤Ë¤¹¤ë¡£
+o scan_end ¤Ï¡¢pos - dicsiz ¤Ë¤¹¤ë¡£
+o while ¾ò·ï¤ò while (scan_pos != NIL && scan_beg > scan_end) ¤Ë¤¹¤ë¡£
+
+°Ê²¼
+
+        unsigned int scan_pos = hash[h];
+        int scan_beg = scan_pos - off;
+        int scan_end = pos - dicsiz;
+
+        chain = 0;
+        while (scan_pos != NIL && scan_beg > scan_end) {
+            chain++;
+
+            if (text[scan_beg + matchlen] == text[pos + matchlen]) {
+                {
+                    unsigned char *a = &text[scan_beg];
+                    unsigned char *b = &text[pos];
+
+                    for (len = 0; len < max && *a++ == *b++; len++);
+                }
+
+                if (len > matchlen) {
+                    matchpos = scan_beg;
+                    if ((matchlen = len) == max) {
+                        break;
+                    }
+                }
+            }
+            scan_pos = prev[scan_pos & (dicsiz - 1)];
+            scan_beg = scan_pos - off;
+        }
+
+        if (chain >= LIMIT)
+            too_flag[h] = 1;
 
-match_insert() ¤Î½èÍý¤È¤Ï°Ê²¼¤ÎÄ̤ê¤À¡£
+----------------------------------------------------------------------------
+
+              |-- a ---|                             |--- b --|
+       +---------------+--------+--------------------+--------+--------+
+text   |      |      x'|  |  |  |                    |  |  |x |  |  |  |
+       +---------------+--------+--------------------+--------+--------+
+         ^     \        \                             \        \
+         |    scan_beg  scan_pos                        pos      pos+off
+     scan_end
+
+         |----|
+           scan_beg ¤ÎÍ­¸úÈÏ°Ï
+
+         |----------------- dicsiz ------------------|
+
+----------------------------------------------------------------------------
+
+scan_beg, scan_end ¤ÎÈϰϤâ¤ï¤«¤ê¤ä¤¹¤¤¤·¡¢hash[h] ¤¬ NIL ¤Î¾ì¹ç¤Î½èÍý
+¤âÌÀ¼¨Åª¤À¡£¤³¤Î½ñ¤­´¹¤¨¤ò¹Ô¤¦¾ì¹ç¡¢scan_beg ¤¬Éé¤ÎÃͤˤʤë²ÄǽÀ­¤¬¤¢
+¤ë¡£¸µ¤â¤È¤Î½èÍý¤Ç¤Ï scan_end Åù¤ÎÊÑ¿ô¤ò unsigned ¤Ë¤·¤Æ¤¤¤ë¤Î¤Ç¡¢¤³¤ì
+¤é¤ò int ¤Ë¤·¤Æ while ¾ò·ï¤ÇÉé¤Î scan_beg ¤ò¤Ï¤¸¤«¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤³¤È
+¤ËÃí°Õ¡£¤½¤¦¤¹¤ë¤È¡¢scan_beg != NIL ¤ÏɬÍפʤ¯¤Ê¤ë¤Î¤À¤¬¤ï¤«¤ê¤ä¤¹¤µ¤ò
+Äɵᤷ¤¿¡£
+
+¤³¤ì¤Ç match_insert() ¤Î²òÆɤϽª¤ê¤À¡£match_insert() ¤Î½èÍý¤È¤Ï°Ê²¼¤Î
+Ä̤ê¤À¡£
 
 ----------------------------------------------------------------------------
   match_insert() ¤Ï¡¢text[pos] ¤«¤é»Ï¤Þ¤ëʸ»úÎó¤Ë°ìÃפ¹¤ëʸ»úÎó¤ò¼­½ñ
   ¤«¤é¸¡º÷¤·¡¢¸«¤Ä¤«¤Ã¤¿°ÌÃ֤ȰìÃ׍ò matchpos, matchlen ¤ËÀßÄꤹ¤ë¡£
 
-  ¤â¤·¡¢ºÇĹ°ìÃ×ʸ»úÎ󤬸«¤Ä¤«¤é¤Ê¤±¤ì¤Ð matchpos ¤Ï¡¢off ¤ËÀßÄꤵ¤ì¡¢
-  matchlen ¤Ï¹¹¿·¤µ¤ì¤Ê¤¤¡£
+  ¤â¤·¡¢ºÇĹ°ìÃ×ʸ»úÎ󤬸«¤Ä¤«¤é¤Ê¤±¤ì¤Ð matchpos ¤Ï¡¢pos ¤ËÀßÄꤵ¤ì¡¢
+  matchlen ¤Ï¹¹¿·¤µ¤ì¤Ê¤¤¡£(¼Â¤Ï¡¢matchpos = pos ¤Î¾ðÊó¤ÏÆä˻Ȥï¤ì¤Æ¤Ê¤¤)
 
   ¸«¤Ä¤«¤Ã¤¿¾ì¹ç¡¢matchlen ¤Ï¸Æ¤Ó½Ð¤·Á°¤Î matchlen ¤è¤ê¤âÂ礭¤¯¤Ê¤ë¡£
   (¸Æ¤Ó½Ð¤·Á°¤Ç¤Ï matchlen ¤Î°ÕÌ£¤ÏºÇÄã¸Â°ìÃפ·¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤Ê¸»úÎó
@@ -2000,36 +2086,517 @@ pos2+1 
 ¤µ¤Æ¡¢¤³¤ì¤Ç°ìÄ̤ê¤Î²òÀϤϺѤó¤À¤ï¤±¤À¤¬¡¢¤³¤³¤Þ¤Ç¤Î²òÀÏÆâÍƤòÆɤßľ¤·
 ¤Æ¤ß¤ë¤È¡¢°Ê²¼¤ÎÅÀ¤¬¤Þ¤À¤Ò¤Ã¤«¤«¤ë¡£
 
-1. Äê¿ô NIL ¤Ï»È¤ï¤ì¤Æ¤¤¤Ê¤¤
-2. 1. ¤Ë´ØÏ¢¤¹¤ë¤¬ match_insert() ¤Ç¥Ï¥Ã¥·¥å¤òé¤ë¤È¤­¤Ë scan_pos
-   scan_end ¤È¤¤¤¦ÊÑ¿ô¤¬»È¤ï¤ì¤Æ¤¤¤ë¡£¤³¤ÎÃͤϤɤ¦¤¤¤¦°ÕÌ£¤«¡©
-3. ¥Ï¥Ã¥·¥å´Ø¿ô¤ÏºÇŬ¤Ê¤Î¤«¡©ÆäˠHSHSIZ{2^15} ¤ÏºÇŬ¤Ê¤Î¤«¡©
-4. too_flag[] ¤Ï¡¢¼ÂºÝ¤Ë¾È¹ç¤ò¹Ô¤¤¥ë¡¼¥×¤¬LIMIT¤ò±Û¤¨¤¿¾ì¹ç¤Ë
+1. ¥Ï¥Ã¥·¥å´Ø¿ô¤ÏºÇŬ¤Ê¤Î¤«¡©ÆäˠHSHSIZ{2^15} ¤ÏºÇŬ¤Ê¤Î¤«¡©
+2. too_flag[] ¤Ï¡¢¼ÂºÝ¤Ë¾È¹ç¤ò¹Ô¤¤¥ë¡¼¥×¤¬LIMIT¤ò±Û¤¨¤¿¾ì¹ç¤Ë
    ÀßÄꤵ¤ì¤ë¡£¤·¤«¤·¡¢¥Ï¥Ã¥·¥å¤Î¥Á¥§¡¼¥ó¤òºî¤ëºÝ¤Ë¥Á¥§¡¼¥ó¤Î
    ¸Ä¿ô¤ò¤¢¤é¤«¤¸¤á¿ô¤¨¤Æ¤ª¤±¤Ð°ìÅÙ¤Îõº÷¤¹¤é¤â¹Ô¤ï¤ì¤º¡£¤è¤ê
    Á᤯½èÍý¤µ¤ì¤Ê¤¤¤À¤í¤¦¤«¡©
 
-°Ê²¼¡¢¸¡¾Ú¤·¤è¤¦
+¸½¾õ¡¢1, 2 ¤È¤â¼Â»Ü¤·¤Æ¤ß¤¿¤È¤³¤íÆäË®Å٤βþÁ±¤Ï¸«¤é¤ì¤Ê¤«¤Ã¤¿¡£Æäˠ
+1 ¤Ï¡¢Èù̯¤Ê¤È¤³¤í¤¬¤¢¤ê¤Û¤È¤ó¤É¤Î½ñ¤­´¹¤¨¤ÏÀ­Ç½¤ò°­¤¯¤¹¤ë¤À¤±¤À¤Ã¤¿¡£
+¤Ê¤«¤Ê¤«¶½Ì£¿¼¤¤¤â¤Î¤¬¤¢¤ë¡£
 
-°ÊÁ°¥Ï¥Ã¥·¥åÃͤȤ·¤Æ
+¤³¤ì¤Ïº£¸å¤Î²ÝÂê¤È¤·¤Æ¤¤¤º¤ì¤Þ¤¿¸¡¾Ú¤·¤è¤¦¡£¤½¤í¤½¤í slide.c ¤âË°¤­¤Æ
+¤­¤¿¤Î¤Ç¤Ò¤È¤Þ¤º¤Ï¤³¤ì¤Ç½ª¤ê¤Ë¤·¤¿¤¤¡£
 
-  hash[hval] = NIL
+\f
+bit Æþ½ÐÎϥ롼¥Á¥ó (crcio.c)
+---------------------------
 
Τ褦¤Ê hval ¤Ï½é´üÃͰʳ°¤Ç¤Ï¸ºß¤·¤Ê¤¤¤À¤í¤¦¤ÈͽÁÛ¤·¤¿¤Î¤À¤¬¡¢¼ÂºÝ¤Ë
-¤½¤ÎÄ̤ê¤À¤Ã¤¿¡£pos ¤Ï¡¢dicsiz ¤«¤é dicsiz*2 - 1 ¤ÎÈϰϤÎÃͤˤ·¤«¤Ê¤é
-¤Ê¤¤¤«¤é¤À¡£°ì¸«¡¢¥Á¥§¡¼¥ó¤òé¤ë¤È¤­¤³¤Î NIL ¤Ï»È¤ï¤ì¤Æ¤¤¤Ê¤¤¤è¤¦¤Ë¸«
¨¤ë¤¬¡¢¼ÂºÝ¤Ë¤Ï¡¢match_insert() ¤Î
³¤ì¤«¤é Huffman Ë¡¤Î²òÆɤ˰ܤë¤Î¤À¤¬¡¢¤½¤ÎÁ°½àÈ÷¤È¤·¤Æ bit Æþ½ÐÎϥ롼
+¥Á¥ó¤Î²òÆɤò¹Ô¤¦¡£Huffman Ë¡¤Î¼ÂÁõ¤Ç¤Ïɬ¤º bit Æþ½ÐÎϽèÍý¤¬É¬Íפˤʤ롣
+LHa for UNIX ¤â¤â¤Á¤í¤óÎã³°¤Ç¤Ï¤Ê¤¯¡¢Huffman Ë¡¤Î¼ÂÁõ¤ò²òÆɤ¹¤ë¤Ë¤¢¤¿
ꤳ¤ÎÉôʬ¤Î½èÍýÆâÍƤϤϤ䭤ꤵ¤»¤Æ¤ª¤¤¤¿Îɤ¤¤È¹Í¤¨¤¿¤Î¤À¡£
 
-        scan_pos = hash[h];
-        scan_end = (pos > dicsiz) ? pos + off - dicsiz : off;
-        while (scan_pos > scan_end) {
+LHa for UNIX version 1.14i ¤Ç¤Ï bit Æþ½ÐÎϥ롼¥Á¥ó¤Ï crcio.c ¤ÇÄêµÁ¤µ
+¤ì¤Æ¤¤¤ë¡£(¤³¤Î¤è¤¦¤Ê¥Õ¥¡¥¤¥ë̾¤Ë¸ºß¤¹¤ë¤Î¤Ï°Õ³°¤Ê»ö¤À¡£ºÇ¶á¤Î LHa
+for UNIX ¤Ç¤Ï¡¢»ä¤¬ bitio.c ¤È¤¤¤¦¥Õ¥¡¥¤¥ë¤òÀߤ±¡¢bit Æþ½ÐÎϥ롼¥Á¥ó¤Ï
+¤½¤³¤ËÀÚ¤ê½Ð¤·¤¿)
+
+crcio.c ¤Î¤¦¤Á bit Æþ½ÐÎϥ롼¥Á¥ó¤Ï fillbuf(), getbits(), putcode(),
+putbits(), init_getbits(), init_putbits() ¤Î 6 ´Ø¿ô¤À¡£
+
+¤Þ¤º¡¢½é´ü²½ÍѤΠinit_getbits(), init_putbits() ¤ò¸«¤è¤¦¡£
+
+void
+init_getbits( /* void */ )
+{
+    bitbuf = 0;
+    subbitbuf = 0;
+    bitcount = 0;
+    fillbuf(2 * CHAR_BIT);
+#ifdef EUC
+    putc_euc_cache = EOF;
+#endif
+}
+
+void
+init_putbits( /* void */ )
+{
+    bitcount = CHAR_BIT;
+    subbitbuf = 0;
+    getc_euc_cache = EOF;
+}
+
+¤½¤ì¤¾¤ì bit ÆþÎÏ¡¢bit ½ÐÎϤò¹Ô¤¦¤¿¤á¤Î½é´ü²½½èÍý¤À¡£CHAR_BIT ¤È¤¤¤¦¤Î
+¤Ï 8 ¤Ç¡¢char ¤Î bit ¥µ¥¤¥º¤òɽ¤·¤Æ¤¤¤ë¤é¤·¤¤¡£¾ÜºÙ¤Ï¤ï¤«¤é¤Ê¤¤¤¬½é´ü
+¾õÂ֤ϤȤˤ«¤¯¤³¤ì¤À¡£¤³¤³¤Ç»ÈÍѤµ¤ì¤Æ¤¤¤ëÊÑ¿ô¤Ï¡¢
+
+static unsigned char subbitbuf, bitcount;
+
+¤¬¡¢crcio.c ¤ÇÄêµÁ¤µ¤ì¤Æ¤ª¤ê¡¢
+
+EXTERN unsigned short bitbuf;
+
+¤¬¡¢lha.h ¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë(EUC ¤Ê¤ó¤¿¤é¤ÏËܼÁ¤Ç¤Ï¤Ê¤¤Ìµ»ë¤·¤è¤¦)¡£¥°¥í¡¼
+¥Ð¥ëÊÑ¿ô¤È¸À¤¦¤Î¤Ï´÷¤à¤Ù¤­¤â¤Î¤À¤¬¡¢¤È¤Ë¤«¤¯»ÈÍѤµ¤ì¤Æ¤¤¤ëÊÑ¿ô¤È½é´üÃÍ
+¤ò³Îǧ¤·¤¿¤Î¤Ç¼¡¤Ë°Ü¤í¤¦¡£init_getbits() ¤Ç¡¢Áá® fillbuf() ¤¬¸Æ¤Ð¤ì¤Æ
+¤¤¤ë¡£¤³¤Î½èÍýÆâÍƤò¸«¤ë¡£
+
+void
+fillbuf(n)          /* Shift bitbuf n bits left, read n bits */
+    unsigned char   n;
+{
+    /* (A) */
+    while (n > bitcount) {
+        n -= bitcount;
+        /* (B) */
+        bitbuf = (bitbuf << bitcount) + (subbitbuf >> (CHAR_BIT - bitcount));
+        /* (C) */
+        if (compsize != 0) {
+            compsize--;
+            subbitbuf = (unsigned char) getc(infile);
+        }
+        else
+            subbitbuf = 0;
+        bitcount = CHAR_BIT;
+    }
+    /* (D) */
+    bitcount -= n;
+    bitbuf = (bitbuf << n) + (subbitbuf >> (CHAR_BIT - n));
+    subbitbuf <<= n;
+}
+
+¤Þ¤º¡¢½é´ü¾õÂ֤Ȥ·¤Æ
+
+    bitbuf = 0;
+    subbitbuf = 0;
+    bitcount = 0;
+
+¤Ç¤¢¤ê¡¢fillbuf ¤Î°ú¿ô n ¤Ë¤Ï 2 * CHAR_BIT ¤¬Í¿¤¨¤é¤ì¤¿¤Î¤À¤Ã¤¿¡£¤¤¤­
+¤Ê¤ê while ¾ò·ï¤òËþ¤¿¤¹¤Î¤Ç¥ë¡¼¥×Éô¤Î²òÀϤò¹Ô¤ï¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¯¤Ê¤ë¤¬¡¢
+¤Ò¤È¤Þ¤º¤³¤ì¤ò̵»ë¤·¤ÆºÇ¸å¤Î 3 ¹Ô (D) ¤ËÃåÌܤ¹¤ë¡£¾ò·ï¤Ï¾¯¤Ê¤¤Êý¤¬Îɤ¤
+¤Î¤À¡£
+
+    /* (D) */
+    bitcount -= n;
+    bitbuf = (bitbuf << n) + (subbitbuf >> (CHAR_BIT - n));
+    subbitbuf <<= n;
+
+bitbuf << n, subbitbuf << n ¤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¢bitbuf, subbitbuf ¤ò n ¥Ó¥Ã
+¥Èº¸¤Ë¤º¤é¤¹½èÍý¤Î¤è¤¦¤À¡£¤µ¤é¤Ë bitbuf ¤Ë¤Ï¡¢subbitbuf ¤ò n ¥Ó¥Ã¥È¤º
+¤é¤·¤¿¤È¤­¤Ë°î¤ì¤¿Éôʬ¤ò bitbuf ¤Ë¥»¥Ã¥È¤·¤Æ¤¤¤ë¡£¤Ã¤È¡¢
+
+   (subbitbuf >> (CHAR_BIT - n))
+
+¤ÎÉôʬ¤ò·Ú¤¯ÀâÌÀ¤·¤¿¤¬¡¢¿Þ¼¨¤·¤Æ³Îǧ¤·¤Æ¤ª¤³¤¦¡£
+
+subbitbuf ¤Ï unsigned char ¤Ê¤Î¤Ç 8 bit ¤ÎÊÑ¿ô¤À¡£
+
+----------------------------------------------------------------------------
+               7  6  5  4  3  2  1  0
+              +--+--+--+--+--+--+--+--+
+   subbitbuf  |                       |
+              +--+--+--+--+--+--+--+--+
+              <-- n -->
+----------------------------------------------------------------------------
+
+n ¤¬Î㤨¤Ð 3 ¤Î¾ì¹ç¡¢CHAR_BIT - n ¤Ï¡¢5 ¤À¤«¤é subbitbuf ¤ò 5 ¥Ó¥Ã¥È±¦
+¤Ë¤º¤é¤·¤¿Ãͤò¼è¤Ã¤Æ¤¤¤ë¡£¤Ä¤Þ¤ê¡¢¿Þ¤Î 7, 6, 5 ¥Ó¥Ã¥ÈÌܤ¬°ìÈÖ±¦¤ËÍè¤ë
+¤è¤¦¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢¤³¤ÎÃͤò bitbuf ¤Ë­¤·¤Æ¤¤¤ë¡£(C¸À¸ì¤Ç¤Ï¡¢unsigned 
+¤ÊÊÑ¿ô¤ò±¦¤Ë¥·¥Õ¥È¤¹¤ë¤È¾å°Ì¥Ó¥Ã¥È¤Ë¤Ï 0 ¤¬Æþ¤ë)
+
+fillbuf() ¤Î¸åȾ 3 ¹Ô(¤¤¤ä¡¢¸åȾ2¹Ô¤«)¤Ï¡£·ë¶É bitbuf ¤È subbitbuf ¤ò
+°ì¤Ä¤Î bitbuf ¤È¤ß¤Ê¤·¤Æ n ¥Ó¥Ã¥Èº¸¤Ë¤º¤é¤·¤Æ¤¤¤ë¤³¤È¤¬¤ï¤«¤ë¡£
+
+----------------------------------------------------------------------------
+<¥Ó¥Ã¥È¥Ð¥Ã¥Õ¥¡Á´Âοޠ(ͽÁÛ)>
 
-¤Î¾ò·ï¤Ë¤è¤Ã¤Æ¡¢hash[h] ¤¬ 0 ¤Î¾ì¹ç¤Ï¤¹¤°¤Ë match_insert() ¤¬½ª¤ë¤è¤¦
-¤Ë¤Ï¤Ê¤Ã¤Æ¤¤¤ë¡£match_insert() ¤ÎƬ¤Ç
+           7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
+          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+  bitbuf  |                             |          x  y  z|
+          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+                                         \        <-- n  ->
+                                         subbitbuf
+           <-------------- bitcount ------------->
 
-  if (hash[hval] == NIL) return;
+----------------------------------------------------------------------------
+
+¤³¤Î¤È¤­¡¢ÅöÁ³¿Þ¤Î x, y, z ¤ÎÉôʬ(n = 3 ¤ÏÎã¤È¤·¤Æ¤ÎÃͤÀ)¤¬¶õ¤¯»ö¤Ë¤Ê¤ë¡£
+bitcount ¤È¤¤¤¦ÊÑ¿ô¤¬ n °ú¤«¤ì¤Æ¤¤¤¿¤¬¡¢¤³¤ì¤Ï bit ¥Ð¥Ã¥Õ¥¡Á´ÂΤÎÍ­¸ú
+¤Ê¥Ó¥Ã¥È¿ô¤òɽ¤·¤Æ¤¤¤ë¤Î¤Ç¤Ï¤Ê¤¤¤«¤ÈͽÁÛ¤·¤Æ¤ª¤¯¡£¤¹¤Ê¤ï¤Á¿Þ¤Î¾õÂ֤ʤé
+21 ¤À¡£while ¥ë¡¼¥×¤Ï(´Ø¿ô̾¤«¤é)¤³¤Î¶õ¤­Éôʬ¤òËä¤á¤ë½èÍý¤Ê¤Î¤Ç¤Ï¤Ê¤¤
+¤«¤ÈŬÅö¤ËͽÁۤǤ­¤ë¡£¤Ç¤Ï¡¢while ¥ë¡¼¥×¤ò¸«¤è¤¦¡£¤â¤¦°ìÅÙ½é´üÃͤò³Îǧ
+¤·¡¢ºÇ½é¤Ë¹Ô¤ï¤ì¤ë½èÍýÆâÍƤò¸«¤è¤¦¡£
+
+ºÇ½é¡¢
+
+    bitbuf = 0;
+    subbitbuf = 0;
+    bitcount = 0;
+
+¤Ç¤¢¤ë¤«¤é¡¢bit¥Ð¥Ã¥Õ¥¡¤Ï¶õ¤Ã¤Ý¤À¡£ÅöÁ³ fillbuf(2 * CHAR_BIT) ¤µ¤ì¤ë¤È
+while ¾ò·ï¤òËþ¤¿¤¹¡£¤­¤Ã¤È 16 bit ¤À¤± bit¥Ð¥Ã¥Õ¥¡¤¬Êä½¼¤µ¤ì¤ë¤Ï¤º(¤Ä
+¤Þ¤ê¡¢bitbuf ¤¤¤Ã¤Ñ¤¤¡¢subbitbuf ¶õ)¤À¡£
+
+    /* (A) */
+    while (n > bitcount) {
+        n -= bitcount;
+
+¤Ç¡¢¥Ó¥Ã¥È¥Ð¥Ã¥Õ¥¡¤¬ÊÝ»ý¤¹¤ë bit ¿ô°Ê¾å¤òÍ׵ᤵ¤ì¤¿¤Î¤Ç¡¢¥ë¡¼¥×¤ËÆþ¤ë¡£
+n -= bitcount ¤Ç¡¢ËÜÅö¤Ë­¤ê¤Ê¤¤Éôʬ¤¬²¿¥Ó¥Ã¥È¤Ê¤Î¤«¤òÆÀ¤Æ¤¤¤ë¡£¤³¤³¤Ç
+¤Ï 16 ¤À¡£¼¡¤Î¹Ô
+
+        /* (B) */
+        bitbuf = (bitbuf << bitcount) + (subbitbuf >> (CHAR_BIT - bitcount));
+
+¤³¤ì¤ÏÀèÄø¤â½Ð¤ÆÍ褿½èÍý¤À¡£¥Ó¥Ã¥È¥Ð¥Ã¥Õ¥¡Á´ÂΤò bitcount Ê¬º¸¤Ë¤º¤é¤·
+¤Æ¤¤¤ë(¤¿¤À¤·¡¢¤Þ¤À subbitbuf ¤Ï¤º¤é¤µ¤ì¤Æ¤¤¤Ê¤¤)¡£¤³¤Î»þÅÀ¤ÇͽÁÛ¤¬¾¯
+¤·Ê¤¤µ¤ì¤¿¡£8 - bitcount ¤Ç subbitbuf ¤ò¤º¤é¤·¤Æ¤¤¤ë¤«¤é bitcount ¤ÏºÇ
+Âç 8 ¤ÎÃͤ·¤«»ý¤¿¤Ê¤¤¤À¤í¤¦¤È¤¤¤¦¤³¤È¤À¡£¤É¤¦¤¤¤¦¤³¤È¤«¡¢¹Í¤¨¤Æ¤ß¤ë¡¦¡¦¡¦
+¹Í¤¨¤Æ¤â¤ï¤«¤é¤Ê¤«¤Ã¤¿¤Î¤Ç¼¡¤Ë¿Ê¤â¤¦¡£
+
+        /* (C) */
+        if (compsize != 0) {
+            compsize--;
+            subbitbuf = (unsigned char) getc(infile);
+        }
+        else
+            subbitbuf = 0;
+        bitcount = CHAR_BIT;
+
+compsize ¤È¤¤¤¦¤Î¤¬½Ð¤ÆÍ褿¤¬¡¢¤³¤ÎÃͤ¬¤É¤¦¤¢¤í¤¦¤È¤â subbitbuf ¤Ï8 ¥Ó¥Ã
+¥ÈËä¤á¤é¤ì¡£bitcount ¤Ï 8 ¤ËÀßÄꤵ¤ì¤Æ¤¤¤ë¡£¤ï¤«¤Ã¤¿ bitcount ¤Ï¡¢
+subbitbuf ¤ËÊÝ»ý¤¹¤ë bit ¿ô¤À¡£¿Þ¤òÄûÀµ¤·¤è¤¦¡£
+
+----------------------------------------------------------------------------
+<¥Ó¥Ã¥È¥Ð¥Ã¥Õ¥¡Á´ÂοÞ>
+
+           7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
+          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+  bitbuf  |                             |            x y z|
+          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+                                       /          <-- n  ->
+                                   subbitbuf
+                                        <-------->
+                                         bitcount
+
+----------------------------------------------------------------------------
+
+¤³¤Î¿Þ¤òƧ¤Þ¤¨¤Æ¤â¤¦°ìÅÙ½é´ü¾õÂ֤ǤνèÍýÆâÍƤòÄɤ¤¤«¤±¤ë¡£
+
+¤Þ¤º¡¢(A) ¤Ç¡¢subbitbuf ¤Ï¶õ¤Ê¤Î¤Ç¡¢bitcount ¤Ï 0 ¤À¡£Í׵ᤷ¤¿ bit ¿ô 
+n{16} ¤è¤ê¾®¤µ¤¤¤Î¤Ç¥ë¡¼¥×¤ËÆþ¤ë¡£n ¤Ï 16 ¤Î¤Þ¤Þ¤À¡£
+
+(B) ¤Ç¡¢subbitbuf ¤Ë»Ä¤Ã¤Æ¤¤¤ë bit ¤ò bitbuf ¤Ë¤º¤é¤·¤Æ¤¤¤ë¡£º£¤Ï¤Þ¤À
+¶õ¤Ê¤Î¤Çbitbuf ¤Ï¤³¤³¤Ç¤â¤Þ¤À¶õ¤À¡£
+
+(C) ¤Ç¡¢8 ¥Ó¥Ã¥È¥Õ¥¡¥¤¥ë¤«¤é¥Ç¡¼¥¿¤òÆɤà(compsize ¤Ï¾ï¤Ë0¤Ç¤Ê¤¤¤È¹Í¤¨
+¤ë)¡£bitcount ¤Ï 8 ¤Ë¤Ê¤ë¡£¤³¤Î»þÅÀ¤Ç bit¥Ð¥Ã¥Õ¥¡Á´ÂΤϠsubbitbuf ¤À¤±
+Ãͤ¬Æþ¤Ã¤¿¾õÂ֤ˤʤ롣
+
+¼¡¤Î¥ë¡¼¥×¤Ë°Ü¤í¤¦¡£(A) ¤Ç¡¢subbitbuf ¤Ï¤¤¤Ã¤Ñ¤¤¤Ç¤¢¤ë¤¬Í׵ᤷ¤¿ n{16} 
+¤è¤ê¤Ï¾®¤µ¤¤¤Î¤Ç¡¢¤Þ¤À¥ë¡¼¥×¤Ï³¤¯¡£n ¤Ï¤³¤³¤Ç 8 ¤Ë¤Ê¤ë¡£
+
+(B) ¤Ç¡¢subbitbuf ¤Ë»Ä¤Ã¤Æ¤¤¤ë bit (8 bit ¤À)¤ò bitbuf ¤Ë¤º¤é¤·¤Æ¤¤¤ë¡£
+º£Å٤Ϡsubbitbuf Á´ÂΤ¬ bitbuf ¤Ë°Ü¤Ã¤Æ¤¤¤ë¤Î¤ÈƱ¤¸¤À¡£(¤Ä¤Þ¤ê¡¢bitbuf
+= subbitbuf)
+
+(C) ¤Ç¡¢¤Þ¤¿ subbitbuf ¤Ï 8 bit Êä½¼¤µ¤ì¤ë¡£
+
+(A) ¤Ç¡¢n{8} > bitcount{8} ¤Ïµ¶¤Ê¤Î¤Ç¥ë¡¼¥×¤¬½ª¤ë¡£
+
+(D) ¤Ç¡¢subbitbuf ¤Ë»Ä¤Ã¤Æ¤¤¤ë bit ¤Ï¤¹¤Ù¤Æ bitbuf ¤Ë°Ü¤ë¡£bitbuf ¤Ï 16
+bit ¤¤¤Ã¤Ñ¤¤¤Ë¤Ê¤ë¡£bitcount ¤Ï 0 ¤À¡£
+
+¤³¤Î½èÍý·ë²Ì¤«¤é fillbuf(n) ¤Ï¡¢bitbuf ¤Ë n ¥Ó¥Ã¥ÈÆɤ߹þ¤à½èÍý¤À¤È¸À¤¨
+¤ë¡£°ú¿ô¤Ë»ØÄê¤Ç¤­¤ë n ¤¬ºÇÂç 16 ¥Ó¥Ã¥È¤Ç¤¢¤ë¤³¤È¤Ë¤âµ¤¤Å¤¤¤ÆÎɤ¤¤À¤í
+¤¦¡£½èÍýÆâÍƤò³Îǧ¤·¤Æ¤ß¤ì¤Ð¤ï¤«¤ë¡£
+
+¤³¤³¤Ç¡¢subbitbuf ¤ÎÍÑÅӤ˵¤¤Å¤¤¤¿¡£¥Õ¥¡¥¤¥ë¤«¤é¤ÎÆɤ߹þ¤ß¤¬ 8 ¥Ó¥Ã¥È
+ñ°Ì¤Ç¤·¤«¤Ç¤­¤Ê¤¤¤Î¤Ç¡¢¤½¤ì¤òÊ䤦¤¿¤á¤ÎÀèÆɤߥХåե¡¤Ç¤¢¤í¤¦¡£Î㤨¤Ð
+1 ¥Ó¥Ã¥È¤À¤± bitbuf ¤ò fill ¤·¤¿¤±¤ì¤Ð subbitbuf ¤Ë 7 bit »Ä¤·¡¢1 bit
+¤À¤± bitbuf ¤ËÀßÄꤵ¤ì¤ë(³Îǧ¤·¤Æ¤ß¤ì¤Ð¤ï¤«¤ë)
+
+fillbuf() ¤¬¤ï¤«¤Ã¤¿¤Î¤Ç¡¢¤½¤ì¤òÍøÍѤ·¤Æ¤¤¤ë getbits() ¤ÎÆâÍƤò³Îǧ¤·
+¤è¤¦¡£
+
+unsigned short
+getbits(n)
+    unsigned char   n;
+{
+    unsigned short  x;
+
+    x = bitbuf >> (2 * CHAR_BIT - n);
+    fillbuf(n);
+    return x;
+}
+
+    x = bitbuf >> (2 * CHAR_BIT - n);
+
+¤Ï¡¢3 ÅÙ¤â½Ð¤ÆÍ褿¤Î¤Ç
+
+     buf >> (sizeof(buf)*8 - n)
+
+¤ò buf ¤Î¾å°Ì n ¥Ó¥Ã¥È¤òÆÀ¤ë¼°¤À¤È¤·¤Æ¥Þ¥¯¥í¤Ë¤·¤Æ¤âÎɤ¤¤À¤í¤¦¡£(¤¬¡¢
+Îɤ¤Ì¾Á°¤¬»×¤¤ÉÕ¤«¤Ê¤¤¤Î¤Ç¤½¤¦¤Ï¤·¤Ê¤¤)¡£¤È¤Ë¤«¤¯¡¢bitbuf ¤Î¾å°Ì n ¥Ó¥Ã¥È
+¤ò²¼°Ì n ¥Ó¥Ã¥È¤È¤·¤Æ x ¤ËÂåÆþ¤·¤Æ¤¤¤ë¡£¤½¤Î¸å¤Ç¡¢
+
+    fillbuf(n);
+
+¤·¤Æ¤¤¤ë¡£n bit ¤ò x ¤ËÅϤ·¤¿¤Î¤Ç bitbuf ¤«¤é¾å°Ì n ¥Ó¥Ã¥È¤ò¼Î¤Æ¤Æ¡¢n 
+¥Ó¥Ã¥ÈÊä½¼¤¹¤ë¡£¤³¤³¤Ç¡¢bitbuf ¤Ï¾ï¤Ë¤¤¤Ã¤Ñ¤¤¤Î¾õÂ֤ˤʤäƤ¤¤ë¤³¤È¤¬
+¤ï¤«¤ë¡£(¥Õ¥¡¥¤¥ë¤ÎËöÈøÉÕ¶á¤Î¾ì¹ç¡¢Àµ³Î¤Ë bitbuf ¤Ë²¿¥Ó¥Ã¥È»Ä¤Ã¤Æ¤¤¤ë
+¤«¤¬È½ÃǤǤ­¤Ê¤¤¤¬¡¢¼ïÌÀ¤«¤·¤ò¤¹¤ë¤È¤³¤Î¤³¤È¤Ï LHa ¤Î½èÍýÆâÍƤˤȤäÆ
+¤Ï¤É¤¦¤Ç¤â¤¤¤¤¤³¤È¤À¡£getbits() ¤Ï decode ½èÍý¤Ç»È¤ï¤ì¤ë¤Î¤À¤¬¡¢decode 
+½èÍý¤Ï²¿¥Ó¥Ã¥È¤Î¾ðÊó¤ò decode ¤¹¤ëɬÍפ¬¤¢¤ë¤«¤ò¾¤Î¾ðÊ󤫤餢¤é¤«¤¸¤á
+ÆÀ¤Æ¤¤¤ë)
+
+¼¡¤Ë°Ü¤í¤¦º£Å٤Ϡputcode() ¤À¡£put ¤Î¾ì¹ç¤Þ¤º¤Ï¡¢init_putbits() ¤Ç
+½é´ü²½¤¬¹Ô¤ï¤ì¤Æ¤¤¤ë¡£¤½¤ÎÃͤϰʲ¼¤À¡£
+
+    bitcount = CHAR_BIT;
+    subbitbuf = 0;
+    getc_euc_cache = EOF;
+
+getc_euc_cache ¤Ï̵»ë¤À¡£bitcount ¤È subbitbuf ¤ÎÃͤ¬ÀßÄꤵ¤ì¡¢bitbuf 
+¤ÏÍøÍѤµ¤ì¤Ê¤¤¡£ÀèÄø¤È¤Ï°ã¤¤ subbitbuf ¤¬¶õ¤Ê¤Î¤Ëbitcount ¤¬ 8 ¤Ê¤Î¤Ç¡¢
+bitcount ¤Î»È¤ï¤ìÊý¤¬Â¿¾¯°Û¤Ê¤ë¤è¤¦¤À¡£get ¤Î¾ì¹ç¤Ï¡¢bitcount ¤Ï¡¢
+subbitbuf ¤ËÊÝ»ý¤¹¤ë bit ¿ô¤À¤Ã¤¿¤¬º£Å٤Ϡsubbitbuf ¤Î¶õ¤­ bit ¿ô¤À¤í
+¤¦¤ÈͽÁÛ¤·¤Æ¤ª¤³¤¦¡£
+
+¤½¤·¤Æ¡¢putcode(n, x) ¤ò¸«¤ë¡£¼Â¤Ï¥½¡¼¥¹¤ò¸«¤ë¤È¤ï¤«¤ë¤Î¤À¤¬¡¢¤â¤¦°ì¤Ä
+¤Î½ÐÎϥ롼¥Á¥ó putbits() ¤Ï¡¢putcode() ¤Î¸Æ¤Ó½Ð¤·¤Ë½ñ¤­´¹¤¨²Äǽ¤À¡£
+putbits() ¤Ï¡¢
+
+void
+putbits(n, x)           /* Write rightmost n bits of x */
+    unsigned char   n;
+    unsigned short  x;
+{
+    x <<= USHRT_BIT - n;
+    putcode(n, x);
+}
+
+¤Ã¤È½ñ¤­´¹¤¨¤é¤ì¤ë¤Î¤À¡£¤Ê¤Î¤Ç¡¢putcode() ¤ÎÆâÍƤòÀè¤Ë³Îǧ¤¹¤ë¤ï¤±¤À¡£
 
-¤È¤ä¤Ã¤Æ¤âÎɤµ¤½¤¦¤À¤¬¡¢Í¾·×¤Ê½èÍý¤Ï¾¯¤·¤Ç¤âÇÓ½ü¤·¤¿¤«¤Ã¤¿¤Î¤À¤í¤¦¤«¡£
+void
+putcode(n, x)           /* Write rightmost n bits of x */
+    unsigned char   n;
+    unsigned short  x;
+{
+    /* (A) */
+    while (n >= bitcount) {
+        n -= bitcount;
+        /* (B) */
+        subbitbuf += x >> (USHRT_BIT - bitcount);
+        x <<= bitcount;
+        /* (C) */
+        if (compsize < origsize) {
+            if (fwrite(&subbitbuf, 1, 1, outfile) == 0) {
+                /* fileerror(WTERR, outfile); */
+                fatal_error("Write error in crcio.c(putcode)\n");
+                /* exit(errno); */
+            }
+            compsize++;
+        }
+        else
+            unpackable = 1;
+        subbitbuf = 0;
+        bitcount = CHAR_BIT;
+    }
+    /* (D) */
+    subbitbuf += x >> (USHRT_BIT - bitcount);
+    bitcount -= n;
+}
+
+½èÍýÆâÍƤ¬ fillbuf() ¤Î¤È¤­¤È»÷¤Æ¤¤¤ë¡£¤Þ¤º¤Ï¡¢ÀèÄø¤ÈƱÍͤˠwhile ¾ò·ï
+¤ò̵»ë¤·¤Æ¹Í¤¨¤Æ¤ß¤ë¡£(D) ¤À¡£
+
+    /* (D) */
+    subbitbuf += x >> (USHRT_BIT - bitcount);
+    bitcount -= n;
+
+¤³¤Î¼°¤Ï¤â¤¦ 4 ÅÙÌܤÀ¡£¤Þ¤º¡¢x ¤Î¾å°Ì bitcount ¥Ó¥Ã¥È¤òÆÀ¤Æ¡¢subbitbuf 
+¤Ë­¤·¤Æ¤¤¤ë¡£bitcount ¤Ï¡¢ÀèÄø subbitbuf ¤Î¶õ¤­¤Ç¤¢¤í¤¦¤ÈͽÁÛ¤·¤¿¤¬¡¢
+n °ú¤«¤ì¤Æ¤¤¤ë¤Î¤Ç¡¢Ëä¤á¤¿Ê¬¶õ¤­¤¬¸º¤Ã¤Æ¤¤¤ë¤ï¤±¤À¡£Í½ÁÛ¤ÏÅö¤¿¤Ã¤Æ¤¤¤ë
+¤À¤í¤¦¡£¤³¤Î»þÅÀ¤Ç¤³¤Î´Ø¿ô¤¬ x ¤Î¾å°Ì¥Ó¥Ã¥È¤òÍøÍѤ¹¤ë¤³¤È¤¬¤ï¤«¤ë¡£¥³
+¥á¥ó¥È¤Ë rightmost n bits of x ¤È½ñ¤«¤ì¤Æ¤¤¤ë¤¬ÏǤ蘆¤ì¤Æ¤Ï¤¤¤±¤Ê¤¤¡£
+¿¤¯¤Î¾ì¹ç¡¢¥³¥á¥ó¥È¤Ï¤»¤¤¤¼¤¤¥Ò¥ó¥È¤È¤·¤Æ¤Î¾ðÊó¤Ç¤·¤«¤Ê¤¤¡£¿®ÍѤ·¤Æ¤Ï
+¤¤¤±¤Ê¤¤¤â¤Î¤Ê¤Î¤À¡£(¥³¥á¥ó¥È¤Ï¤¢¤Þ¤ê¥Ç¥Ð¥Ã¥°¤µ¤ì¤Ê¤¤¡£¥³¥á¥ó¥È¤¬¾Ü¤·
+¤±¤ì¤Ð¾Ü¤·¤¤Äø¥³¥á¥ó¥È¤Ï¥¨¥ó¥Ð¥°¤·¤ä¤¹¤¤¡£µ¿¤Ã¤Æ¤«¤«¤í¤¦¡£¤³¤ì¤ÏËܽñ¤Ë
+¤â¸À¤¨¤ë¡£¤¹¤Ù¤Æ¤ò±­¤Î¤ß¤Ë¤·¤Æ¤Ï¤¤¤±¤Ê¤¤¤Î¤À)
+
+¤Ç¤Ï¡¢½èÍýÆâÍƤ˰ܤ롣¤Þ¤º¤Ï (A)
+
+    /* (A) */
+    while (n >= bitcount) {
+        n -= bitcount;
+
+subbitbuf ¤Î¶õ¤­¤¬ n °Ê²¼¤Ç¤¢¤ì¤Ð¥ë¡¼¥×¤ËÆþ¤ë¡£subbitbuf °ì¤Ä¤Ç¤Ïn ¥Ó¥Ã
+¥ÈÁ´Éô¤ÏÏŤ¨¤Ê¤¤¤«¤é¥ë¡¼¥×¤Ç¾®¹ï¤ß¤Ë½èÍý¤·¤è¤¦¤È¤¤¤¦¤³¤È¤À¤í¤¦(¤â¤¦Á´
+ÂΤνèÍýÆâÍƤÎͽÁۤϤĤ¤¤Æ¤¤¤ë)
+n ¤«¤é bitcount °ú¤¤¤Æ¤¤¤ë¤Î¤Ç¡¢n ¥Ó¥Ã¥È¤Î¤¦¤Á¤³¤ì¤«¤é bitcount Ê¬¤Ï
+½èÍý¤µ¤ì¤ë¤³¤È¤ò¤³¤³¤Ç¤µ¤Ã¤µ¤Èµ­Ï¿¤·¤Æ¼¡¤Î¥ë¡¼¥×¤ËÈ÷¤¨¤Æ¤¤¤ë¡£
+
+        /* (B) */
+        subbitbuf += x >> (USHRT_BIT - bitcount);
+        x <<= bitcount;
+
+x ¤Î¾å°Ì bitcount ¥Ó¥Ã¥È¤ò subbitbuf ¤Ë­¤·¤Æ¤¤¤ë¡£subbitbuf ¤Î¶õ¤­¤¬
+¤³¤ì¤ÇËä¤Þ¤Ã¤¿¡£subbitbuf ¤Ï¤â¤¦¤¤¤Ã¤Ñ¤¤¤À¡£x ¤ò bitcount ¥·¥Õ¥È¤¹¤ë¤³
+¤È¤Ç subbitbuf ¤ËÅϤ·¤¿ x ¤Î¾å°Ì¥Ó¥Ã¥È¤ò¼Î¤Æ¤Æ¤¤¤ë¡£
+
+        /* (C) */
+        if (compsize < origsize) {
+            if (fwrite(&subbitbuf, 1, 1, outfile) == 0) {
+                /* fileerror(WTERR, outfile); */
+                fatal_error("Write error in crcio.c(putcode)\n");
+                /* exit(errno); */
+            }
+            compsize++;
+        }
+        else
+            unpackable = 1;
+        subbitbuf = 0;
+        bitcount = CHAR_BIT;
+
+compsize ¤Ï̵»ë¤·¤Æ¤âÎɤ¤¡£½èÍý¤ÎËܼÁ¤Ç¤Ï¤Ê¤¤¤«¤é¤À¤¬¡¢¤¹¤°¤Ë¤ï¤«¤ë¤Î¤Ç
+°ì±þÀâÌÀ¤¹¤ë¤È¡¢
+        if (compsize < origsize) {
+            ...
+        else
+            unpackable = 1;
+¤Ç¡¢°µ½Ì¥Õ¥¡¥¤¥ë¥µ¥¤¥º¤¬¸µ¤Î¥Õ¥¡¥¤¥ë¥µ¥¤¥º¤ò¾å²ó¤Ã¤¿¤È¤­¤Ë
+½èÍý¤ò½ª¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë(unpackable = 1 ¤·¤Æ¡¢Â¾¤Î²Õ½ê¤Ç¤³¤ÎÊÑ¿ô¤ò´Æ»ë¤¹¤ë¡£
+unpackable == 1 ¤Ê¤é½èÍý¤òÃæÃǤ¹¤ë)
+
+¤È¤Ë¤«¤¯ (C) ¤Î»þÅÀ¤Ç¤Ïɬ¤º subbitbuf ¤¬¤¤¤Ã¤Ñ¤¤¤Ë¤Ê¤ë¤Î¤Ç 1 ¥Ð¥¤¥È¤ò
+¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤·¤Æ¤¤¤ë¡£¤½¤Î¸å¡¢subbitbuf = 0, bitcount = 8 ¤È¤·¤Æ 
+subbitbuf ¤ò¶õ¤±¤Æ¼¡¤Î¥ë¡¼¥×¤ËÈ÷¤¨¤Æ¤¤¤ë¡£
+
+¤â¤¦¤¤¤¤¤À¤í¤¦¡£putcode() ¤Ï¡¢ÏÀÍýŪ¤Ë¤Ï x ¤Î¤¦¤Á¾å°Ì n ¥Ó¥Ã¥È¤ò½ÐÎϤ¹
+¤ë½èÍý¤À¡£°ú¿ô n ¤Î¾å¸Â¤¬ x ¤ÎºÇÂç¥Ó¥Ã¥È¥µ¥¤¥º 16 ¤Ë¤Ê¤ë¤Î¤ÏÀâÌÀ¤¹¤ë¤Þ
+¤Ç¤â¤Ê¤¤¤À¤í¤¦¡£
+
+putcode() ¤Ï¼ÂÁõ¤È¤·¤Æ¡¢subbitbuf ¤È x ¤ò°ì¤Ä¤Ë·Ò¤²¤Æ n bit º¸¤Ë¤º¤é¤·
+¤Æ¤¤¤ë½èÍý¤À¤È¹Í¤¨¤Æ¤âÎɤ¤¡£¤½¤¦¤·¤Æ¡¢subbitbuf ¤¬¤¤¤Ã¤Ñ¤¤¤Ë¤Ê¤Ã¤¿¤é¤½
+¤ÎÅÔÅÙ(1 ¥Ð¥¤¥È¤º¤Ä)¥Õ¥¡¥¤¥ë¤Ë½ñ¤­½Ð¤¹¤Î¤À¡£
+
+----------------------------------------------------------------------------
+<¥Ó¥Ã¥È¥Ð¥Ã¥Õ¥¡Á´ÂοÞ>
+
+                      <--- º¸¤Ë¤º¤é¤¹
+
+           7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
+          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+          |* * *          |x y z                          |
+          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+         /               / <-n->        
+      subbitbuf         x
+                 <-------->
+                  bitcount
+
+----------------------------------------------------------------------------
+
+putbits() ¤â¸«¤è¤¦¡£ÀèÄø putcode() ¤Î¸Æ¤Ó½Ð¤·¤Ë½ñ¤­´¹¤¨¤¿¥³¡¼¥É¤ò¸«¤ë¤È
+¤¹¤°¤ï¤«¤ë¤¬¡¢
+
+    x <<= USHRT_BIT - n;
+    putcode(n, x);
+
+ºÇ½é¤Î¼°¤Ç¡¢x ¤Î²¼°Ì n ¥Ó¥Ã¥È¤ò x ¤Î¾å°Ì n ¥Ó¥Ã¥È¤Ë¤·¤Æ¤¤¤ë¡£
+¤½¤¦¤·¤Æ¡¢putcode() ¤ò¸Æ¤Ó½Ð¤·¤Æ¤¤¤ë¤Î¤Ç¡¢putbits(n, x) ¤Ï¡¢x
+¤Î²¼°Ì n ¥Ó¥Ã¥È¤ò½ÐÎϤ¹¤ë½èÍý¤À¡£
+
+°Ê¾å¤Ç¥Ó¥Ã¥ÈÆþ½ÐÎϥ롼¥Á¥ó¤Ï½ª¤ê¤À¡£½ÐÎϤ˴ؤ·¤Æ°ì¤ÄÊ᪤·¤Æ¤ª¤¯¤È
+putcode(), putbits() ¤Ç¤ÏºÇ¸å¤ÎºÇ¸å¤Ç subbitbuf ¤Ë¾ðÊ󤬻Ĥ俤ޤޥե¡
+¥¤¥ë¤Ë½ñ¤­½Ð¤µ¤ì¤Ê¤¤¾õÂ֤ˤʤ롣¤³¤ì¤òÅǤ­½Ð¤¹¤¿¤á¤ËÍøÍѼԤÏ
+
+  putcode(7, 0)
+
+¤ò¹Ô¤¦É¬Íפ¬¤¢¤ë¡£
+
+¤Þ¤È¤á¤è¤¦
+
+----------------------------------------------------------------------------
+fillbuf(n)
+  bitbuf ¤«¤é¾å°Ì n ¥Ó¥Ã¥È¤ò¼Î¤Æ¤Æ¡¢²¼°Ì n ¥Ó¥Ã¥È¤ò¥Õ¥¡¥¤¥ë¤«¤éÆɤ߹þ
+  ¤ßËä¤á¤ë¡£
+
+getbits(n)
+  bitbuf ¤Î¾å°Ì n ¥Ó¥Ã¥È¤ò²¼°Ì n ¥Ó¥Ã¥È¤È¤·¤ÆÊÖ¤¹¡£bitbuf ¤Ï n ¥Ó¥Ã¥È
+  Êä½¼¤µ¤ì¤ë¡£
+
+putcode(n, x)
+  x ¤Î¾å°Ì n ¥Ó¥Ã¥È¤ò¥Õ¥¡¥¤¥ë¤Ë½ÐÎϤ¹¤ë¡£ºÇ¸å¤Î½ÐÎÏ»þ¤Ï putcode(7, 0)
+  ¤¹¤ëɬÍפ¬¤¢¤ë¡£
+
+putbits(n, x)
+  x ¤Î²¼°Ì n ¥Ó¥Ã¥È¤ò¥Õ¥¡¥¤¥ë¤Ë½ÐÎϤ¹¤ë¡£ºÇ¸å¤Î½ÐÎÏ»þ¤Ï putcode(7, 0)
+  ¤¹¤ëɬÍפ¬¤¢¤ë¡£
+
+init_getbits()
+  ÆþÎϽèÍý¤Î½é´ü²½
+
+init_putbits()
+  ½ÐÎϽèÍý¤Î½é´ü²½
+----------------------------------------------------------------------------
+
+Æɤ߹þ¤ß¤Ë´Ø¤·¤Æ¡¢bitbuf ¤Î¥µ¥¤¥º¤¬ 16 ¥Ó¥Ã¥È¤Ç¾ï¤Ë¤½¤Î¾õÂÖ¤¬ÊÝ»ý¤µ¤ì
+¤Æ¤¤¤ë¤Î¤Ï LHa ¤Ë¤È¤Ã¤Æ½ÅÍפʻö¤À¡£decode ½èÍý¤Ç¤ÏľÀÜ bitbuf ¤ò»²¾È¤¹
+¤ë²Õ½ê¤¬¤¢¤ë¡£
+
+Huffman ˡ (huf.c)
+------------------
+
+LHa for UNIX ¤Ç¤Ï¡¢ÀÅŪ Huffman Ë¡¤È¤·¤Æ¡¢shuf.c¡¢Æ°Åª Huffman Ë¡¤È¤·
+¤Æ dhuf.c ¤¬¤¢¤ë¤é¤·¤¤¤¬¡¢¤³¤ì¤é¤Ë´Ø¤·¤Æ¤Ï¿¨¤ì¤Ê¤¤¡£LHa ¤Ç¤Ï¡¢¤³¤ì¤é¤Ï
+²áµî¤ÎÈǤΥ¢¡¼¥«¥¤¥Ö¤ò²òÅà¤Ç¤­¤ë¤è¤¦¤Ë decode ¤Î¤ß¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¤è¤¦
+¤À¡£¤½¤³¤Ç¡¢¤Þ¤º¤Ï -lh4-, -lh5-, -lh6-, -lh7- ¤ÇÍøÍѤµ¤ì¤Æ¤¤¤ë huf.c 
+¤Î²òÀϤòÃæ¿´¤Ë¹Ô¤¦¤³¤È¤È¤·¤¿¤¤¡£
+
+----------------------------------------------------------------------------
+¹½Â¤
+
+    +-----------+
+    | 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)
+----------------------------------------------------------------------------
 
 # Local Variables:
 # mode : indented-text