int dcnids_read_header(int fd, int skipcount, struct nids_header_st *nheader){ int n; int status; unsigned char *b; int b_size; char skipbuffer[4096]; size_t skipbuffer_size = 4096; memset(nheader, 0, sizeof(struct nids_header_st)); nheader->buffer_size = WMOAWIPS_HEADER_SIZE + NIDS_HEADER_SIZE; b = &nheader->buffer[0]; b_size = nheader->buffer_size; if(skipcount != 0){ status = read_skip_count(fd, skipcount, skipbuffer, skipbuffer_size); if(status != 0) return(status); } /* * If the file has a gempak header, skip it. */ n = read(fd, b, 1); if(n != 1) return(-1); if(isalnum(*b) == 0){ /* * Assume it is a gempak header */ status = read_skip_count(fd, GMPK_HEADER_SIZE - 1, skipbuffer, skipbuffer_size); if(status != 0) return(status); }else{ /* * Read what is left of the real header. */ ++b; --b_size; } n = read(fd, b, b_size); if(n == -1) return(-1); else if(n < b_size) return(1); return(0); }
static int read_code_table(LHANewDecoder *decoder) { int i, j, n, skip_count, code; uint8_t code_lengths[NUM_CODES]; // How many codes? n = read_bits(&decoder->bit_stream_reader, 9); if (n < 0) { return 0; } // n=0 implies a single code of zero length; all inputs // decode to the same code. if (n == 0) { code = read_bits(&decoder->bit_stream_reader, 9); if (code < 0) { return 0; } set_tree_single(decoder->code_tree, code); return 1; } if (n > NUM_CODES) { n = NUM_CODES; } // Read the length of each code. // The lengths are encoded using the temp-table previously read; // offset_tree is reused temporarily to hold it. i = 0; while (i < n) { code = read_from_tree(&decoder->bit_stream_reader, decoder->offset_tree); if (code < 0) { return 0; } // The code that was read can have different meanings. // If in the range 0-2, it indicates that a number of // codes are unused and should be skipped over. // Values greater than two represent a frequency count. if (code <= 2) { skip_count = read_skip_count(decoder, code); if (skip_count < 0) { return 0; } for (j = 0; j < skip_count && i < n; ++j) { code_lengths[i] = 0; ++i; } } else { code_lengths[i] = code - 2; ++i; } } build_tree(decoder->code_tree, NUM_CODES * 2, code_lengths, n); return 1; }