diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-04-10 17:16:33 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-04-10 17:16:33 +0000 |
commit | b38cf3ff8a31b2b35d6bcfb1513d568d1977bcba (patch) | |
tree | 16da2cd8c469815f4506b59c73b3668b694ea316 | |
parent | a9d7d24e1f524bb7528aa881265fe8f826023751 (diff) | |
download | busybox-w32-b38cf3ff8a31b2b35d6bcfb1513d568d1977bcba.tar.gz busybox-w32-b38cf3ff8a31b2b35d6bcfb1513d568d1977bcba.tar.bz2 busybox-w32-b38cf3ff8a31b2b35d6bcfb1513d568d1977bcba.zip |
bunzip2: big style cleanup. No code changes apart from one s/write/safe_write/
(verified with objdump).
-rw-r--r-- | archival/libunarchive/decompress_bunzip2.c | 398 |
1 files changed, 208 insertions, 190 deletions
diff --git a/archival/libunarchive/decompress_bunzip2.c b/archival/libunarchive/decompress_bunzip2.c index dd2e1ddcb..75d225bee 100644 --- a/archival/libunarchive/decompress_bunzip2.c +++ b/archival/libunarchive/decompress_bunzip2.c | |||
@@ -55,7 +55,7 @@ | |||
55 | /* This is what we know about each Huffman coding group */ | 55 | /* This is what we know about each Huffman coding group */ |
56 | struct group_data { | 56 | struct group_data { |
57 | /* We have an extra slot at the end of limit[] for a sentinal value. */ | 57 | /* We have an extra slot at the end of limit[] for a sentinal value. */ |
58 | int limit[MAX_HUFCODE_BITS+1],base[MAX_HUFCODE_BITS],permute[MAX_SYMBOLS]; | 58 | int limit[MAX_HUFCODE_BITS+1], base[MAX_HUFCODE_BITS], permute[MAX_SYMBOLS]; |
59 | int minLen, maxLen; | 59 | int minLen, maxLen; |
60 | }; | 60 | }; |
61 | 61 | ||
@@ -65,13 +65,13 @@ struct group_data { | |||
65 | typedef struct { | 65 | typedef struct { |
66 | /* State for interrupting output loop */ | 66 | /* State for interrupting output loop */ |
67 | 67 | ||
68 | int writeCopies,writePos,writeRunCountdown,writeCount,writeCurrent; | 68 | int writeCopies, writePos, writeRunCountdown, writeCount, writeCurrent; |
69 | 69 | ||
70 | /* I/O tracking data (file handles, buffers, positions, etc.) */ | 70 | /* I/O tracking data (file handles, buffers, positions, etc.) */ |
71 | 71 | ||
72 | int in_fd,out_fd,inbufCount,inbufPos /*,outbufPos*/; | 72 | int in_fd, out_fd, inbufCount, inbufPos /*, outbufPos*/; |
73 | unsigned char *inbuf /*,*outbuf*/; | 73 | unsigned char *inbuf /*,*outbuf*/; |
74 | unsigned int inbufBitCount, inbufBits; | 74 | unsigned inbufBitCount, inbufBits; |
75 | 75 | ||
76 | /* The CRC values stored in the block header and calculated from the data */ | 76 | /* The CRC values stored in the block header and calculated from the data */ |
77 | 77 | ||
@@ -79,7 +79,7 @@ typedef struct { | |||
79 | uint32_t *crc32Table; | 79 | uint32_t *crc32Table; |
80 | /* Intermediate buffer and its size (in bytes) */ | 80 | /* Intermediate buffer and its size (in bytes) */ |
81 | 81 | ||
82 | unsigned int *dbuf, dbufSize; | 82 | unsigned *dbuf, dbufSize; |
83 | 83 | ||
84 | /* These things are a bit too big to go on the stack */ | 84 | /* These things are a bit too big to go on the stack */ |
85 | 85 | ||
@@ -94,42 +94,43 @@ typedef struct { | |||
94 | /* Return the next nnn bits of input. All reads from the compressed input | 94 | /* Return the next nnn bits of input. All reads from the compressed input |
95 | are done through this function. All reads are big endian */ | 95 | are done through this function. All reads are big endian */ |
96 | 96 | ||
97 | static unsigned int get_bits(bunzip_data *bd, char bits_wanted) | 97 | static unsigned get_bits(bunzip_data *bd, char bits_wanted) |
98 | { | 98 | { |
99 | unsigned int bits=0; | 99 | unsigned bits = 0; |
100 | 100 | ||
101 | /* If we need to get more data from the byte buffer, do so. (Loop getting | 101 | /* If we need to get more data from the byte buffer, do so. (Loop getting |
102 | one byte at a time to enforce endianness and avoid unaligned access.) */ | 102 | one byte at a time to enforce endianness and avoid unaligned access.) */ |
103 | 103 | ||
104 | while (bd->inbufBitCount<bits_wanted) { | 104 | while (bd->inbufBitCount < bits_wanted) { |
105 | 105 | ||
106 | /* If we need to read more data from file into byte buffer, do so */ | 106 | /* If we need to read more data from file into byte buffer, do so */ |
107 | 107 | ||
108 | if(bd->inbufPos==bd->inbufCount) { | 108 | if (bd->inbufPos == bd->inbufCount) { |
109 | if((bd->inbufCount = read(bd->in_fd, bd->inbuf, IOBUF_SIZE)) <= 0) | 109 | bd->inbufCount = read(bd->in_fd, bd->inbuf, IOBUF_SIZE); |
110 | longjmp(bd->jmpbuf,RETVAL_UNEXPECTED_INPUT_EOF); | 110 | if (bd->inbufCount <= 0) |
111 | bd->inbufPos=0; | 111 | longjmp(bd->jmpbuf, RETVAL_UNEXPECTED_INPUT_EOF); |
112 | bd->inbufPos = 0; | ||
112 | } | 113 | } |
113 | 114 | ||
114 | /* Avoid 32-bit overflow (dump bit buffer to top of output) */ | 115 | /* Avoid 32-bit overflow (dump bit buffer to top of output) */ |
115 | 116 | ||
116 | if(bd->inbufBitCount>=24) { | 117 | if (bd->inbufBitCount >= 24) { |
117 | bits=bd->inbufBits&((1<<bd->inbufBitCount)-1); | 118 | bits = bd->inbufBits & ((1 << bd->inbufBitCount) - 1); |
118 | bits_wanted-=bd->inbufBitCount; | 119 | bits_wanted -= bd->inbufBitCount; |
119 | bits<<=bits_wanted; | 120 | bits <<= bits_wanted; |
120 | bd->inbufBitCount=0; | 121 | bd->inbufBitCount = 0; |
121 | } | 122 | } |
122 | 123 | ||
123 | /* Grab next 8 bits of input from buffer. */ | 124 | /* Grab next 8 bits of input from buffer. */ |
124 | 125 | ||
125 | bd->inbufBits=(bd->inbufBits<<8)|bd->inbuf[bd->inbufPos++]; | 126 | bd->inbufBits = (bd->inbufBits<<8) | bd->inbuf[bd->inbufPos++]; |
126 | bd->inbufBitCount+=8; | 127 | bd->inbufBitCount += 8; |
127 | } | 128 | } |
128 | 129 | ||
129 | /* Calculate result */ | 130 | /* Calculate result */ |
130 | 131 | ||
131 | bd->inbufBitCount-=bits_wanted; | 132 | bd->inbufBitCount -= bits_wanted; |
132 | bits|=(bd->inbufBits>>bd->inbufBitCount)&((1<<bits_wanted)-1); | 133 | bits |= (bd->inbufBits >> bd->inbufBitCount) & ((1 << bits_wanted) - 1); |
133 | 134 | ||
134 | return bits; | 135 | return bits; |
135 | } | 136 | } |
@@ -139,26 +140,26 @@ static unsigned int get_bits(bunzip_data *bd, char bits_wanted) | |||
139 | static int get_next_block(bunzip_data *bd) | 140 | static int get_next_block(bunzip_data *bd) |
140 | { | 141 | { |
141 | struct group_data *hufGroup; | 142 | struct group_data *hufGroup; |
142 | int dbufCount,nextSym,dbufSize,groupCount,*base,*limit,selector, | 143 | int dbufCount, nextSym, dbufSize, groupCount, *base, *limit, selector, |
143 | i,j,k,t,runPos,symCount,symTotal,nSelectors,byteCount[256]; | 144 | i, j, k, t, runPos, symCount, symTotal, nSelectors, byteCount[256]; |
144 | unsigned char uc, symToByte[256], mtfSymbol[256], *selectors; | 145 | unsigned char uc, symToByte[256], mtfSymbol[256], *selectors; |
145 | unsigned int *dbuf,origPtr; | 146 | unsigned *dbuf, origPtr; |
146 | 147 | ||
147 | dbuf=bd->dbuf; | 148 | dbuf = bd->dbuf; |
148 | dbufSize=bd->dbufSize; | 149 | dbufSize = bd->dbufSize; |
149 | selectors=bd->selectors; | 150 | selectors = bd->selectors; |
150 | 151 | ||
151 | /* Reset longjmp I/O error handling */ | 152 | /* Reset longjmp I/O error handling */ |
152 | 153 | ||
153 | i=setjmp(bd->jmpbuf); | 154 | i = setjmp(bd->jmpbuf); |
154 | if (i) return i; | 155 | if (i) return i; |
155 | 156 | ||
156 | /* Read in header signature and CRC, then validate signature. | 157 | /* Read in header signature and CRC, then validate signature. |
157 | (last block signature means CRC is for whole file, return now) */ | 158 | (last block signature means CRC is for whole file, return now) */ |
158 | 159 | ||
159 | i = get_bits(bd,24); | 160 | i = get_bits(bd, 24); |
160 | j = get_bits(bd,24); | 161 | j = get_bits(bd, 24); |
161 | bd->headerCRC=get_bits(bd,32); | 162 | bd->headerCRC = get_bits(bd, 32); |
162 | if ((i == 0x177245) && (j == 0x385090)) return RETVAL_LAST_BLOCK; | 163 | if ((i == 0x177245) && (j == 0x385090)) return RETVAL_LAST_BLOCK; |
163 | if ((i != 0x314159) || (j != 0x265359)) return RETVAL_NOT_BZIP_DATA; | 164 | if ((i != 0x314159) || (j != 0x265359)) return RETVAL_NOT_BZIP_DATA; |
164 | 165 | ||
@@ -166,8 +167,9 @@ static int get_next_block(bunzip_data *bd) | |||
166 | some code for this in busybox 1.0.0-pre3, but nobody ever noticed that | 167 | some code for this in busybox 1.0.0-pre3, but nobody ever noticed that |
167 | it didn't actually work. */ | 168 | it didn't actually work. */ |
168 | 169 | ||
169 | if (get_bits(bd,1)) return RETVAL_OBSOLETE_INPUT; | 170 | if (get_bits(bd, 1)) return RETVAL_OBSOLETE_INPUT; |
170 | if ((origPtr=get_bits(bd,24)) > dbufSize) return RETVAL_DATA_ERROR; | 171 | origPtr = get_bits(bd, 24); |
172 | if (origPtr > dbufSize) return RETVAL_DATA_ERROR; | ||
171 | 173 | ||
172 | /* mapping table: if some byte values are never used (encoding things | 174 | /* mapping table: if some byte values are never used (encoding things |
173 | like ascii text), the compression code removes the gaps to have fewer | 175 | like ascii text), the compression code removes the gaps to have fewer |
@@ -175,48 +177,52 @@ static int get_next_block(bunzip_data *bd) | |||
175 | values were present. We make a translation table to convert the symbols | 177 | values were present. We make a translation table to convert the symbols |
176 | back to the corresponding bytes. */ | 178 | back to the corresponding bytes. */ |
177 | 179 | ||
178 | t=get_bits(bd, 16); | 180 | t = get_bits(bd, 16); |
179 | symTotal=0; | 181 | symTotal = 0; |
180 | for (i=0;i<16;i++) { | 182 | for (i = 0; i < 16; i++) { |
181 | if(t&(1<<(15-i))) { | 183 | if (t & (1 << (15-i))) { |
182 | k=get_bits(bd,16); | 184 | k = get_bits(bd, 16); |
183 | for (j=0;j<16;j++) | 185 | for (j = 0; j < 16; j++) |
184 | if(k&(1<<(15-j))) symToByte[symTotal++]=(16*i)+j; | 186 | if (k & (1 << (15-j))) |
187 | symToByte[symTotal++] = (16*i) + j; | ||
185 | } | 188 | } |
186 | } | 189 | } |
187 | 190 | ||
188 | /* How many different Huffman coding groups does this block use? */ | 191 | /* How many different Huffman coding groups does this block use? */ |
189 | 192 | ||
190 | groupCount=get_bits(bd,3); | 193 | groupCount = get_bits(bd, 3); |
191 | if (groupCount<2 || groupCount>MAX_GROUPS) return RETVAL_DATA_ERROR; | 194 | if (groupCount < 2 || groupCount > MAX_GROUPS) |
195 | return RETVAL_DATA_ERROR; | ||
192 | 196 | ||
193 | /* nSelectors: Every GROUP_SIZE many symbols we select a new Huffman coding | 197 | /* nSelectors: Every GROUP_SIZE many symbols we select a new Huffman coding |
194 | group. Read in the group selector list, which is stored as MTF encoded | 198 | group. Read in the group selector list, which is stored as MTF encoded |
195 | bit runs. (MTF=Move To Front, as each value is used it's moved to the | 199 | bit runs. (MTF=Move To Front, as each value is used it's moved to the |
196 | start of the list.) */ | 200 | start of the list.) */ |
197 | 201 | ||
198 | if(!(nSelectors=get_bits(bd, 15))) return RETVAL_DATA_ERROR; | 202 | nSelectors = get_bits(bd, 15); |
199 | for (i=0; i<groupCount; i++) mtfSymbol[i] = i; | 203 | if (!nSelectors) return RETVAL_DATA_ERROR; |
200 | for (i=0; i<nSelectors; i++) { | 204 | for (i = 0; i < groupCount; i++) mtfSymbol[i] = i; |
205 | for (i = 0; i < nSelectors; i++) { | ||
201 | 206 | ||
202 | /* Get next value */ | 207 | /* Get next value */ |
203 | 208 | ||
204 | for (j=0;get_bits(bd,1);j++) if (j>=groupCount) return RETVAL_DATA_ERROR; | 209 | for (j = 0; get_bits(bd, 1); j++) |
210 | if (j>=groupCount) return RETVAL_DATA_ERROR; | ||
205 | 211 | ||
206 | /* Decode MTF to get the next selector */ | 212 | /* Decode MTF to get the next selector */ |
207 | 213 | ||
208 | uc = mtfSymbol[j]; | 214 | uc = mtfSymbol[j]; |
209 | for (;j;j--) mtfSymbol[j] = mtfSymbol[j-1]; | 215 | for (;j;j--) mtfSymbol[j] = mtfSymbol[j-1]; |
210 | mtfSymbol[0]=selectors[i]=uc; | 216 | mtfSymbol[0] = selectors[i] = uc; |
211 | } | 217 | } |
212 | 218 | ||
213 | /* Read the Huffman coding tables for each group, which code for symTotal | 219 | /* Read the Huffman coding tables for each group, which code for symTotal |
214 | literal symbols, plus two run symbols (RUNA, RUNB) */ | 220 | literal symbols, plus two run symbols (RUNA, RUNB) */ |
215 | 221 | ||
216 | symCount=symTotal+2; | 222 | symCount = symTotal + 2; |
217 | for (j=0; j<groupCount; j++) { | 223 | for (j = 0; j < groupCount; j++) { |
218 | unsigned char length[MAX_SYMBOLS],temp[MAX_HUFCODE_BITS+1]; | 224 | unsigned char length[MAX_SYMBOLS], temp[MAX_HUFCODE_BITS+1]; |
219 | int minLen, maxLen, pp; | 225 | int minLen, maxLen, pp; |
220 | 226 | ||
221 | /* Read Huffman code lengths for each symbol. They're stored in | 227 | /* Read Huffman code lengths for each symbol. They're stored in |
222 | a way similar to mtf; record a starting value for the first symbol, | 228 | a way similar to mtf; record a starting value for the first symbol, |
@@ -225,17 +231,17 @@ static int get_next_block(bunzip_data *bd) | |||
225 | an optimization that makes the test inside the loop simpler: symbol | 231 | an optimization that makes the test inside the loop simpler: symbol |
226 | length 0 becomes negative, so an unsigned inequality catches it.) */ | 232 | length 0 becomes negative, so an unsigned inequality catches it.) */ |
227 | 233 | ||
228 | t=get_bits(bd, 5)-1; | 234 | t = get_bits(bd, 5) - 1; |
229 | for (i = 0; i < symCount; i++) { | 235 | for (i = 0; i < symCount; i++) { |
230 | for (;;) { | 236 | for (;;) { |
231 | if (((unsigned)t) > (MAX_HUFCODE_BITS-1)) | 237 | if ((unsigned)t > (MAX_HUFCODE_BITS-1)) |
232 | return RETVAL_DATA_ERROR; | 238 | return RETVAL_DATA_ERROR; |
233 | 239 | ||
234 | /* If first bit is 0, stop. Else second bit indicates whether | 240 | /* If first bit is 0, stop. Else second bit indicates whether |
235 | to increment or decrement the value. Optimization: grab 2 | 241 | to increment or decrement the value. Optimization: grab 2 |
236 | bits and unget the second if the first was 0. */ | 242 | bits and unget the second if the first was 0. */ |
237 | 243 | ||
238 | k = get_bits(bd,2); | 244 | k = get_bits(bd, 2); |
239 | if (k < 2) { | 245 | if (k < 2) { |
240 | bd->inbufBitCount++; | 246 | bd->inbufBitCount++; |
241 | break; | 247 | break; |
@@ -243,20 +249,20 @@ static int get_next_block(bunzip_data *bd) | |||
243 | 249 | ||
244 | /* Add one if second bit 1, else subtract 1. Avoids if/else */ | 250 | /* Add one if second bit 1, else subtract 1. Avoids if/else */ |
245 | 251 | ||
246 | t+=(((k+1)&2)-1); | 252 | t += (((k+1) & 2) - 1); |
247 | } | 253 | } |
248 | 254 | ||
249 | /* Correct for the initial -1, to get the final symbol length */ | 255 | /* Correct for the initial -1, to get the final symbol length */ |
250 | 256 | ||
251 | length[i]=t+1; | 257 | length[i] = t + 1; |
252 | } | 258 | } |
253 | 259 | ||
254 | /* Find largest and smallest lengths in this group */ | 260 | /* Find largest and smallest lengths in this group */ |
255 | 261 | ||
256 | minLen=maxLen=length[0]; | 262 | minLen = maxLen = length[0]; |
257 | for (i = 1; i < symCount; i++) { | 263 | for (i = 1; i < symCount; i++) { |
258 | if(length[i] > maxLen) maxLen = length[i]; | 264 | if (length[i] > maxLen) maxLen = length[i]; |
259 | else if(length[i] < minLen) minLen = length[i]; | 265 | else if (length[i] < minLen) minLen = length[i]; |
260 | } | 266 | } |
261 | 267 | ||
262 | /* Calculate permute[], base[], and limit[] tables from length[]. | 268 | /* Calculate permute[], base[], and limit[] tables from length[]. |
@@ -270,7 +276,7 @@ static int get_next_block(bunzip_data *bd) | |||
270 | * length: each code with a value>limit[length] needs another bit. | 276 | * length: each code with a value>limit[length] needs another bit. |
271 | */ | 277 | */ |
272 | 278 | ||
273 | hufGroup=bd->groups+j; | 279 | hufGroup = bd->groups + j; |
274 | hufGroup->minLen = minLen; | 280 | hufGroup->minLen = minLen; |
275 | hufGroup->maxLen = maxLen; | 281 | hufGroup->maxLen = maxLen; |
276 | 282 | ||
@@ -278,30 +284,31 @@ static int get_next_block(bunzip_data *bd) | |||
278 | and limit array pointers so we're not always wasting the first | 284 | and limit array pointers so we're not always wasting the first |
279 | entry. We do this again when using them (during symbol decoding).*/ | 285 | entry. We do this again when using them (during symbol decoding).*/ |
280 | 286 | ||
281 | base=hufGroup->base-1; | 287 | base = hufGroup->base - 1; |
282 | limit=hufGroup->limit-1; | 288 | limit = hufGroup->limit - 1; |
283 | 289 | ||
284 | /* Calculate permute[]. Concurently, initialize temp[] and limit[]. */ | 290 | /* Calculate permute[]. Concurently, initialize temp[] and limit[]. */ |
285 | 291 | ||
286 | pp=0; | 292 | pp = 0; |
287 | for (i=minLen;i<=maxLen;i++) { | 293 | for (i = minLen; i <= maxLen; i++) { |
288 | temp[i]=limit[i]=0; | 294 | temp[i] = limit[i] = 0; |
289 | for (t=0;t<symCount;t++) | 295 | for (t = 0; t < symCount; t++) |
290 | if(length[t]==i) hufGroup->permute[pp++] = t; | 296 | if (length[t] == i) |
297 | hufGroup->permute[pp++] = t; | ||
291 | } | 298 | } |
292 | 299 | ||
293 | /* Count symbols coded for at each bit length */ | 300 | /* Count symbols coded for at each bit length */ |
294 | 301 | ||
295 | for (i=0;i<symCount;i++) temp[length[i]]++; | 302 | for (i = 0; i < symCount; i++) temp[length[i]]++; |
296 | 303 | ||
297 | /* Calculate limit[] (the largest symbol-coding value at each bit | 304 | /* Calculate limit[] (the largest symbol-coding value at each bit |
298 | * length, which is (previous limit<<1)+symbols at this level), and | 305 | * length, which is (previous limit<<1)+symbols at this level), and |
299 | * base[] (number of symbols to ignore at each bit length, which is | 306 | * base[] (number of symbols to ignore at each bit length, which is |
300 | * limit minus the cumulative count of symbols coded for already). */ | 307 | * limit minus the cumulative count of symbols coded for already). */ |
301 | 308 | ||
302 | pp=t=0; | 309 | pp = t = 0; |
303 | for (i=minLen; i<maxLen; i++) { | 310 | for (i = minLen; i < maxLen; i++) { |
304 | pp+=temp[i]; | 311 | pp += temp[i]; |
305 | 312 | ||
306 | /* We read the largest possible symbol size and then unget bits | 313 | /* We read the largest possible symbol size and then unget bits |
307 | after determining how many we need, and those extra bits could | 314 | after determining how many we need, and those extra bits could |
@@ -310,13 +317,14 @@ static int get_next_block(bunzip_data *bd) | |||
310 | so here we set all the trailing to-be-ignored bits to 1 so they | 317 | so here we set all the trailing to-be-ignored bits to 1 so they |
311 | don't affect the value>limit[length] comparison. */ | 318 | don't affect the value>limit[length] comparison. */ |
312 | 319 | ||
313 | limit[i]= (pp << (maxLen - i)) - 1; | 320 | limit[i] = (pp << (maxLen - i)) - 1; |
314 | pp<<=1; | 321 | pp <<= 1; |
315 | base[i+1]=pp-(t+=temp[i]); | 322 | t += temp[i]; |
323 | base[i+1] = pp - t; | ||
316 | } | 324 | } |
317 | limit[maxLen+1] = INT_MAX; /* Sentinal value for reading next sym. */ | 325 | limit[maxLen+1] = INT_MAX; /* Sentinal value for reading next sym. */ |
318 | limit[maxLen]=pp+temp[maxLen]-1; | 326 | limit[maxLen] = pp + temp[maxLen] - 1; |
319 | base[minLen]=0; | 327 | base[minLen] = 0; |
320 | } | 328 | } |
321 | 329 | ||
322 | /* We've finished reading and digesting the block header. Now read this | 330 | /* We've finished reading and digesting the block header. Now read this |
@@ -325,24 +333,24 @@ static int get_next_block(bunzip_data *bd) | |||
325 | 333 | ||
326 | /* Initialize symbol occurrence counters and symbol Move To Front table */ | 334 | /* Initialize symbol occurrence counters and symbol Move To Front table */ |
327 | 335 | ||
328 | for (i=0;i<256;i++) { | 336 | for (i = 0; i < 256; i++) { |
329 | byteCount[i] = 0; | 337 | byteCount[i] = 0; |
330 | mtfSymbol[i]=(unsigned char)i; | 338 | mtfSymbol[i] = (unsigned char)i; |
331 | } | 339 | } |
332 | 340 | ||
333 | /* Loop through compressed symbols. */ | 341 | /* Loop through compressed symbols. */ |
334 | 342 | ||
335 | runPos=dbufCount=selector=0; | 343 | runPos = dbufCount = selector = 0; |
336 | for (;;) { | 344 | for (;;) { |
337 | 345 | ||
338 | /* fetch next Huffman coding group from list. */ | 346 | /* fetch next Huffman coding group from list. */ |
339 | 347 | ||
340 | symCount=GROUP_SIZE-1; | 348 | symCount = GROUP_SIZE - 1; |
341 | if(selector>=nSelectors) return RETVAL_DATA_ERROR; | 349 | if (selector >= nSelectors) return RETVAL_DATA_ERROR; |
342 | hufGroup=bd->groups+selectors[selector++]; | 350 | hufGroup = bd->groups + selectors[selector++]; |
343 | base=hufGroup->base-1; | 351 | base = hufGroup->base - 1; |
344 | limit=hufGroup->limit-1; | 352 | limit = hufGroup->limit - 1; |
345 | continue_this_group: | 353 | continue_this_group: |
346 | 354 | ||
347 | /* Read next Huffman-coded symbol. */ | 355 | /* Read next Huffman-coded symbol. */ |
348 | 356 | ||
@@ -353,33 +361,34 @@ continue_this_group: | |||
353 | valid compressed file. As a further optimization, we do the read | 361 | valid compressed file. As a further optimization, we do the read |
354 | inline (falling back to a call to get_bits if the buffer runs | 362 | inline (falling back to a call to get_bits if the buffer runs |
355 | dry). The following (up to got_huff_bits:) is equivalent to | 363 | dry). The following (up to got_huff_bits:) is equivalent to |
356 | j=get_bits(bd,hufGroup->maxLen); | 364 | j = get_bits(bd, hufGroup->maxLen); |
357 | */ | 365 | */ |
358 | 366 | ||
359 | while (bd->inbufBitCount<hufGroup->maxLen) { | 367 | while (bd->inbufBitCount < hufGroup->maxLen) { |
360 | if(bd->inbufPos==bd->inbufCount) { | 368 | if (bd->inbufPos == bd->inbufCount) { |
361 | j = get_bits(bd,hufGroup->maxLen); | 369 | j = get_bits(bd, hufGroup->maxLen); |
362 | goto got_huff_bits; | 370 | goto got_huff_bits; |
363 | } | 371 | } |
364 | bd->inbufBits=(bd->inbufBits<<8)|bd->inbuf[bd->inbufPos++]; | 372 | bd->inbufBits = (bd->inbufBits << 8) | bd->inbuf[bd->inbufPos++]; |
365 | bd->inbufBitCount+=8; | 373 | bd->inbufBitCount += 8; |
366 | }; | 374 | }; |
367 | bd->inbufBitCount-=hufGroup->maxLen; | 375 | bd->inbufBitCount -= hufGroup->maxLen; |
368 | j = (bd->inbufBits>>bd->inbufBitCount)&((1<<hufGroup->maxLen)-1); | 376 | j = (bd->inbufBits >> bd->inbufBitCount) & ((1 << hufGroup->maxLen) - 1); |
369 | 377 | ||
370 | got_huff_bits: | 378 | got_huff_bits: |
371 | 379 | ||
372 | /* Figure how how many bits are in next symbol and unget extras */ | 380 | /* Figure how how many bits are in next symbol and unget extras */ |
373 | 381 | ||
374 | i=hufGroup->minLen; | 382 | i = hufGroup->minLen; |
375 | while (j>limit[i]) ++i; | 383 | while (j > limit[i]) ++i; |
376 | bd->inbufBitCount += (hufGroup->maxLen - i); | 384 | bd->inbufBitCount += (hufGroup->maxLen - i); |
377 | 385 | ||
378 | /* Huffman decode value to get nextSym (with bounds checking) */ | 386 | /* Huffman decode value to get nextSym (with bounds checking) */ |
379 | 387 | ||
380 | if ((i > hufGroup->maxLen) | 388 | if (i > hufGroup->maxLen) |
381 | || (((unsigned)(j=(j>>(hufGroup->maxLen-i))-base[i])) | 389 | return RETVAL_DATA_ERROR; |
382 | >= MAX_SYMBOLS)) | 390 | j = (j >> (hufGroup->maxLen - i)) - base[i]; |
391 | if ((unsigned)j >= MAX_SYMBOLS) | ||
383 | return RETVAL_DATA_ERROR; | 392 | return RETVAL_DATA_ERROR; |
384 | nextSym = hufGroup->permute[j]; | 393 | nextSym = hufGroup->permute[j]; |
385 | 394 | ||
@@ -388,11 +397,11 @@ got_huff_bits: | |||
388 | check if nextSym indicates a repeated run, and if so loop collecting | 397 | check if nextSym indicates a repeated run, and if so loop collecting |
389 | how many times to repeat the last literal. */ | 398 | how many times to repeat the last literal. */ |
390 | 399 | ||
391 | if (((unsigned)nextSym) <= SYMBOL_RUNB) { /* RUNA or RUNB */ | 400 | if ((unsigned)nextSym <= SYMBOL_RUNB) { /* RUNA or RUNB */ |
392 | 401 | ||
393 | /* If this is the start of a new run, zero out counter */ | 402 | /* If this is the start of a new run, zero out counter */ |
394 | 403 | ||
395 | if(!runPos) { | 404 | if (!runPos) { |
396 | runPos = 1; | 405 | runPos = 1; |
397 | t = 0; | 406 | t = 0; |
398 | } | 407 | } |
@@ -406,7 +415,7 @@ got_huff_bits: | |||
406 | context). Thus space is saved. */ | 415 | context). Thus space is saved. */ |
407 | 416 | ||
408 | t += (runPos << nextSym); /* +runPos if RUNA; +2*runPos if RUNB */ | 417 | t += (runPos << nextSym); /* +runPos if RUNA; +2*runPos if RUNB */ |
409 | if(runPos < dbufSize) runPos <<= 1; | 418 | if (runPos < dbufSize) runPos <<= 1; |
410 | goto end_of_huffman_loop; | 419 | goto end_of_huffman_loop; |
411 | } | 420 | } |
412 | 421 | ||
@@ -415,18 +424,18 @@ got_huff_bits: | |||
415 | copies to our buffer of decoded symbols (dbuf) now. (The last | 424 | copies to our buffer of decoded symbols (dbuf) now. (The last |
416 | literal used is the one at the head of the mtfSymbol array.) */ | 425 | literal used is the one at the head of the mtfSymbol array.) */ |
417 | 426 | ||
418 | if(runPos) { | 427 | if (runPos) { |
419 | runPos=0; | 428 | runPos = 0; |
420 | if(dbufCount+t>=dbufSize) return RETVAL_DATA_ERROR; | 429 | if (dbufCount + t >= dbufSize) return RETVAL_DATA_ERROR; |
421 | 430 | ||
422 | uc = symToByte[mtfSymbol[0]]; | 431 | uc = symToByte[mtfSymbol[0]]; |
423 | byteCount[uc] += t; | 432 | byteCount[uc] += t; |
424 | while (t--) dbuf[dbufCount++]=uc; | 433 | while (t--) dbuf[dbufCount++] = uc; |
425 | } | 434 | } |
426 | 435 | ||
427 | /* Is this the terminating symbol? */ | 436 | /* Is this the terminating symbol? */ |
428 | 437 | ||
429 | if(nextSym>symTotal) break; | 438 | if (nextSym > symTotal) break; |
430 | 439 | ||
431 | /* At this point, nextSym indicates a new literal character. Subtract | 440 | /* At this point, nextSym indicates a new literal character. Subtract |
432 | one to get the position in the MTF array at which this literal is | 441 | one to get the position in the MTF array at which this literal is |
@@ -436,7 +445,7 @@ got_huff_bits: | |||
436 | as part of a run above. Therefore 1 unused mtf position minus | 445 | as part of a run above. Therefore 1 unused mtf position minus |
437 | 2 non-literal nextSym values equals -1.) */ | 446 | 2 non-literal nextSym values equals -1.) */ |
438 | 447 | ||
439 | if(dbufCount>=dbufSize) return RETVAL_DATA_ERROR; | 448 | if (dbufCount >= dbufSize) return RETVAL_DATA_ERROR; |
440 | i = nextSym - 1; | 449 | i = nextSym - 1; |
441 | uc = mtfSymbol[i]; | 450 | uc = mtfSymbol[i]; |
442 | 451 | ||
@@ -449,18 +458,18 @@ got_huff_bits: | |||
449 | mtfSymbol[i] = mtfSymbol[i-1]; | 458 | mtfSymbol[i] = mtfSymbol[i-1]; |
450 | } while (--i); | 459 | } while (--i); |
451 | mtfSymbol[0] = uc; | 460 | mtfSymbol[0] = uc; |
452 | uc=symToByte[uc]; | 461 | uc = symToByte[uc]; |
453 | 462 | ||
454 | /* We have our literal byte. Save it into dbuf. */ | 463 | /* We have our literal byte. Save it into dbuf. */ |
455 | 464 | ||
456 | byteCount[uc]++; | 465 | byteCount[uc]++; |
457 | dbuf[dbufCount++] = (unsigned int)uc; | 466 | dbuf[dbufCount++] = (unsigned)uc; |
458 | 467 | ||
459 | /* Skip group initialization if we're not done with this group. Done | 468 | /* Skip group initialization if we're not done with this group. Done |
460 | * this way to avoid compiler warning. */ | 469 | * this way to avoid compiler warning. */ |
461 | 470 | ||
462 | end_of_huffman_loop: | 471 | end_of_huffman_loop: |
463 | if(symCount--) goto continue_this_group; | 472 | if (symCount--) goto continue_this_group; |
464 | } | 473 | } |
465 | 474 | ||
466 | /* At this point, we've read all the Huffman-coded symbols (and repeated | 475 | /* At this point, we've read all the Huffman-coded symbols (and repeated |
@@ -472,17 +481,17 @@ end_of_huffman_loop: | |||
472 | 481 | ||
473 | /* Turn byteCount into cumulative occurrence counts of 0 to n-1. */ | 482 | /* Turn byteCount into cumulative occurrence counts of 0 to n-1. */ |
474 | 483 | ||
475 | j=0; | 484 | j = 0; |
476 | for (i=0;i<256;i++) { | 485 | for (i = 0; i < 256; i++) { |
477 | k=j+byteCount[i]; | 486 | k = j + byteCount[i]; |
478 | byteCount[i] = j; | 487 | byteCount[i] = j; |
479 | j=k; | 488 | j = k; |
480 | } | 489 | } |
481 | 490 | ||
482 | /* Figure out what order dbuf would be in if we sorted it. */ | 491 | /* Figure out what order dbuf would be in if we sorted it. */ |
483 | 492 | ||
484 | for (i=0;i<dbufCount;i++) { | 493 | for (i = 0; i < dbufCount; i++) { |
485 | uc=(unsigned char)(dbuf[i] & 0xff); | 494 | uc = (unsigned char)(dbuf[i] & 0xff); |
486 | dbuf[byteCount[uc]] |= (i << 8); | 495 | dbuf[byteCount[uc]] |= (i << 8); |
487 | byteCount[uc]++; | 496 | byteCount[uc]++; |
488 | } | 497 | } |
@@ -491,14 +500,14 @@ end_of_huffman_loop: | |||
491 | doesn't get output, and if the first three characters are identical | 500 | doesn't get output, and if the first three characters are identical |
492 | it doesn't qualify as a run (hence writeRunCountdown=5). */ | 501 | it doesn't qualify as a run (hence writeRunCountdown=5). */ |
493 | 502 | ||
494 | if(dbufCount) { | 503 | if (dbufCount) { |
495 | if(origPtr>=dbufCount) return RETVAL_DATA_ERROR; | 504 | if (origPtr >= dbufCount) return RETVAL_DATA_ERROR; |
496 | bd->writePos=dbuf[origPtr]; | 505 | bd->writePos = dbuf[origPtr]; |
497 | bd->writeCurrent=(unsigned char)(bd->writePos&0xff); | 506 | bd->writeCurrent = (unsigned char)(bd->writePos & 0xff); |
498 | bd->writePos>>=8; | 507 | bd->writePos >>= 8; |
499 | bd->writeRunCountdown=5; | 508 | bd->writeRunCountdown = 5; |
500 | } | 509 | } |
501 | bd->writeCount=dbufCount; | 510 | bd->writeCount = dbufCount; |
502 | 511 | ||
503 | return RETVAL_OK; | 512 | return RETVAL_OK; |
504 | } | 513 | } |
@@ -512,16 +521,16 @@ end_of_huffman_loop: | |||
512 | 521 | ||
513 | static int read_bunzip(bunzip_data *bd, char *outbuf, int len) | 522 | static int read_bunzip(bunzip_data *bd, char *outbuf, int len) |
514 | { | 523 | { |
515 | const unsigned int *dbuf; | 524 | const unsigned *dbuf; |
516 | int pos,current,previous,gotcount; | 525 | int pos, current, previous, gotcount; |
517 | 526 | ||
518 | /* If last read was short due to end of file, return last block now */ | 527 | /* If last read was short due to end of file, return last block now */ |
519 | if(bd->writeCount<0) return bd->writeCount; | 528 | if (bd->writeCount < 0) return bd->writeCount; |
520 | 529 | ||
521 | gotcount = 0; | 530 | gotcount = 0; |
522 | dbuf=bd->dbuf; | 531 | dbuf = bd->dbuf; |
523 | pos=bd->writePos; | 532 | pos = bd->writePos; |
524 | current=bd->writeCurrent; | 533 | current = bd->writeCurrent; |
525 | 534 | ||
526 | /* We will always have pending decoded data to write into the output | 535 | /* We will always have pending decoded data to write into the output |
527 | buffer unless this is the very first call (in which case we haven't | 536 | buffer unless this is the very first call (in which case we haven't |
@@ -539,9 +548,9 @@ static int read_bunzip(bunzip_data *bd, char *outbuf, int len) | |||
539 | 548 | ||
540 | /* If the output buffer is full, snapshot state and return */ | 549 | /* If the output buffer is full, snapshot state and return */ |
541 | 550 | ||
542 | if(gotcount >= len) { | 551 | if (gotcount >= len) { |
543 | bd->writePos=pos; | 552 | bd->writePos =pos; |
544 | bd->writeCurrent=current; | 553 | bd->writeCurrent = current; |
545 | bd->writeCopies++; | 554 | bd->writeCopies++; |
546 | return len; | 555 | return len; |
547 | } | 556 | } |
@@ -549,8 +558,8 @@ static int read_bunzip(bunzip_data *bd, char *outbuf, int len) | |||
549 | /* Write next byte into output buffer, updating CRC */ | 558 | /* Write next byte into output buffer, updating CRC */ |
550 | 559 | ||
551 | outbuf[gotcount++] = current; | 560 | outbuf[gotcount++] = current; |
552 | bd->writeCRC=(((bd->writeCRC)<<8) | 561 | bd->writeCRC = (bd->writeCRC << 8) |
553 | ^bd->crc32Table[((bd->writeCRC)>>24)^current]); | 562 | ^ bd->crc32Table[(bd->writeCRC >> 24) ^ current]; |
554 | 563 | ||
555 | /* Loop now if we're outputting multiple copies of this byte */ | 564 | /* Loop now if we're outputting multiple copies of this byte */ |
556 | 565 | ||
@@ -558,31 +567,32 @@ static int read_bunzip(bunzip_data *bd, char *outbuf, int len) | |||
558 | --bd->writeCopies; | 567 | --bd->writeCopies; |
559 | continue; | 568 | continue; |
560 | } | 569 | } |
561 | decode_next_byte: | 570 | decode_next_byte: |
562 | if (!bd->writeCount--) break; | 571 | if (!bd->writeCount--) break; |
563 | /* Follow sequence vector to undo Burrows-Wheeler transform */ | 572 | /* Follow sequence vector to undo Burrows-Wheeler transform */ |
564 | previous=current; | 573 | previous = current; |
565 | pos=dbuf[pos]; | 574 | pos = dbuf[pos]; |
566 | current=pos&0xff; | 575 | current = pos & 0xff; |
567 | pos>>=8; | 576 | pos >>= 8; |
568 | 577 | ||
569 | /* After 3 consecutive copies of the same byte, the 4th is a repeat | 578 | /* After 3 consecutive copies of the same byte, the 4th is a repeat |
570 | count. We count down from 4 instead | 579 | count. We count down from 4 instead |
571 | * of counting up because testing for non-zero is faster */ | 580 | * of counting up because testing for non-zero is faster */ |
572 | 581 | ||
573 | if(--bd->writeRunCountdown) { | 582 | if (--bd->writeRunCountdown) { |
574 | if(current!=previous) bd->writeRunCountdown=4; | 583 | if (current != previous) |
584 | bd->writeRunCountdown = 4; | ||
575 | } else { | 585 | } else { |
576 | 586 | ||
577 | /* We have a repeated run, this byte indicates the count */ | 587 | /* We have a repeated run, this byte indicates the count */ |
578 | 588 | ||
579 | bd->writeCopies=current; | 589 | bd->writeCopies = current; |
580 | current=previous; | 590 | current = previous; |
581 | bd->writeRunCountdown=5; | 591 | bd->writeRunCountdown = 5; |
582 | 592 | ||
583 | /* Sometimes there are just 3 bytes (run length 0) */ | 593 | /* Sometimes there are just 3 bytes (run length 0) */ |
584 | 594 | ||
585 | if(!bd->writeCopies) goto decode_next_byte; | 595 | if (!bd->writeCopies) goto decode_next_byte; |
586 | 596 | ||
587 | /* Subtract the 1 copy we'd output anyway to get extras */ | 597 | /* Subtract the 1 copy we'd output anyway to get extras */ |
588 | 598 | ||
@@ -592,13 +602,13 @@ decode_next_byte: | |||
592 | 602 | ||
593 | /* Decompression of this block completed successfully */ | 603 | /* Decompression of this block completed successfully */ |
594 | 604 | ||
595 | bd->writeCRC=~bd->writeCRC; | 605 | bd->writeCRC = ~bd->writeCRC; |
596 | bd->totalCRC=((bd->totalCRC<<1) | (bd->totalCRC>>31)) ^ bd->writeCRC; | 606 | bd->totalCRC = ((bd->totalCRC << 1) | (bd->totalCRC >> 31)) ^ bd->writeCRC; |
597 | 607 | ||
598 | /* If this block had a CRC error, force file level CRC error. */ | 608 | /* If this block had a CRC error, force file level CRC error. */ |
599 | 609 | ||
600 | if(bd->writeCRC!=bd->headerCRC) { | 610 | if (bd->writeCRC != bd->headerCRC) { |
601 | bd->totalCRC=bd->headerCRC+1; | 611 | bd->totalCRC = bd->headerCRC+1; |
602 | return RETVAL_LAST_BLOCK; | 612 | return RETVAL_LAST_BLOCK; |
603 | } | 613 | } |
604 | } | 614 | } |
@@ -606,14 +616,14 @@ decode_next_byte: | |||
606 | /* Refill the intermediate buffer by Huffman-decoding next block of input */ | 616 | /* Refill the intermediate buffer by Huffman-decoding next block of input */ |
607 | /* (previous is just a convenient unused temp variable here) */ | 617 | /* (previous is just a convenient unused temp variable here) */ |
608 | 618 | ||
609 | previous=get_next_block(bd); | 619 | previous = get_next_block(bd); |
610 | if(previous) { | 620 | if (previous) { |
611 | bd->writeCount=previous; | 621 | bd->writeCount = previous; |
612 | return (previous!=RETVAL_LAST_BLOCK) ? previous : gotcount; | 622 | return (previous != RETVAL_LAST_BLOCK) ? previous : gotcount; |
613 | } | 623 | } |
614 | bd->writeCRC=~0; | 624 | bd->writeCRC = ~0; |
615 | pos=bd->writePos; | 625 | pos = bd->writePos; |
616 | current=bd->writeCurrent; | 626 | current = bd->writeCurrent; |
617 | goto decode_next_byte; | 627 | goto decode_next_byte; |
618 | } | 628 | } |
619 | 629 | ||
@@ -625,25 +635,28 @@ static int start_bunzip(bunzip_data **bdp, int in_fd, unsigned char *inbuf, | |||
625 | int len) | 635 | int len) |
626 | { | 636 | { |
627 | bunzip_data *bd; | 637 | bunzip_data *bd; |
628 | unsigned int i; | 638 | unsigned i; |
629 | const unsigned int BZh0=(((unsigned int)'B')<<24)+(((unsigned int)'Z')<<16) | 639 | enum { |
630 | +(((unsigned int)'h')<<8)+(unsigned int)'0'; | 640 | BZh0 = ('B' << 24) + ('Z' << 16) + ('h' << 8) + '0' |
641 | }; | ||
631 | 642 | ||
632 | /* Figure out how much data to allocate */ | 643 | /* Figure out how much data to allocate */ |
633 | 644 | ||
634 | i=sizeof(bunzip_data); | 645 | i = sizeof(bunzip_data); |
635 | if(in_fd!=-1) i+=IOBUF_SIZE; | 646 | if (in_fd != -1) i += IOBUF_SIZE; |
636 | 647 | ||
637 | /* Allocate bunzip_data. Most fields initialize to zero. */ | 648 | /* Allocate bunzip_data. Most fields initialize to zero. */ |
638 | 649 | ||
639 | bd=*bdp=xzalloc(i); | 650 | bd = *bdp = xzalloc(i); |
640 | 651 | ||
641 | /* Setup input buffer */ | 652 | /* Setup input buffer */ |
642 | 653 | ||
643 | if(-1==(bd->in_fd=in_fd)) { | 654 | bd->in_fd = in_fd; |
644 | bd->inbuf=inbuf; | 655 | if (-1 == in_fd) { |
645 | bd->inbufCount=len; | 656 | bd->inbuf = inbuf; |
646 | } else bd->inbuf=(unsigned char *)(bd+1); | 657 | bd->inbufCount = len; |
658 | } else | ||
659 | bd->inbuf = (unsigned char *)(bd + 1); | ||
647 | 660 | ||
648 | /* Init the CRC32 table (big endian) */ | 661 | /* Init the CRC32 table (big endian) */ |
649 | 662 | ||
@@ -651,20 +664,20 @@ static int start_bunzip(bunzip_data **bdp, int in_fd, unsigned char *inbuf, | |||
651 | 664 | ||
652 | /* Setup for I/O error handling via longjmp */ | 665 | /* Setup for I/O error handling via longjmp */ |
653 | 666 | ||
654 | i=setjmp(bd->jmpbuf); | 667 | i = setjmp(bd->jmpbuf); |
655 | if(i) return i; | 668 | if (i) return i; |
656 | 669 | ||
657 | /* Ensure that file starts with "BZh['1'-'9']." */ | 670 | /* Ensure that file starts with "BZh['1'-'9']." */ |
658 | 671 | ||
659 | i = get_bits(bd,32); | 672 | i = get_bits(bd, 32); |
660 | if (((unsigned int)(i-BZh0-1)) >= 9) return RETVAL_NOT_BZIP_DATA; | 673 | if (((unsigned)(i - BZh0 - 1)) >= 9) return RETVAL_NOT_BZIP_DATA; |
661 | 674 | ||
662 | /* Fourth byte (ascii '1'-'9'), indicates block size in units of 100k of | 675 | /* Fourth byte (ascii '1'-'9'), indicates block size in units of 100k of |
663 | uncompressed data. Allocate intermediate buffer for block. */ | 676 | uncompressed data. Allocate intermediate buffer for block. */ |
664 | 677 | ||
665 | bd->dbufSize=100000*(i-BZh0); | 678 | bd->dbufSize = 100000 * (i - BZh0); |
666 | 679 | ||
667 | bd->dbuf=xmalloc(bd->dbufSize * sizeof(int)); | 680 | bd->dbuf = xmalloc(bd->dbufSize * sizeof(int)); |
668 | return RETVAL_OK; | 681 | return RETVAL_OK; |
669 | } | 682 | } |
670 | 683 | ||
@@ -679,13 +692,14 @@ uncompressStream(int src_fd, int dst_fd) | |||
679 | bunzip_data *bd; | 692 | bunzip_data *bd; |
680 | int i; | 693 | int i; |
681 | 694 | ||
682 | outbuf=xmalloc(IOBUF_SIZE); | 695 | outbuf = xmalloc(IOBUF_SIZE); |
683 | i=start_bunzip(&bd,src_fd,0,0); | 696 | i = start_bunzip(&bd, src_fd, 0, 0); |
684 | if(!i) { | 697 | if (!i) { |
685 | for (;;) { | 698 | for (;;) { |
686 | if((i=read_bunzip(bd,outbuf,IOBUF_SIZE)) <= 0) break; | 699 | i = read_bunzip(bd, outbuf, IOBUF_SIZE); |
687 | if(i!=write(dst_fd,outbuf,i)) { | 700 | if (i <= 0) break; |
688 | i=RETVAL_UNEXPECTED_OUTPUT_EOF; | 701 | if (i != safe_write(dst_fd, outbuf, i)) { |
702 | i = RETVAL_UNEXPECTED_OUTPUT_EOF; | ||
689 | break; | 703 | break; |
690 | } | 704 | } |
691 | USE_DESKTOP(total_written += i;) | 705 | USE_DESKTOP(total_written += i;) |
@@ -694,13 +708,13 @@ uncompressStream(int src_fd, int dst_fd) | |||
694 | 708 | ||
695 | /* Check CRC and release memory */ | 709 | /* Check CRC and release memory */ |
696 | 710 | ||
697 | if(i==RETVAL_LAST_BLOCK) { | 711 | if (i == RETVAL_LAST_BLOCK) { |
698 | if (bd->headerCRC!=bd->totalCRC) { | 712 | if (bd->headerCRC != bd->totalCRC) { |
699 | bb_error_msg("data integrity error when decompressing"); | 713 | bb_error_msg("data integrity error when decompressing"); |
700 | } else { | 714 | } else { |
701 | i=RETVAL_OK; | 715 | i = RETVAL_OK; |
702 | } | 716 | } |
703 | } else if (i==RETVAL_UNEXPECTED_OUTPUT_EOF) { | 717 | } else if (i == RETVAL_UNEXPECTED_OUTPUT_EOF) { |
704 | bb_error_msg("compressed file ends unexpectedly"); | 718 | bb_error_msg("compressed file ends unexpectedly"); |
705 | } else { | 719 | } else { |
706 | bb_error_msg("decompression failed"); | 720 | bb_error_msg("decompression failed"); |
@@ -714,18 +728,22 @@ uncompressStream(int src_fd, int dst_fd) | |||
714 | 728 | ||
715 | #ifdef TESTING | 729 | #ifdef TESTING |
716 | 730 | ||
717 | static char * const bunzip_errors[]={NULL,"Bad file checksum","Not bzip data", | 731 | static char *const bunzip_errors[] = { |
718 | "Unexpected input EOF","Unexpected output EOF","Data error", | 732 | NULL, "Bad file checksum", "Not bzip data", |
719 | "Out of memory","Obsolete (pre 0.9.5) bzip format not supported."}; | 733 | "Unexpected input EOF", "Unexpected output EOF", "Data error", |
734 | "Out of memory", "Obsolete (pre 0.9.5) bzip format not supported" | ||
735 | }; | ||
720 | 736 | ||
721 | /* Dumb little test thing, decompress stdin to stdout */ | 737 | /* Dumb little test thing, decompress stdin to stdout */ |
722 | int main(int argc, char **argv) | 738 | int main(int argc, char **argv) |
723 | { | 739 | { |
724 | int i=uncompressStream(0,1); | 740 | int i = uncompressStream(0, 1); |
725 | char c; | 741 | char c; |
726 | 742 | ||
727 | if(i<0) fprintf(stderr,"%s\n", bunzip_errors[-i]); | 743 | if (i < 0) |
728 | else if(read(0,&c,1)) fprintf(stderr,"Trailing garbage ignored\n"); | 744 | fprintf(stderr,"%s\n", bunzip_errors[-i]); |
745 | else if (read(0, &c, 1)) | ||
746 | fprintf(stderr,"Trailing garbage ignored\n"); | ||
729 | return -i; | 747 | return -i; |
730 | } | 748 | } |
731 | #endif | 749 | #endif |