jdk/src/java.base/share/native/libzip/zlib/gzread.c
changeset 43810 a8fca792a14b
equal deleted inserted replaced
43809:c3669a70a7ab 43810:a8fca792a14b
       
     1 /*
       
     2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     3  *
       
     4  * This code is free software; you can redistribute it and/or modify it
       
     5  * under the terms of the GNU General Public License version 2 only, as
       
     6  * published by the Free Software Foundation.  Oracle designates this
       
     7  * particular file as subject to the "Classpath" exception as provided
       
     8  * by Oracle in the LICENSE file that accompanied this code.
       
     9  *
       
    10  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    13  * version 2 for more details (a copy is included in the LICENSE file that
       
    14  * accompanied this code).
       
    15  *
       
    16  * You should have received a copy of the GNU General Public License version
       
    17  * 2 along with this work; if not, write to the Free Software Foundation,
       
    18  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    19  *
       
    20  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       
    21  * or visit www.oracle.com if you need additional information or have any
       
    22  * questions.
       
    23  */
       
    24 
       
    25 /* gzread.c -- zlib functions for reading gzip files
       
    26  * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler
       
    27  * For conditions of distribution and use, see copyright notice in zlib.h
       
    28  */
       
    29 
       
    30 #include "gzguts.h"
       
    31 
       
    32 /* Local functions */
       
    33 local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *));
       
    34 local int gz_avail OF((gz_statep));
       
    35 local int gz_look OF((gz_statep));
       
    36 local int gz_decomp OF((gz_statep));
       
    37 local int gz_fetch OF((gz_statep));
       
    38 local int gz_skip OF((gz_statep, z_off64_t));
       
    39 local z_size_t gz_read OF((gz_statep, voidp, z_size_t));
       
    40 
       
    41 /* Use read() to load a buffer -- return -1 on error, otherwise 0.  Read from
       
    42    state->fd, and update state->eof, state->err, and state->msg as appropriate.
       
    43    This function needs to loop on read(), since read() is not guaranteed to
       
    44    read the number of bytes requested, depending on the type of descriptor. */
       
    45 local int gz_load(state, buf, len, have)
       
    46     gz_statep state;
       
    47     unsigned char *buf;
       
    48     unsigned len;
       
    49     unsigned *have;
       
    50 {
       
    51     int ret;
       
    52     unsigned get, max = ((unsigned)-1 >> 2) + 1;
       
    53 
       
    54     *have = 0;
       
    55     do {
       
    56         get = len - *have;
       
    57         if (get > max)
       
    58             get = max;
       
    59         ret = read(state->fd, buf + *have, get);
       
    60         if (ret <= 0)
       
    61             break;
       
    62         *have += (unsigned)ret;
       
    63     } while (*have < len);
       
    64     if (ret < 0) {
       
    65         gz_error(state, Z_ERRNO, zstrerror());
       
    66         return -1;
       
    67     }
       
    68     if (ret == 0)
       
    69         state->eof = 1;
       
    70     return 0;
       
    71 }
       
    72 
       
    73 /* Load up input buffer and set eof flag if last data loaded -- return -1 on
       
    74    error, 0 otherwise.  Note that the eof flag is set when the end of the input
       
    75    file is reached, even though there may be unused data in the buffer.  Once
       
    76    that data has been used, no more attempts will be made to read the file.
       
    77    If strm->avail_in != 0, then the current data is moved to the beginning of
       
    78    the input buffer, and then the remainder of the buffer is loaded with the
       
    79    available data from the input file. */
       
    80 local int gz_avail(state)
       
    81     gz_statep state;
       
    82 {
       
    83     unsigned got;
       
    84     z_streamp strm = &(state->strm);
       
    85 
       
    86     if (state->err != Z_OK && state->err != Z_BUF_ERROR)
       
    87         return -1;
       
    88     if (state->eof == 0) {
       
    89         if (strm->avail_in) {       /* copy what's there to the start */
       
    90             unsigned char *p = state->in;
       
    91             unsigned const char *q = strm->next_in;
       
    92             unsigned n = strm->avail_in;
       
    93             do {
       
    94                 *p++ = *q++;
       
    95             } while (--n);
       
    96         }
       
    97         if (gz_load(state, state->in + strm->avail_in,
       
    98                     state->size - strm->avail_in, &got) == -1)
       
    99             return -1;
       
   100         strm->avail_in += got;
       
   101         strm->next_in = state->in;
       
   102     }
       
   103     return 0;
       
   104 }
       
   105 
       
   106 /* Look for gzip header, set up for inflate or copy.  state->x.have must be 0.
       
   107    If this is the first time in, allocate required memory.  state->how will be
       
   108    left unchanged if there is no more input data available, will be set to COPY
       
   109    if there is no gzip header and direct copying will be performed, or it will
       
   110    be set to GZIP for decompression.  If direct copying, then leftover input
       
   111    data from the input buffer will be copied to the output buffer.  In that
       
   112    case, all further file reads will be directly to either the output buffer or
       
   113    a user buffer.  If decompressing, the inflate state will be initialized.
       
   114    gz_look() will return 0 on success or -1 on failure. */
       
   115 local int gz_look(state)
       
   116     gz_statep state;
       
   117 {
       
   118     z_streamp strm = &(state->strm);
       
   119 
       
   120     /* allocate read buffers and inflate memory */
       
   121     if (state->size == 0) {
       
   122         /* allocate buffers */
       
   123         state->in = (unsigned char *)malloc(state->want);
       
   124         state->out = (unsigned char *)malloc(state->want << 1);
       
   125         if (state->in == NULL || state->out == NULL) {
       
   126             free(state->out);
       
   127             free(state->in);
       
   128             gz_error(state, Z_MEM_ERROR, "out of memory");
       
   129             return -1;
       
   130         }
       
   131         state->size = state->want;
       
   132 
       
   133         /* allocate inflate memory */
       
   134         state->strm.zalloc = Z_NULL;
       
   135         state->strm.zfree = Z_NULL;
       
   136         state->strm.opaque = Z_NULL;
       
   137         state->strm.avail_in = 0;
       
   138         state->strm.next_in = Z_NULL;
       
   139         if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) {    /* gunzip */
       
   140             free(state->out);
       
   141             free(state->in);
       
   142             state->size = 0;
       
   143             gz_error(state, Z_MEM_ERROR, "out of memory");
       
   144             return -1;
       
   145         }
       
   146     }
       
   147 
       
   148     /* get at least the magic bytes in the input buffer */
       
   149     if (strm->avail_in < 2) {
       
   150         if (gz_avail(state) == -1)
       
   151             return -1;
       
   152         if (strm->avail_in == 0)
       
   153             return 0;
       
   154     }
       
   155 
       
   156     /* look for gzip magic bytes -- if there, do gzip decoding (note: there is
       
   157        a logical dilemma here when considering the case of a partially written
       
   158        gzip file, to wit, if a single 31 byte is written, then we cannot tell
       
   159        whether this is a single-byte file, or just a partially written gzip
       
   160        file -- for here we assume that if a gzip file is being written, then
       
   161        the header will be written in a single operation, so that reading a
       
   162        single byte is sufficient indication that it is not a gzip file) */
       
   163     if (strm->avail_in > 1 &&
       
   164             strm->next_in[0] == 31 && strm->next_in[1] == 139) {
       
   165         inflateReset(strm);
       
   166         state->how = GZIP;
       
   167         state->direct = 0;
       
   168         return 0;
       
   169     }
       
   170 
       
   171     /* no gzip header -- if we were decoding gzip before, then this is trailing
       
   172        garbage.  Ignore the trailing garbage and finish. */
       
   173     if (state->direct == 0) {
       
   174         strm->avail_in = 0;
       
   175         state->eof = 1;
       
   176         state->x.have = 0;
       
   177         return 0;
       
   178     }
       
   179 
       
   180     /* doing raw i/o, copy any leftover input to output -- this assumes that
       
   181        the output buffer is larger than the input buffer, which also assures
       
   182        space for gzungetc() */
       
   183     state->x.next = state->out;
       
   184     if (strm->avail_in) {
       
   185         memcpy(state->x.next, strm->next_in, strm->avail_in);
       
   186         state->x.have = strm->avail_in;
       
   187         strm->avail_in = 0;
       
   188     }
       
   189     state->how = COPY;
       
   190     state->direct = 1;
       
   191     return 0;
       
   192 }
       
   193 
       
   194 /* Decompress from input to the provided next_out and avail_out in the state.
       
   195    On return, state->x.have and state->x.next point to the just decompressed
       
   196    data.  If the gzip stream completes, state->how is reset to LOOK to look for
       
   197    the next gzip stream or raw data, once state->x.have is depleted.  Returns 0
       
   198    on success, -1 on failure. */
       
   199 local int gz_decomp(state)
       
   200     gz_statep state;
       
   201 {
       
   202     int ret = Z_OK;
       
   203     unsigned had;
       
   204     z_streamp strm = &(state->strm);
       
   205 
       
   206     /* fill output buffer up to end of deflate stream */
       
   207     had = strm->avail_out;
       
   208     do {
       
   209         /* get more input for inflate() */
       
   210         if (strm->avail_in == 0 && gz_avail(state) == -1)
       
   211             return -1;
       
   212         if (strm->avail_in == 0) {
       
   213             gz_error(state, Z_BUF_ERROR, "unexpected end of file");
       
   214             break;
       
   215         }
       
   216 
       
   217         /* decompress and handle errors */
       
   218         ret = inflate(strm, Z_NO_FLUSH);
       
   219         if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) {
       
   220             gz_error(state, Z_STREAM_ERROR,
       
   221                      "internal error: inflate stream corrupt");
       
   222             return -1;
       
   223         }
       
   224         if (ret == Z_MEM_ERROR) {
       
   225             gz_error(state, Z_MEM_ERROR, "out of memory");
       
   226             return -1;
       
   227         }
       
   228         if (ret == Z_DATA_ERROR) {              /* deflate stream invalid */
       
   229             gz_error(state, Z_DATA_ERROR,
       
   230                      strm->msg == NULL ? "compressed data error" : strm->msg);
       
   231             return -1;
       
   232         }
       
   233     } while (strm->avail_out && ret != Z_STREAM_END);
       
   234 
       
   235     /* update available output */
       
   236     state->x.have = had - strm->avail_out;
       
   237     state->x.next = strm->next_out - state->x.have;
       
   238 
       
   239     /* if the gzip stream completed successfully, look for another */
       
   240     if (ret == Z_STREAM_END)
       
   241         state->how = LOOK;
       
   242 
       
   243     /* good decompression */
       
   244     return 0;
       
   245 }
       
   246 
       
   247 /* Fetch data and put it in the output buffer.  Assumes state->x.have is 0.
       
   248    Data is either copied from the input file or decompressed from the input
       
   249    file depending on state->how.  If state->how is LOOK, then a gzip header is
       
   250    looked for to determine whether to copy or decompress.  Returns -1 on error,
       
   251    otherwise 0.  gz_fetch() will leave state->how as COPY or GZIP unless the
       
   252    end of the input file has been reached and all data has been processed.  */
       
   253 local int gz_fetch(state)
       
   254     gz_statep state;
       
   255 {
       
   256     z_streamp strm = &(state->strm);
       
   257 
       
   258     do {
       
   259         switch(state->how) {
       
   260         case LOOK:      /* -> LOOK, COPY (only if never GZIP), or GZIP */
       
   261             if (gz_look(state) == -1)
       
   262                 return -1;
       
   263             if (state->how == LOOK)
       
   264                 return 0;
       
   265             break;
       
   266         case COPY:      /* -> COPY */
       
   267             if (gz_load(state, state->out, state->size << 1, &(state->x.have))
       
   268                     == -1)
       
   269                 return -1;
       
   270             state->x.next = state->out;
       
   271             return 0;
       
   272         case GZIP:      /* -> GZIP or LOOK (if end of gzip stream) */
       
   273             strm->avail_out = state->size << 1;
       
   274             strm->next_out = state->out;
       
   275             if (gz_decomp(state) == -1)
       
   276                 return -1;
       
   277         }
       
   278     } while (state->x.have == 0 && (!state->eof || strm->avail_in));
       
   279     return 0;
       
   280 }
       
   281 
       
   282 /* Skip len uncompressed bytes of output.  Return -1 on error, 0 on success. */
       
   283 local int gz_skip(state, len)
       
   284     gz_statep state;
       
   285     z_off64_t len;
       
   286 {
       
   287     unsigned n;
       
   288 
       
   289     /* skip over len bytes or reach end-of-file, whichever comes first */
       
   290     while (len)
       
   291         /* skip over whatever is in output buffer */
       
   292         if (state->x.have) {
       
   293             n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ?
       
   294                 (unsigned)len : state->x.have;
       
   295             state->x.have -= n;
       
   296             state->x.next += n;
       
   297             state->x.pos += n;
       
   298             len -= n;
       
   299         }
       
   300 
       
   301         /* output buffer empty -- return if we're at the end of the input */
       
   302         else if (state->eof && state->strm.avail_in == 0)
       
   303             break;
       
   304 
       
   305         /* need more data to skip -- load up output buffer */
       
   306         else {
       
   307             /* get more output, looking for header if required */
       
   308             if (gz_fetch(state) == -1)
       
   309                 return -1;
       
   310         }
       
   311     return 0;
       
   312 }
       
   313 
       
   314 /* Read len bytes into buf from file, or less than len up to the end of the
       
   315    input.  Return the number of bytes read.  If zero is returned, either the
       
   316    end of file was reached, or there was an error.  state->err must be
       
   317    consulted in that case to determine which. */
       
   318 local z_size_t gz_read(state, buf, len)
       
   319     gz_statep state;
       
   320     voidp buf;
       
   321     z_size_t len;
       
   322 {
       
   323     z_size_t got;
       
   324     unsigned n;
       
   325 
       
   326     /* if len is zero, avoid unnecessary operations */
       
   327     if (len == 0)
       
   328         return 0;
       
   329 
       
   330     /* process a skip request */
       
   331     if (state->seek) {
       
   332         state->seek = 0;
       
   333         if (gz_skip(state, state->skip) == -1)
       
   334             return 0;
       
   335     }
       
   336 
       
   337     /* get len bytes to buf, or less than len if at the end */
       
   338     got = 0;
       
   339     do {
       
   340         /* set n to the maximum amount of len that fits in an unsigned int */
       
   341         n = -1;
       
   342         if (n > len)
       
   343             n = (unsigned)len;
       
   344 
       
   345         /* first just try copying data from the output buffer */
       
   346         if (state->x.have) {
       
   347             if (state->x.have < n)
       
   348                 n = state->x.have;
       
   349             memcpy(buf, state->x.next, n);
       
   350             state->x.next += n;
       
   351             state->x.have -= n;
       
   352         }
       
   353 
       
   354         /* output buffer empty -- return if we're at the end of the input */
       
   355         else if (state->eof && state->strm.avail_in == 0) {
       
   356             state->past = 1;        /* tried to read past end */
       
   357             break;
       
   358         }
       
   359 
       
   360         /* need output data -- for small len or new stream load up our output
       
   361            buffer */
       
   362         else if (state->how == LOOK || n < (state->size << 1)) {
       
   363             /* get more output, looking for header if required */
       
   364             if (gz_fetch(state) == -1)
       
   365                 return 0;
       
   366             continue;       /* no progress yet -- go back to copy above */
       
   367             /* the copy above assures that we will leave with space in the
       
   368                output buffer, allowing at least one gzungetc() to succeed */
       
   369         }
       
   370 
       
   371         /* large len -- read directly into user buffer */
       
   372         else if (state->how == COPY) {      /* read directly */
       
   373             if (gz_load(state, (unsigned char *)buf, n, &n) == -1)
       
   374                 return 0;
       
   375         }
       
   376 
       
   377         /* large len -- decompress directly into user buffer */
       
   378         else {  /* state->how == GZIP */
       
   379             state->strm.avail_out = n;
       
   380             state->strm.next_out = (unsigned char *)buf;
       
   381             if (gz_decomp(state) == -1)
       
   382                 return 0;
       
   383             n = state->x.have;
       
   384             state->x.have = 0;
       
   385         }
       
   386 
       
   387         /* update progress */
       
   388         len -= n;
       
   389         buf = (char *)buf + n;
       
   390         got += n;
       
   391         state->x.pos += n;
       
   392     } while (len);
       
   393 
       
   394     /* return number of bytes read into user buffer */
       
   395     return got;
       
   396 }
       
   397 
       
   398 /* -- see zlib.h -- */
       
   399 int ZEXPORT gzread(file, buf, len)
       
   400     gzFile file;
       
   401     voidp buf;
       
   402     unsigned len;
       
   403 {
       
   404     gz_statep state;
       
   405 
       
   406     /* get internal structure */
       
   407     if (file == NULL)
       
   408         return -1;
       
   409     state = (gz_statep)file;
       
   410 
       
   411     /* check that we're reading and that there's no (serious) error */
       
   412     if (state->mode != GZ_READ ||
       
   413             (state->err != Z_OK && state->err != Z_BUF_ERROR))
       
   414         return -1;
       
   415 
       
   416     /* since an int is returned, make sure len fits in one, otherwise return
       
   417        with an error (this avoids a flaw in the interface) */
       
   418     if ((int)len < 0) {
       
   419         gz_error(state, Z_STREAM_ERROR, "request does not fit in an int");
       
   420         return -1;
       
   421     }
       
   422 
       
   423     /* read len or fewer bytes to buf */
       
   424     len = (unsigned)gz_read(state, buf, len);
       
   425 
       
   426     /* check for an error */
       
   427     if (len == 0 && state->err != Z_OK && state->err != Z_BUF_ERROR)
       
   428         return -1;
       
   429 
       
   430     /* return the number of bytes read (this is assured to fit in an int) */
       
   431     return (int)len;
       
   432 }
       
   433 
       
   434 /* -- see zlib.h -- */
       
   435 z_size_t ZEXPORT gzfread(buf, size, nitems, file)
       
   436     voidp buf;
       
   437     z_size_t size;
       
   438     z_size_t nitems;
       
   439     gzFile file;
       
   440 {
       
   441     z_size_t len;
       
   442     gz_statep state;
       
   443 
       
   444     /* get internal structure */
       
   445     if (file == NULL)
       
   446         return 0;
       
   447     state = (gz_statep)file;
       
   448 
       
   449     /* check that we're reading and that there's no (serious) error */
       
   450     if (state->mode != GZ_READ ||
       
   451             (state->err != Z_OK && state->err != Z_BUF_ERROR))
       
   452         return 0;
       
   453 
       
   454     /* compute bytes to read -- error on overflow */
       
   455     len = nitems * size;
       
   456     if (size && len / size != nitems) {
       
   457         gz_error(state, Z_STREAM_ERROR, "request does not fit in a size_t");
       
   458         return 0;
       
   459     }
       
   460 
       
   461     /* read len or fewer bytes to buf, return the number of full items read */
       
   462     return len ? gz_read(state, buf, len) / size : 0;
       
   463 }
       
   464 
       
   465 /* -- see zlib.h -- */
       
   466 #ifdef Z_PREFIX_SET
       
   467 #  undef z_gzgetc
       
   468 #else
       
   469 #  undef gzgetc
       
   470 #endif
       
   471 int ZEXPORT gzgetc(file)
       
   472     gzFile file;
       
   473 {
       
   474     int ret;
       
   475     unsigned char buf[1];
       
   476     gz_statep state;
       
   477 
       
   478     /* get internal structure */
       
   479     if (file == NULL)
       
   480         return -1;
       
   481     state = (gz_statep)file;
       
   482 
       
   483     /* check that we're reading and that there's no (serious) error */
       
   484     if (state->mode != GZ_READ ||
       
   485         (state->err != Z_OK && state->err != Z_BUF_ERROR))
       
   486         return -1;
       
   487 
       
   488     /* try output buffer (no need to check for skip request) */
       
   489     if (state->x.have) {
       
   490         state->x.have--;
       
   491         state->x.pos++;
       
   492         return *(state->x.next)++;
       
   493     }
       
   494 
       
   495     /* nothing there -- try gz_read() */
       
   496     ret = (int)gz_read(state, buf, 1);
       
   497     return ret < 1 ? -1 : buf[0];
       
   498 }
       
   499 
       
   500 int ZEXPORT gzgetc_(file)
       
   501 gzFile file;
       
   502 {
       
   503     return gzgetc(file);
       
   504 }
       
   505 
       
   506 /* -- see zlib.h -- */
       
   507 int ZEXPORT gzungetc(c, file)
       
   508     int c;
       
   509     gzFile file;
       
   510 {
       
   511     gz_statep state;
       
   512 
       
   513     /* get internal structure */
       
   514     if (file == NULL)
       
   515         return -1;
       
   516     state = (gz_statep)file;
       
   517 
       
   518     /* check that we're reading and that there's no (serious) error */
       
   519     if (state->mode != GZ_READ ||
       
   520         (state->err != Z_OK && state->err != Z_BUF_ERROR))
       
   521         return -1;
       
   522 
       
   523     /* process a skip request */
       
   524     if (state->seek) {
       
   525         state->seek = 0;
       
   526         if (gz_skip(state, state->skip) == -1)
       
   527             return -1;
       
   528     }
       
   529 
       
   530     /* can't push EOF */
       
   531     if (c < 0)
       
   532         return -1;
       
   533 
       
   534     /* if output buffer empty, put byte at end (allows more pushing) */
       
   535     if (state->x.have == 0) {
       
   536         state->x.have = 1;
       
   537         state->x.next = state->out + (state->size << 1) - 1;
       
   538         state->x.next[0] = (unsigned char)c;
       
   539         state->x.pos--;
       
   540         state->past = 0;
       
   541         return c;
       
   542     }
       
   543 
       
   544     /* if no room, give up (must have already done a gzungetc()) */
       
   545     if (state->x.have == (state->size << 1)) {
       
   546         gz_error(state, Z_DATA_ERROR, "out of room to push characters");
       
   547         return -1;
       
   548     }
       
   549 
       
   550     /* slide output data if needed and insert byte before existing data */
       
   551     if (state->x.next == state->out) {
       
   552         unsigned char *src = state->out + state->x.have;
       
   553         unsigned char *dest = state->out + (state->size << 1);
       
   554         while (src > state->out)
       
   555             *--dest = *--src;
       
   556         state->x.next = dest;
       
   557     }
       
   558     state->x.have++;
       
   559     state->x.next--;
       
   560     state->x.next[0] = (unsigned char)c;
       
   561     state->x.pos--;
       
   562     state->past = 0;
       
   563     return c;
       
   564 }
       
   565 
       
   566 /* -- see zlib.h -- */
       
   567 char * ZEXPORT gzgets(file, buf, len)
       
   568     gzFile file;
       
   569     char *buf;
       
   570     int len;
       
   571 {
       
   572     unsigned left, n;
       
   573     char *str;
       
   574     unsigned char *eol;
       
   575     gz_statep state;
       
   576 
       
   577     /* check parameters and get internal structure */
       
   578     if (file == NULL || buf == NULL || len < 1)
       
   579         return NULL;
       
   580     state = (gz_statep)file;
       
   581 
       
   582     /* check that we're reading and that there's no (serious) error */
       
   583     if (state->mode != GZ_READ ||
       
   584         (state->err != Z_OK && state->err != Z_BUF_ERROR))
       
   585         return NULL;
       
   586 
       
   587     /* process a skip request */
       
   588     if (state->seek) {
       
   589         state->seek = 0;
       
   590         if (gz_skip(state, state->skip) == -1)
       
   591             return NULL;
       
   592     }
       
   593 
       
   594     /* copy output bytes up to new line or len - 1, whichever comes first --
       
   595        append a terminating zero to the string (we don't check for a zero in
       
   596        the contents, let the user worry about that) */
       
   597     str = buf;
       
   598     left = (unsigned)len - 1;
       
   599     if (left) do {
       
   600         /* assure that something is in the output buffer */
       
   601         if (state->x.have == 0 && gz_fetch(state) == -1)
       
   602             return NULL;                /* error */
       
   603         if (state->x.have == 0) {       /* end of file */
       
   604             state->past = 1;            /* read past end */
       
   605             break;                      /* return what we have */
       
   606         }
       
   607 
       
   608         /* look for end-of-line in current output buffer */
       
   609         n = state->x.have > left ? left : state->x.have;
       
   610         eol = (unsigned char *)memchr(state->x.next, '\n', n);
       
   611         if (eol != NULL)
       
   612             n = (unsigned)(eol - state->x.next) + 1;
       
   613 
       
   614         /* copy through end-of-line, or remainder if not found */
       
   615         memcpy(buf, state->x.next, n);
       
   616         state->x.have -= n;
       
   617         state->x.next += n;
       
   618         state->x.pos += n;
       
   619         left -= n;
       
   620         buf += n;
       
   621     } while (left && eol == NULL);
       
   622 
       
   623     /* return terminated string, or if nothing, end of file */
       
   624     if (buf == str)
       
   625         return NULL;
       
   626     buf[0] = 0;
       
   627     return str;
       
   628 }
       
   629 
       
   630 /* -- see zlib.h -- */
       
   631 int ZEXPORT gzdirect(file)
       
   632     gzFile file;
       
   633 {
       
   634     gz_statep state;
       
   635 
       
   636     /* get internal structure */
       
   637     if (file == NULL)
       
   638         return 0;
       
   639     state = (gz_statep)file;
       
   640 
       
   641     /* if the state is not known, but we can find out, then do so (this is
       
   642        mainly for right after a gzopen() or gzdopen()) */
       
   643     if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0)
       
   644         (void)gz_look(state);
       
   645 
       
   646     /* return 1 if transparent, 0 if processing a gzip stream */
       
   647     return state->direct;
       
   648 }
       
   649 
       
   650 /* -- see zlib.h -- */
       
   651 int ZEXPORT gzclose_r(file)
       
   652     gzFile file;
       
   653 {
       
   654     int ret, err;
       
   655     gz_statep state;
       
   656 
       
   657     /* get internal structure */
       
   658     if (file == NULL)
       
   659         return Z_STREAM_ERROR;
       
   660     state = (gz_statep)file;
       
   661 
       
   662     /* check that we're reading */
       
   663     if (state->mode != GZ_READ)
       
   664         return Z_STREAM_ERROR;
       
   665 
       
   666     /* free memory and close file */
       
   667     if (state->size) {
       
   668         inflateEnd(&(state->strm));
       
   669         free(state->out);
       
   670         free(state->in);
       
   671     }
       
   672     err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK;
       
   673     gz_error(state, Z_OK, NULL);
       
   674     free(state->path);
       
   675     ret = close(state->fd);
       
   676     free(state);
       
   677     return ret ? Z_ERRNO : err;
       
   678 }