Modifications to library code:

  1. inffast.c:
     With profiler, found bottleneck in ZLib.  Changed code from:

            do {                        /* copy all or what's left */
              *q++ = *r++;
            } while (--c);

     To:
            memcpy(q, r, c);
            q += c; r += c;
            c = 0;

     Uncountably faster...

  2. gzio.c:
     Problems seeking to the end of large .gz files (as in to the last byte)
     Code affected:

	if (s->z_err == Z_STREAM_END) {
	    /* Check CRC and original size */
	    s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start));
	    start = s->stream.next_out;

	    if (getLong(s) != s->crc) {
#ifdef OLDCODE
		s->z_err = Z_DATA_ERROR;
#else
		s->z_eof = 1;
#endif
	    } else {


  3. gzio.c:
     If an error occurs on a stream, gzseek refuses to work, even if seeking 
     back to before the error occurs.  This change allows gzseek to seek to 
     earlier locations in files if an error occurs...

#ifdef OLDCODE
    if (s == NULL || whence == SEEK_END ||
        s->z_err == Z_ERRNO || s->z_err == Z_DATA_ERROR) {
        return -1L;
    }
#else
    /* Don't allow a seek if using SEEK_END, if S == NULL, or an error has 
     * occurred.  If an error has occurred, then allow seeks, but only if
     * they are backwards to earlier positions in the stream.
     */
    if (s == NULL || whence == SEEK_END ||
	((s->z_err == Z_ERRNO || s->z_err == Z_DATA_ERROR) &&
	 ((whence == SEEK_CUR && offset < 0) ||
          (whence == SEEK_SET && offset < s->stream.total_out)))) {
	return -1L;
    }
#endif