예제 #1
0
        public static int gzread(gzFile_s *file, void *buf, uint len)
        {
            gz_state *state;

            if (file == ((void *)0))
            {
                return(-1);
            }
            state = (gz_state *)file;
            if ((state->mode != 7247) || ((state->err != 0) && (state->err != (-5))))
            {
                return(-1);
            }
            if (((int)len) < 0)
            {
                gz_error(state, -2, "request does not fit in an int"); return(-1);
            }

            len = (uint)gz_read(state, buf, len);
            if ((len == 0) && (state->err != 0) && (state->err != (-5)))
            {
                return(-1);
            }
            return((int)len);
        }
예제 #2
0
        public static int gzbuffer(gzFile_s *file, uint size)
        {
            gz_state *state;

            if (file == ((void *)0))
            {
                return(-1);
            }
            state = (gz_state *)file;
            if ((state->mode != 7247) && (state->mode != 31153))
            {
                return(-1);
            }
            if (state->size != 0)
            {
                return(-1);
            }
            if ((size << 1) < size)
            {
                return(-1);
            }
            if (size < 2)
            {
                size = 2;
            }
            state->want = size;
            return(0);
        }
예제 #3
0
        public static int gztell(gzFile_s *file)
        {
            long ret = 0;

            ret = gztell64(file);
            return(ret == ((int)ret) ? (int)ret : -1);
        }
예제 #4
0
        public static int gzseek(gzFile_s *file, int offset, int whence)
        {
            long ret = 0;

            ret = gzseek64(file, offset, whence);
            return(ret == ((int)ret) ? (int)ret : -1);
        }
예제 #5
0
        public static long gzoffset64(gzFile_s *file)
        {
            long      offset = 0;
            gz_state *state;

            if (file == ((void *)0))
            {
                return(-1);
            }
            state = (gz_state *)file;
            if ((state->mode != 7247) && (state->mode != 31153))
            {
                return(-1);
            }
            offset = (long)_lseeki64(state->fd, 0, 1);
            if (offset == (-1))
            {
                return(-1);
            }
            if (state->mode == 7247)
            {
                offset -= state->strm.avail_in;
            }
            return(offset);
        }
예제 #6
0
        public static int gzflush(gzFile_s *file, int flush)
        {
            gz_state *state;

            if (file == ((void *)0))
            {
                return(-2);
            }
            state = (gz_state *)file;
            if ((state->mode != 31153) || (state->err != 0))
            {
                return(-2);
            }
            if ((flush < 0) || (flush > 4))
            {
                return(-2);
            }
            if (state->seek != 0)
            {
                state->seek = 0;
                if (gz_zero(state, state->skip) == (-1))
                {
                    return(state->err);
                }
            }

            (void)gz_comp(state, (int)flush);
            return(state->err);
        }
예제 #7
0
        public static int gzoffset(gzFile_s *file)
        {
            long ret = 0;

            ret = gzoffset64(file);
            return(ret == ((int)ret) ? (int)ret : -1);
        }
예제 #8
0
        public static int gzclose_r(gzFile_s *file)
        {
            int       ret = 0; int err = 0;
            gz_state *state;

            if (file == ((void *)0))
            {
                return((int)-2);
            }
            state = (gz_state *)file;
            if (state->mode != 7247)
            {
                return((int)-2);
            }
            if (state->size != 0)
            {
                inflateEnd(&state->strm); free(state->_out_); free(state->_in_);
            }

            err = (int)(state->err == (-5)?(-5):0);
            gz_error(state, (int)0, (void *)0);
            free(state->path);
            ret = (int)close((int)state->fd);
            free(state);
            return((int)(ret != 0?(-1):err));
        }
예제 #9
0
        public static int gzvprintf(gzFile_s *file, sbyte *format, sbyte *va)
        {
            int        len  = 0;
            uint       left = 0;
            sbyte *    next;
            gz_state * state;
            z_stream_s strm;

            if (file == ((void *)0))
            {
                return(-2);
            }
            state = (gz_state *)file;
            strm  = &state->strm;
            if ((state->mode != 31153) || (state->err != 0))
            {
                return(-2);
            }
            if ((state->size == 0) && (gz_init(state) == (-1)))
            {
                return(state->err);
            }
            if (state->seek != 0)
            {
                state->seek = 0;
                if (gz_zero(state, state->skip) == (-1))
                {
                    return(state->err);
                }
            }

            if (strm.avail_in == 0)
            {
                strm.next_in = state->_in_;
            }
            next = (sbyte *)(state->_in_ + (strm.next_in - state->_in_) + strm.avail_in);
            next[state->size - 1] = 0;
            len = (int)vsnprintf(next, state->size, format, va);
            if ((len == 0) || (((uint)len) >= state->size) || (next[state->size - 1] != 0))
            {
                return(0);
            }
            strm.avail_in += (uint)len;
            state->x.pos  += len;
            if (strm.avail_in >= state->size)
            {
                left          = strm.avail_in - state->size;
                strm.avail_in = state->size;
                if (gz_comp(state, 0) == (-1))
                {
                    return(state->err);
                }
                memcpy(state->_in_, state->_in_ + state->size, (ulong)left); strm.next_in = state->_in_; strm.avail_in = left;
            }

            return(len);
        }
예제 #10
0
        public static int gzprintf(gzFile_s *file, sbyte *format)
        {
            sbyte *va;
            int    ret = 0;

            __va_start(&va, format);
            ret = gzvprintf(file, format, va);
            (void)(va = (sbyte *)0);
            return(ret);
        }
예제 #11
0
        public static sbyte *gzgets(gzFile_s *file, sbyte *buf, int len)
        {
            uint      left = 0; uint n = 0;
            sbyte *   str;
            byte *    eol;
            gz_state *state;

            if ((file == ((void *)0)) || (buf == ((void *)0)) || (len < 1))
            {
                return((void *)0);
            }
            state = (gz_state *)file;
            if ((state->mode != 7247) || ((state->err != 0) && (state->err != (-5))))
            {
                return((void *)0);
            }
            if (state->seek != 0)
            {
                state->seek = 0;
                if (gz_skip(state, state->skip) == (-1))
                {
                    return((void *)0);
                }
            }

            str  = buf;
            left = (uint)len - 1;
            if (left != 0)
            {
                do
                {
                    if ((state->x.have == 0) && (gz_fetch(state) == (-1)))
                    {
                        return((void *)0);
                    }
                    if (state->x.have == 0)
                    {
                        state->past = (int)1; break;
                    }
                    n = (uint)(state->x.have > left?left:state->x.have); eol = (byte *)(memchr(state->x.next, (int)('
'), (ulong)(n))); if (eol != ((void *)(0)))
                    {
                        n = (uint)((uint)(eol - state->x.next) + 1);
                    }
                    memcpy(buf, state->x.next, (ulong)(n)); state->x.have -= (uint)(n); state->x.next += n; state->x.pos += (long)(n); left -= (uint)(n); buf += n;
                }while ((left != 0) && (eol == ((void *)0)));
            }
            if (buf == str)
            {
                return((void *)0);
            }
            buf[0] = (sbyte)0;
            return(str);
        }
예제 #12
0
        public static int gzclose(gzFile_s *file)
        {
            gz_state *state;

            if (file == ((void *)0))
            {
                return(-2);
            }
            state = (gz_state *)file;
            return((int)(state->mode == 7247 ? gzclose_r(file) : gzclose_w(file)));
        }
예제 #13
0
        public static int gzungetc(int c, gzFile_s *file)
        {
            gz_state *state;

            if (file == ((void *)0))
            {
                return(-1);
            }
            state = (gz_state *)file;
            if ((state->mode != 7247) || ((state->err != 0) && (state->err != (-5))))
            {
                return(-1);
            }
            if (state->seek != 0)
            {
                state->seek = 0;
                if (gz_skip(state, state->skip) == (-1))
                {
                    return(-1);
                }
            }

            if (c < 0)
            {
                return(-1);
            }
            if (state->x.have == 0)
            {
                state->x.have = 1;
                state->x.next = state->_out_ + (state->size << 1) - 1; state->x.next[0] = (byte)c; state->x.pos--; state->past = 0;
                return(c);
            }

            if (state->x.have == (state->size << 1))
            {
                gz_error(state, -3, "out of room to push characters"); return(-1);
            }

            if (state->x.next == state->_out_)
            {
                byte *src = state->_out_ + state->x.have; byte *dest = state->_out_ + (state->size << 1); while (src > state->_out_)
                {
                    *--dest = *--src;
                }
                state->x.next = dest;
            }

            state->x.have++;
            state->x.next--;
            state->x.next[0] = (byte)c;
            state->x.pos--;
            state->past = 0;
            return(c);
        }
예제 #14
0
        public static int gzeof(gzFile_s *file)
        {
            gz_state *state;

            if (file == ((void *)0))
            {
                return(0);
            }
            state = (gz_state *)file;
            if ((state->mode != 7247) && (state->mode != 31153))
            {
                return(0);
            }
            return(state->mode == 7247 ? state->past : 0);
        }
예제 #15
0
        public static long gztell64(gzFile_s *file)
        {
            gz_state *state;

            if (file == ((void *)0))
            {
                return(-1);
            }
            state = (gz_state *)file;
            if ((state->mode != 7247) && (state->mode != 31153))
            {
                return(-1);
            }
            return(state->x.pos + (state->seek != 0 ? state->skip : 0));
        }
예제 #16
0
        public static int gzdirect(gzFile_s *file)
        {
            gz_state *state;

            if (file == ((void *)0))
            {
                return((int)0);
            }
            state = (gz_state *)file;
            if ((state->mode == 7247) && (state->how == 0) && (state->x.have == 0))
            {
                (void)gz_look(state);
            }
            return((int)state->direct);
        }
예제 #17
0
        public static int gzputc(gzFile_s *file, int c)
        {
            uint       have = 0;
            byte *     buf  = stackalloc byte[1];
            gz_state * state;
            z_stream_s strm;

            if (file == ((void *)0))
            {
                return(-1);
            }
            state = (gz_state *)file;
            strm  = &state->strm;
            if ((state->mode != 31153) || (state->err != 0))
            {
                return(-1);
            }
            if (state->seek != 0)
            {
                state->seek = 0;
                if (gz_zero(state, state->skip) == (-1))
                {
                    return(-1);
                }
            }

            if (state->size != 0)
            {
                if (strm.avail_in == 0)
                {
                    strm.next_in = state->_in_;
                }
                have = (uint)(strm.next_in + strm.avail_in - state->_in_); if (have < state->size)
                {
                    state->_in_[have] = (byte)c; strm.avail_in++; state->x.pos++; return(c & 0xff);
                }
            }

            buf[0] = (byte)c;
            if (gz_write(state, buf, 1) != 1)
            {
                return(-1);
            }
            return(c & 0xff);
        }
예제 #18
0
        public static int gzclose_w(gzFile_s *file)
        {
            int       ret = 0;
            gz_state *state;

            if (file == ((void *)0))
            {
                return(-2);
            }
            state = (gz_state *)file;
            if (state->mode != 31153)
            {
                return(-2);
            }
            if (state->seek != 0)
            {
                state->seek = 0;
                if (gz_zero(state, state->skip) == (-1))
                {
                    ret = state->err;
                }
            }

            if (gz_comp(state, 4) == (-1))
            {
                ret = state->err;
            }
            if (state->size != 0)
            {
                if (state->direct == 0)
                {
                    (void)deflateEnd(&state->strm); free(state->_out_);
                }
                free(state->_in_);
            }

            gz_error(state, 0, (void *)0);
            free(state->path);
            if (close(state->fd) == (-1))
            {
                ret = -1;
            }
            free(state);
            return(ret);
        }
예제 #19
0
        public static sbyte *gzerror(gzFile_s *file, int *errnum)
        {
            gz_state *state;

            if (file == ((void *)0))
            {
                return((void *)0);
            }
            state = (gz_state *)file;
            if ((state->mode != 7247) && (state->mode != 31153))
            {
                return((void *)0);
            }
            if (errnum != ((void *)0))
            {
                *errnum = state->err;
            }
            return(state->err == (-4)?"out of memory":(state->msg == ((void *)0)?"":state->msg));
        }
예제 #20
0
        public static int gzputs(gzFile_s *file, sbyte *str)
        {
            int       ret = 0;
            ulong     len = 0;
            gz_state *state;

            if (file == ((void *)0))
            {
                return(-1);
            }
            state = (gz_state *)file;
            if ((state->mode != 31153) || (state->err != 0))
            {
                return(-1);
            }
            len = strlen(str);
            ret = (int)gz_write(state, str, len);
            return((ret == 0) && (len != 0) ? -1 : ret);
        }
예제 #21
0
        public static int gzrewind(gzFile_s *file)
        {
            gz_state *state;

            if (file == ((void *)0))
            {
                return(-1);
            }
            state = (gz_state *)file;
            if ((state->mode != 7247) || ((state->err != 0) && (state->err != (-5))))
            {
                return(-1);
            }
            if (_lseeki64(state->fd, state->start, 0) == (-1))
            {
                return(-1);
            }
            gz_reset(state);
            return(0);
        }
예제 #22
0
        public static int gzwrite(gzFile_s *file, void *buf, uint len)
        {
            gz_state *state;

            if (file == ((void *)0))
            {
                return(0);
            }
            state = (gz_state *)file;
            if ((state->mode != 31153) || (state->err != 0))
            {
                return(0);
            }
            if (((int)len) < 0)
            {
                gz_error(state, -3, "requested length does not fit in int"); return(0);
            }

            return((int)gz_write(state, buf, len));
        }
예제 #23
0
        public static int gzsetparams(gzFile_s *file, int level, int strategy)
        {
            gz_state * state;
            z_stream_s strm;

            if (file == ((void *)0))
            {
                return(-2);
            }
            state = (gz_state *)file;
            strm  = &state->strm;
            if ((state->mode != 31153) || (state->err != 0))
            {
                return(-2);
            }
            if ((level == state->level) && (strategy == state->strategy))
            {
                return(0);
            }
            if (state->seek != 0)
            {
                state->seek = 0;
                if (gz_zero(state, state->skip) == (-1))
                {
                    return(state->err);
                }
            }

            if (state->size != 0)
            {
                if ((strm.avail_in != 0) && (gz_comp(state, 5) == (-1)))
                {
                    return(state->err);
                }
                deflateParams(strm, level, strategy);
            }

            state->level    = level;
            state->strategy = strategy;
            return(0);
        }
예제 #24
0
        public static void gzclearerr(gzFile_s *file)
        {
            gz_state *state;

            if (file == ((void *)0))
            {
                return;
            }
            state = (gz_state *)file;
            if ((state->mode != 7247) && (state->mode != 31153))
            {
                return;
            }
            if (state->mode == 7247)
            {
                state->eof  = 0;
                state->past = 0;
            }

            gz_error(state, (int)0, (void *)0);
        }
예제 #25
0
        public static ulong gzfread(void *buf, ulong size, ulong nitems, gzFile_s *file)
        {
            ulong     len = 0;
            gz_state *state;

            if (file == ((void *)0))
            {
                return(0);
            }
            state = (gz_state *)file;
            if ((state->mode != 7247) || ((state->err != 0) && (state->err != (-5))))
            {
                return(0);
            }
            len = nitems * size;
            if ((size != 0) && (len / size != nitems))
            {
                gz_error(state, -2, "request does not fit in a size_t"); return(0);
            }

            return(len != 0 ? gz_read(state, buf, len) / size : 0);
        }
예제 #26
0
        public static int gzgetc(gzFile_s *file)
        {
            int       ret = 0;
            byte *    buf = stackalloc byte[1];
            gz_state *state;

            if (file == ((void *)0))
            {
                return(-1);
            }
            state = (gz_state *)file;
            if ((state->mode != 7247) || ((state->err != 0) && (state->err != (-5))))
            {
                return(-1);
            }
            if (state->x.have != 0)
            {
                state->x.have--; state->x.pos++; return(*state->x.next++);
            }

            ret = (int)gz_read(state, buf, 1);
            return(ret < 1 ? -1 : buf[0]);
        }
예제 #27
0
        public static long gzseek64(gzFile_s *file, long offset, int whence)
        {
            uint      n   = 0;
            long      ret = 0;
            gz_state *state;

            if (file == ((void *)0))
            {
                return(-1);
            }
            state = (gz_state *)file;
            if ((state->mode != 7247) && (state->mode != 31153))
            {
                return(-1);
            }
            if ((state->err != 0) && (state->err != (-5)))
            {
                return(-1);
            }
            if ((whence != 0) && (whence != 1))
            {
                return(-1);
            }
            if (whence == 0)
            {
                offset -= state->x.pos;
            }
            else if (state->seek != 0)
            {
                offset += state->skip;
            }
            state->seek = 0;
            if ((state->mode == 7247) && (state->how == 1) && ((state->x.pos + offset) >= 0))
            {
                ret = (long)_lseeki64(state->fd, offset - state->x.have, 1); if (ret == (-1))
                {
                    return(-1);
                }
                state->x.have = 0;
                state->eof    = 0;
                state->past   = 0;
                state->seek   = 0;
                gz_error(state, (int)0, (void *)0); state->strm.avail_in = 0;
                state->x.pos += offset;
                return(state->x.pos);
            }

            if (offset < 0)
            {
                if (state->mode != 7247)
                {
                    return(-1);
                }
                offset += state->x.pos;
                if (offset < 0)
                {
                    return(-1);
                }
                if (gzrewind(file) == (-1))
                {
                    return(-1);
                }
            }

            if (state->mode == 7247)
            {
                n = (uint)(((==) && (state->x.have > 2147483647)) || (((long)state->x.have) > offset)?(uint)offset:state->x.have); state->x.have -= (uint)n; state->x.next += n; state->x.pos += (long)n; offset -= (long)n;
            }

            if (offset != 0)
            {
                state->seek = 1;
                state->skip = offset;
            }

            return(state->x.pos + offset);
        }
예제 #28
0
 public static int gzgetc_(gzFile_s *file)
 {
     return(gzgetc(file));
 }