#include "bzlib_private.h"Go to the source code of this file.
Defines | |
| #define | WEIGHTOF(zz0) ((zz0) & 0xffffff00) |
| #define | DEPTHOF(zz1) ((zz1) & 0x000000ff) |
| #define | MYMAX(zz2, zz3) ((zz2) > (zz3) ? (zz2) : (zz3)) |
| #define | ADDWEIGHTS(zw1, zw2) |
| #define | UPHEAP(z) |
| #define | DOWNHEAP(z) |
Functions | |
| void | hbMakeCodeLengths (UChar *len, Int32 *freq, Int32 alphaSize, Int32 maxLen) |
| void | hbAssignCodes (Int32 *code, UChar *length, Int32 minLen, Int32 maxLen, Int32 alphaSize) |
| void | hbCreateDecodeTables (Int32 *limit, Int32 *base, Int32 *perm, UChar *length, Int32 minLen, Int32 maxLen, Int32 alphaSize) |
|
|
Value: Definition at line 69 of file huffman.c. Referenced by hbMakeCodeLengths().
|
|
|
|
|
|
Value: { \
Int32 zz, yy, tmp; \
zz = z; tmp = heap[zz]; \
while (True) { \
yy = zz << 1; \
if (yy > nHeap) break; \
if (yy < nHeap && \
weight[heap[yy+1]] < weight[heap[yy]]) \
yy++; \
if (weight[tmp] < weight[heap[yy]]) break; \
heap[zz] = heap[yy]; \
zz = yy; \
} \
heap[zz] = tmp; \
}Definition at line 84 of file huffman.c. Referenced by hbMakeCodeLengths().
|
|
|
|
|
|
Value: { \
Int32 zz, tmp; \
zz = z; tmp = heap[zz]; \
while (weight[tmp] < weight[heap[zz >> 1]]) { \
heap[zz] = heap[zz >> 1]; \
zz >>= 1; \
} \
heap[zz] = tmp; \
}Definition at line 73 of file huffman.c. Referenced by hbMakeCodeLengths().
|
|
|
|
|
||||||||||||||||||||||||
|
Definition at line 175 of file huffman.c. Referenced by sendMTFValues().
00180 {
00181 Int32 n, vec, i;
00182
00183 vec = 0;
00184 for (n = minLen; n <= maxLen; n++) {
00185 for (i = 0; i < alphaSize; i++)
00186 if (length[i] == n) { code[i] = vec; vec++; };
00187 vec <<= 1;
00188 }
00189 }
|
|
||||||||||||||||||||||||||||||||
|
Definition at line 193 of file huffman.c. Referenced by decompress().
00200 {
00201 Int32 pp, i, j, vec;
00202
00203 pp = 0;
00204 for (i = minLen; i <= maxLen; i++)
00205 for (j = 0; j < alphaSize; j++)
00206 if (length[j] == i) { perm[pp] = j; pp++; };
00207
00208 for (i = 0; i < BZ_MAX_CODE_LEN; i++) base[i] = 0;
00209 for (i = 0; i < alphaSize; i++) base[length[i]+1]++;
00210
00211 for (i = 1; i < BZ_MAX_CODE_LEN; i++) base[i] += base[i-1];
00212
00213 for (i = 0; i < BZ_MAX_CODE_LEN; i++) limit[i] = 0;
00214 vec = 0;
00215
00216 for (i = minLen; i <= maxLen; i++) {
00217 vec += (base[i+1] - base[i]);
00218 limit[i] = vec-1;
00219 vec <<= 1;
00220 }
00221 for (i = minLen + 1; i <= maxLen; i++)
00222 base[i] = ((limit[i-1] + 1) << 1) - base[i];
00223 }
|
|
||||||||||||||||||||
|
Definition at line 103 of file huffman.c. Referenced by sendMTFValues().
00107 {
00108 /*--
00109 Nodes and heap entries run from 1. Entry 0
00110 for both the heap and nodes is a sentinel.
00111 --*/
00112 Int32 nNodes, nHeap, n1, n2, i, j, k;
00113 Bool tooLong;
00114
00115 Int32 heap [ BZ_MAX_ALPHA_SIZE + 2 ];
00116 Int32 weight [ BZ_MAX_ALPHA_SIZE * 2 ];
00117 Int32 parent [ BZ_MAX_ALPHA_SIZE * 2 ];
00118
00119 for (i = 0; i < alphaSize; i++)
00120 weight[i+1] = (freq[i] == 0 ? 1 : freq[i]) << 8;
00121
00122 while (True) {
00123
00124 nNodes = alphaSize;
00125 nHeap = 0;
00126
00127 heap[0] = 0;
00128 weight[0] = 0;
00129 parent[0] = -2;
00130
00131 for (i = 1; i <= alphaSize; i++) {
00132 parent[i] = -1;
00133 nHeap++;
00134 heap[nHeap] = i;
00135 UPHEAP(nHeap);
00136 }
00137
00138 AssertH( nHeap < (BZ_MAX_ALPHA_SIZE+2), 2001 );
00139
00140 while (nHeap > 1) {
00141 n1 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1);
00142 n2 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1);
00143 nNodes++;
00144 parent[n1] = parent[n2] = nNodes;
00145 weight[nNodes] = ADDWEIGHTS(weight[n1], weight[n2]);
00146 parent[nNodes] = -1;
00147 nHeap++;
00148 heap[nHeap] = nNodes;
00149 UPHEAP(nHeap);
00150 }
00151
00152 AssertH( nNodes < (BZ_MAX_ALPHA_SIZE * 2), 2002 );
00153
00154 tooLong = False;
00155 for (i = 1; i <= alphaSize; i++) {
00156 j = 0;
00157 k = i;
00158 while (parent[k] >= 0) { k = parent[k]; j++; }
00159 len[i-1] = j;
00160 if (j > maxLen) tooLong = True;
00161 }
00162
00163 if (! tooLong) break;
00164
00165 for (i = 1; i < alphaSize; i++) {
00166 j = weight[i] >> 8;
00167 j = 1 + (j / 2);
00168 weight[i] = j << 8;
00169 }
00170 }
00171 }
|
1.2.11.1 written by Dimitri van Heesch,
© 1997-2001