示例#1
0
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);
}
示例#2
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;
}