| 328 | } |
| 329 | |
| 330 | static int |
| 331 | LWZReadByte(FILE *fd, int flag) /*, int input_code_size)*/ |
| 332 | { |
| 333 | static int fresh = FALSE; |
| 334 | int code, incode; |
| 335 | static int code_size, set_code_size; |
| 336 | static int max_code, max_code_size; |
| 337 | static int firstcode, oldcode; |
| 338 | static int clear_code, end_code; |
| 339 | static int table[2][(1 << MAX_LWZ_BITS)]; |
| 340 | static int stack[(1 << (MAX_LWZ_BITS)) * 2], *sp; |
| 341 | int i; |
| 342 | |
| 343 | if (flag) { |
| 344 | set_code_size = input_code_size; |
| 345 | code_size = set_code_size + 1; |
| 346 | clear_code = 1 << set_code_size; |
| 347 | end_code = clear_code + 1; |
| 348 | max_code_size = 2 * clear_code; |
| 349 | max_code = clear_code + 2; |
| 350 | |
| 351 | (void) GetCode(fd, 0, TRUE); |
| 352 | |
| 353 | fresh = TRUE; |
| 354 | |
| 355 | for (i = 0; i < clear_code; ++i) { |
| 356 | table[0][i] = 0; |
| 357 | table[1][i] = i; |
| 358 | } |
| 359 | for (; i < (1 << MAX_LWZ_BITS); ++i) |
| 360 | table[0][i] = table[1][0] = 0; |
| 361 | |
| 362 | sp = stack; |
| 363 | |
| 364 | return 0; |
| 365 | } else if (fresh) { |
| 366 | fresh = FALSE; |
| 367 | do { |
| 368 | firstcode = oldcode = GetCode(fd, code_size, FALSE); |
| 369 | } while (firstcode == clear_code); |
| 370 | return firstcode; |
| 371 | } |
| 372 | |
| 373 | if (sp > stack) |
| 374 | return *--sp; |
| 375 | |
| 376 | while ((code = GetCode(fd, code_size, FALSE)) >= 0) { |
| 377 | if (code == clear_code) { |
| 378 | for (i = 0; i < clear_code; ++i) { |
| 379 | table[0][i] = 0; |
| 380 | table[1][i] = i; |
| 381 | } |
| 382 | for (; i < (1 << MAX_LWZ_BITS); ++i) |
| 383 | table[0][i] = table[1][i] = 0; |
| 384 | code_size = set_code_size + 1; |
| 385 | max_code_size = 2 * clear_code; |
| 386 | max_code = clear_code + 2; |
| 387 | sp = stack; |
no test coverage detected