home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1997 December
/
VPR9712A.ISO
/
OLS
/
OS2
/
LHA2P205
/
LHA2P205.LZH
/
lha2-2.05pre
/
source.lzh
/
src
/
maketbl.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-10-23
|
2KB
|
107 lines
/*
* maketbl.c --- makes decoding table
* Copyright (C) 1988-1992, Haruyasu YOSHIZAKI
*
* $Log$
*/
#include <sys/types.h>
#include <stdio.h>
#include <limits.h>
#include "typedef.h"
#include "slidehuf.h"
#include "intrface.h"
#include "errmes.h"
void
make_table(short nchar, uchar bitlen[], short tablebits, ushort table[])
{
ushort count[17]; /* コード長ごとの出現個数 */
ushort weight[17]; /* 0x10000ul >> bitlen */
ushort start[17]; /* その bitlen の最初のコード(左詰め) */
ushort total;
uint i;
int j, k, l, m, n, avail;
ushort *p;
avail = nchar;
/* 初期化 */
for(i = 1; i <= 16; i++)
{
count[i] = 0;
weight[i] = 1u << (16 - i);
}
/* 出現回数を数える */
for(i = 0; i < nchar; i++)
count[bitlen[i]]++;
/* 最初のコードの計算 */
total = 0;
for(i = 1; i <= 16; i++)
{
start[i] = total;
total += weight[i] * count[i];
}
if((total & 0xffff) != 0)
error(BROKENARC, "Bad table (5)");
/* table 作成のため、table に入る部分を右詰めに変更 */
m = 16 - tablebits;
for(i = 1; i <= tablebits; i++)
{
start[i] >>= m;
weight[i] >>= m;
}
/* table を溢れるコードのための初期化 */
j = start[tablebits + 1] >> m;
k = 1 << tablebits;
if(j != 0)
for(i = j; i < k; i++)
table[i] = 0;
/* table, tree の作成 */
for(j = 0; j < nchar; j++)
{
k = bitlen[j];
if(k == 0)
continue;
l = start[k] + weight[k];
if(k <= tablebits)
{
/* table に納まるコード */
for(i = start[k]; i < l; i++)
table[i] = j;
}
else
{
/* table に納まらないコード */
p = &table[(i = start[k]) >> m];
i <<= tablebits;
n = k - tablebits;
/* 高さ n の tree を作る */
while(--n >= 0)
{
if(*p == 0)
{
/* 枝がまだ延びていなければ作る */
right[avail] = left[avail] = 0;
*p = avail++;
}
if(i & 0x8000)
p = &right[*p];
else
p = &left[*p];
i <<= 1;
}
*p = j;
}
/* bitlen が k の次の文字のコード */
start[k] = l;
}
}