예제 #1
0
/* Fetch data and put it in the output buffer.  Assumes state->x.have is 0.
   Data is either copied from the input file or decompressed from the input
   file depending on state->how.  If state->how is LOOK, then a gzip header is
   looked for to determine whether to copy or decompress.  Returns -1 on error,
   otherwise 0.  gz_fetch() will leave state->how as COPY or GZIP unless the
   end of the input file has been reached and all data has been processed.  */
local int
gz_fetch (gz_statep state)
{
  z_streamp strm = &(state->strm);

  do
    {
      switch (state->how)
	{
	case LOOK:		/* -> LOOK, COPY (only if never GZIP), or GZIP */
	  if (gz_look (state) == -1)
	    return -1;
	  if (state->how == LOOK)
	    return 0;
	  break;
	case COPY:		/* -> COPY */
	  if (gz_load (state, state->out, state->size << 1, &(state->x.have))
	      == -1)
	    return -1;
	  state->x.next = state->out;
	  return 0;
	case GZIP:		/* -> GZIP or LOOK (if end of gzip stream) */
	  strm->avail_out = state->size << 1;
	  strm->next_out = state->out;
	  if (gz_decomp (state) == -1)
	    return -1;
	}
    }
  while (state->x.have == 0 && (!state->eof || strm->avail_in));
  return 0;
}
예제 #2
0
int ZEXPORT gzdirect(gzFile file)
{
   gz_statep state;

   /* get internal structure */
   if (file == NULL)
      return 0;
   state = (gz_statep)file;

   /* if the state is not known, but we can find out, then do so (this is
      mainly for right after a gzopen() or gzdopen()) */
   if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0)
      (void)gz_look(state);

   /* return 1 if transparent, 0 if processing a gzip stream */
   return state->direct;
}