$Id$
- The Hacking of LHa for UNIX (1st draft)
+ The Hacking of LHa for UNIX (2nd draft)
-------------------------------------------
Koji Arai <mailto:jca02266@nifty.ne.jp>
¤ß¤¿¤À¤±¤Î¤â¤Î¤À¡£(µÙ¤ß¤¬ÌÀ¤±¤ë¤È¤Þ¤¿Ë»¤·¤¯¤Ê¤ë¤Î¤Ç¡¢¤³¤ì°Ê¾å¤Þ¤Ã¤¿¤¯
²¿¤â¤·¤Ê¤¤¤«¤â¤·¤ì¤Ê¤¤)
-¸½»þÅÀ¤Ç¤Ï¡¢slide.c ¤Î²òÀϤÀ¤±¤Ç¤¢¤ë¡£huf.c ¤âƱ»þ¿Ê¹Ô¤Ç²òÀÏÃæ¤À¤¬¡¢Ê¸
-ÂΤ¬°Û¤Ê¤ë(Æɤߤâ¤Î¤È¤·¤Æ¤ÎÂκۤòÀ°¤¨¤Æ¤¤¤Ê¤¤)¤Î¤Ç¸ø³«¤¹¤ë¤È¤·¤Æ¤âÊÌʸ
-½ñ¤Ë¤Ê¤ë¤À¤í¤¦(huf.c ¤Î²òÀÏʸ½ñ¤Ï¸½»þÅÀ¤Ç¥Ç¥Ð¥Ã¥¬¤Ë¤è¤ë¤ª¤Ã¤«¤±¤¬Ãæ¿´
-¤Î¥á¥â¤Ç¤·¤«¤Ê¤¤)
-
-# ËÜÅö¤Ï¡¢huf.c ¤Î²òÀϤòÀè¤Ë¹Ô¤Ã¤Æ¤¤¤¿ slide ¼½ñ¤Î encoding Éô¤Ï¤Ê¤¯
-# ¤Æ¤â LHA ¸ß´¹¥¢¡¼¥«¥¤¥Ð¤Ïºî¤ì¤½¤¦¤À¤Ã¤¿¤«¤é¤À¤¬¡¢huf.c ¤Ï slide.c
-# ¤ËÈæ¤Ù¤ÆÆñ²ò¤ÊÉôʬ¤¬Â¿¤½¤¦¤À¤«¤é¡¢¸å²ó¤·¤Ë¤·¤¿¡£
-
Ëܽñ¤Ï¡¢¤Þ¤À̤´°À®¤Ç¤¢¤ë¡£¤Ë¤â¤«¤«¤ï¤é¤º¸ø³«¤¹¤ë¤Î¤Ï¤³¤ì°Ê¾å³¤«¤Ê¤¤¤«
¤â¤·¤ì¤Ê¤¤¤«¤é¤Ç¤¢¤ë(µ¤¤¬¸þ¤¤¤¿¤é¤Þ¤¿Â³¤¤ò½ñ¤¯¤À¤í¤¦¡£¤¢¤ë¤¤¤Ï±þ±ç¤Î
¤ª¼ê»æ¤¬¤¯¤ì¤Ð¤ä¤ëµ¤¤¬½Ð¤ë¤«¤â¤·¤ì¤Ê¤¤)¡£
===============================================================================
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 ÍѸì¤Ë¤Ä¤¤¤Æ
* Éü¹æ
Éü¹æ²½¡¢Éü¹æ¸ì¡¢Éü¹æʸ
+* ¥Õ¥ì¡¼¥º
+
+* slide ¼½ñË¡
+
+* Huffman ˡ
+ ưŪ Huffman Ë¡¡¢ÀÅŪ Huffman Ë¡
+
===============================================================================
+\f
+slide ¼½ñË¡ (slide.c)
+----------------------
+
¤Þ¤º¡¢¹½Â¤¤Ë¤Ä¤¤¤Æ¹Í¤¨¤ë¡£
slide¼½ñË¡¤Ï¡¢encoding ¤Ë¤µ¤Þ¤¶¤Þ¤Ê¹©Éפ¬¶Å¤é¤µ¤ì¤ë¤Î¤Ç¤È¤Æ¤âÊ£»¨¤À¤¬¡¢
°ÌÃÖ lastmatchoffset & (dicsiz-1)
¤È¤Ê¤Ã¤Æ¤¤¤ë¡£ËÁƬ¤Î decode() ¤Î²òÀϤǡ¢Ä¹¤µ¤Ï 253 ¤ò¤¹»ö¤Ï³ÎǧºÑ¤ß
-¤À(¤Õ¤È -lhs- ¤Î¾ì¹ç 254 ¤ò¤¹¤È¤¤¤¦Æ°ºî¤¬¡¢encoding Éôʬ¤Ç¤Ï¹Í褵¤ì
-¤Æ¤¤¤Ê¤¤¤è¤¦¤À¤Èµ¤¤Å¤¯¡£¤¤¤¤¤Î¤«¤½¤ì¤Ç¡©)¡£¤È¤³¤í¤Ç¡¢°ìÃ×Ĺ
+¤À(-lhs- ¤Î¾ì¹ç 254 ¤ò¤¹¤È¤¤¤¦Æ°ºî¤¬¡¢encoding Éôʬ¤Ç¤Ï¹Í褵¤ì
+¤Æ¤Ê¤¤¤Î¤Ï¡¢-lhs- ¤Î encoding µ¡Ç½¤¬¤Ê¤¤¤«¤é¤À)¡£¤È¤³¤í¤Ç¡¢°ìÃ×Ĺ
lastmatchlen ¤Ï 3 °Ê¾å¤Ç½é¤á¤Æ 255 ¤ò±Û¤¨¤ë¤³¤È¤¬¤Ç¤¤ë¡£°ÊÁ°Í½ÁÛ¤·¤¿¡¢
THRESHOLD ¤Î°ÕÌ£¡ÖºÇÄã¸Â°ìÃפ·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤Ä¹¤µ¡×¤Ï¤¢¤Ã¤Æ¤¤¤ë¤é¤·¤¤¡£
match_insert() ¤Ï¡¢text[pos] ¤«¤é»Ï¤Þ¤ëʸ»úÎó¤ò¼½ñ¤«¤é¸¡º÷¤·¡¢¸«¤Ä¤«¤Ã
¤¿°ÌÃ֤ȰìÃ׍ò matchpos, matchlen ¤ËÀßÄꤹ¤ë½èÍý¤À¡£¤½¤·¤Æ¡¢¤Ä¤¤¤Ç¤Ë
insert() ¤Ç¡¢text[pos] ¤Î°ÌÃÖ¤ò¥Ï¥Ã¥·¥åÇÛÎó¤ËµÏ¿¤·¡¢¼¡²ó¤Î¸¡º÷¤ËÈ÷¤¨
-¤ì¤³¤È¤â¤·¤Æ¤¤¤ë¡£
+¤ë¤³¤È¤â¤·¤Æ¤¤¤ë¡£
¤Ç¤Ï¡¢ÉÔÌÀ¤ÊÉôʬ¤Ï¤Ê¤ó¤À¤Ã¤¿¤«¤È¤¤¤¦¤È too_flag[] ¤Þ¤ï¤ê¤Ç¤¢¤ë¡£
too_flag ¤Î¥Õ¥é¥°¤¬Î©¤Ã¤Æ¤¤¤ë¤È¡£¼½ñ¸¡º÷¤ÎÍê¤ê¤È¤Ê¤ë¥Ï¥Ã¥·¥åÃͤòÊѹ¹
¤á¤ë»ö¤Ë¤Ê¤ë¤«¤È¸À¤¦¤È 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 ¤Î°ÕÌ£¤ÏºÇÄã¸Â°ìÃפ·¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤Ê¸»úÎó
¤µ¤Æ¡¢¤³¤ì¤Ç°ìÄ̤ê¤Î²òÀϤϺѤó¤À¤ï¤±¤À¤¬¡¢¤³¤³¤Þ¤Ç¤Î²òÀÏÆâÍƤòÆɤßľ¤·
¤Æ¤ß¤ë¤È¡¢°Ê²¼¤ÎÅÀ¤¬¤Þ¤À¤Ò¤Ã¤«¤«¤ë¡£
-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