Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:42.1:Staging:C
libzio
libzio-1.00.dif
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File libzio-1.00.dif of Package libzio
--- zio.c +++ zio.c 2013-02-26 16:40:47.165444637 +0000 @@ -42,6 +42,7 @@ static zio_int_t zseek(void *cookie, zio errno = EINVAL; return -1; } + off_t offset = (off_t)*poffset; return (zio_int_t)gzseek((gzFile)cookie, (z_off_t)(*poffset), whence); } @@ -74,8 +75,9 @@ static cookie_io_functions_t ioz = { # endif typedef struct bzfile_s { - size_t total_out; + size_t position; BZFILE *file; + FILE *stdio; char *mode; char *path; int fd; @@ -90,7 +92,7 @@ static ssize_t bzread(void *cookie, ch if (bzf->file) len = (ssize_t)BZ2_bzread(bzf->file, (void*)buf, count); if (len > 0) - bzf->total_out += len; + bzf->position += len; out: if (len < 0) errno = EINVAL; @@ -104,9 +106,9 @@ static ssize_t bzwrite(void *cookie, c if (!bzf) goto out; if (bzf->file) - len = (ssize_t)BZ2_bzread(bzf->file, (void*)buf, count); + len = (ssize_t)BZ2_bzwrite(bzf->file, (void*)buf, count); if (len > 0) - bzf->total_out += len; + bzf->position += len; out: if (len < 0) errno = EINVAL; @@ -116,24 +118,29 @@ out: static zio_int_t bzseek(void *cookie, zio_off_t *poffset, int whence) { bzfile_t *bzf = (bzfile_t*)cookie; - off_t offset = (off_t)*poffset; - off_t oldpos, newpos; + off_t offset, curpos, newpos; if (!bzf) { errno = EINVAL; return -1; } - oldpos = (off_t)bzf->total_out; + offset = (off_t)*poffset; + curpos = (off_t)bzf->position; + switch (whence) { case SEEK_SET: - if (offset < 0) + if (offset < 0) { + errno = EINVAL; return -1; + } newpos = offset; break; case SEEK_CUR: - if ((offset < 0 && (off_t)(-1 * offset) > oldpos) || (offset > 0 && (offset+oldpos) < oldpos)) + if ((offset < 0 && (off_t)(-1 * offset) > curpos) || (offset > 0 && (offset+curpos) < curpos)) { + errno = EINVAL; return -1; - newpos = (off_t)bzf->total_out + offset; + } + newpos = curpos + offset; break; case SEEK_END: newpos = -1; @@ -143,7 +150,7 @@ static zio_int_t bzseek(void *cookie, zi return -1; } - if (whence != SEEK_END && newpos < oldpos) { + if (whence != SEEK_END && newpos < curpos) { int status = BZ2_bzflush(bzf->file); BZ2_bzclose(bzf->file); if (status < 0) { @@ -163,27 +170,36 @@ static zio_int_t bzseek(void *cookie, zi errno = EINVAL; return -1; } - bzf->total_out = 0; + curpos = (off_t)0; + bzf->position = curpos; } - if (newpos == oldpos) - return oldpos; - else { + if (newpos == curpos) + goto out; + if (newpos == -1) { + char buf[1<<12]; + while (1) { + ssize_t got_size = BZ2_bzread(bzf->file, buf, sizeof(buf)); + if (got_size < 0) + return -1; + if (got_size == 0) + break; + curpos += got_size; + } + } else { char buf[1<<12]; - while (newpos > oldpos || newpos == -1) { - size_t req_size = MIN(sizeof(buf), newpos - oldpos); + while (newpos > curpos) { + size_t req_size = MIN(sizeof(buf), newpos - curpos); ssize_t got_size = BZ2_bzread(bzf->file, buf, req_size); - if (got_size != (ssize_t)(req_size)) { - if (got_size < 0) - return -1; - else { - newpos = oldpos + got_size; - break; - } - } - oldpos += got_size; + if (got_size < 0) + return -1; + if (got_size == 0) + break; + curpos += got_size; } - return newpos; } +out: + bzf->position = curpos; + return curpos; } static int bzclose(void *cookie) @@ -223,6 +239,7 @@ typedef struct lzfile_s { uint8_t buf[1<<12]; lzma_stream strm; FILE *file; + FILE *stdio; int encoding; int level; int what; @@ -291,9 +308,9 @@ static ssize_t lzmawrite(void *cookie, lzfile_t *lzma = (lzfile_t*)cookie; lzma_stream *strm; if (!lzma || !lzma->encoding) - return -1; + return -1; if (!count) - return 0; + return 0; strm = &lzma->strm; strm->next_in = (uint8_t*)buf; @@ -318,24 +335,31 @@ static ssize_t lzmawrite(void *cookie, static zio_int_t lzmaseek(void *cookie, zio_off_t *poffset, int whence) { lzfile_t *lzma = (lzfile_t*)cookie; - off_t offset = (off_t)*poffset; lzma_stream *strm; - off_t oldpos, newpos; - if (!lzma) + off_t offset, curpos, newpos; + if (!lzma) { + errno = EINVAL; return -1; + } + strm = &lzma->strm; + offset = (off_t)*poffset; + curpos = (off_t)strm->total_out; - oldpos = (off_t)strm->total_out; switch (whence) { case SEEK_SET: - if (offset < 0) + if (offset < 0) { + errno = EINVAL; return -1; + } newpos = offset; break; case SEEK_CUR: - if ((offset < 0 && (off_t)(-1 * offset) > oldpos) || (offset > 0 && (offset+oldpos) < oldpos)) + if ((offset < 0 && (off_t)(-1 * offset) > curpos) || (offset > 0 && (offset+curpos) < curpos)) { + errno = EINVAL; return -1; - newpos = (off_t)strm->total_out + offset; + } + newpos = curpos + offset; break; case SEEK_END: newpos = -1; @@ -344,37 +368,51 @@ static zio_int_t lzmaseek(void *cookie, errno = EINVAL; return -1; } - - if (whence != SEEK_END && newpos < oldpos) { + if (whence != SEEK_END && newpos < curpos) { lzma_ret ret; + lzma_end(strm); + lzma->strm = (lzma_stream)LZMA_STREAM_INIT; + strm = &lzma->strm; + rewind(lzma->file); + clearerr(lzma->file); + lzma->eof = 0; + ret = lzmaopen(strm, lzma->encoding ? 'w' : 'r', lzma->what, lzma->level); if (ret != LZMA_OK || strm->total_out != 0) { fclose(lzma->file); errno = EINVAL; return -1; } + curpos = (off_t)0; } - if (newpos == oldpos) - return oldpos; - else { + if (newpos == curpos) + goto out; + if (newpos == -1) { + char buf[sizeof(lzma->buf)]; + while (1) { + ssize_t got_size = lzmaread(cookie, buf, sizeof(buf)); + if (got_size < 0) + return -1; + if (got_size == 0) + break; + curpos += got_size; + } + } else { char buf[sizeof(lzma->buf)]; - while (newpos > oldpos || newpos == -1) { - size_t req_size = MIN(sizeof(buf), newpos - oldpos); + while (newpos > curpos) { + size_t req_size = MIN(sizeof(buf), newpos - curpos); ssize_t got_size = lzmaread(cookie, buf, req_size); - if (got_size != (ssize_t)(req_size)) { - if (got_size < 0) - return -1; - else { - newpos = oldpos + got_size; - break; - } - } - oldpos += got_size; + if (got_size < 0) + return -1; + if (got_size == 0) + break; + curpos += got_size; } - return newpos; } +out: + return curpos; } static int lzmaclose(void *cookie) @@ -466,8 +504,9 @@ static cookie_io_functions_t iolzma = { #endif /* !HAS_LZMA_H */ typedef struct lzwfile_s { - size_t total_out; + size_t position; LZW_t *file; + FILE *stdio; char *mode; char *path; int fd; @@ -482,7 +521,7 @@ static ssize_t lzwread(void *cookie, c if (lzw->file) len = readlzw(lzw->file, buf, count); if (len > 0) - lzw->total_out += len; + lzw->position += len; out: if (len < 0) errno = EINVAL; @@ -498,24 +537,29 @@ static ssize_t lzwwrite(void *cookie, static zio_int_t lzwseek(void *cookie, zio_off_t *poffset, int whence) { lzwfile_t *lzw = (lzwfile_t*)cookie; - off_t offset = (off_t)*poffset; - off_t oldpos, newpos; + off_t offset, curpos, newpos; if (!lzw) { errno = EINVAL; return -1; } - oldpos = (off_t)lzw->total_out; + offset = (off_t)*poffset; + curpos = (off_t)lzw->position; + switch (whence) { case SEEK_SET: - if (offset < 0) + if (offset < 0) { + errno = EINVAL; return -1; + } newpos = offset; break; case SEEK_CUR: - if ((offset < 0 && (off_t)(-1 * offset) > oldpos) || (offset > 0 && (offset+oldpos) < oldpos)) + if ((offset < 0 && (off_t)(-1 * offset) > curpos) || (offset > 0 && (offset+curpos) < curpos)) { + errno = EINVAL; return -1; - newpos = (off_t)lzw->total_out + offset; + } + newpos = curpos + offset; break; case SEEK_END: newpos = -1; @@ -525,7 +569,7 @@ static zio_int_t lzwseek(void *cookie, z return -1; } - if (whence != SEEK_END && newpos < oldpos) { + if (whence != SEEK_END && newpos < curpos) { closelzw(lzw->file); if (lzw->fd >= 0) { lseek(lzw->fd, 0, SEEK_SET); @@ -540,27 +584,36 @@ static zio_int_t lzwseek(void *cookie, z errno = EINVAL; return -1; } - lzw->total_out = 0; + curpos = (off_t)0; + lzw->position = curpos; } - if (newpos == oldpos) - return oldpos; - else { + if (newpos == curpos) + goto out; + if (newpos == -1) { + char buf[1<<12]; + while (1) { + ssize_t got_size = readlzw(lzw->file, buf, sizeof(buf)); + if (got_size < 0) + return -1; + if (got_size == 0) + break; + curpos += got_size; + } + } else { char buf[1<<12]; - while (newpos > oldpos || newpos == -1) { - size_t req_size = MIN(sizeof(buf), newpos - oldpos); + while (newpos > curpos) { + size_t req_size = MIN(sizeof(buf), newpos - curpos); ssize_t got_size = readlzw(lzw->file, buf, req_size); - if (got_size != (ssize_t)(req_size)) { - if (got_size < 0) - return -1; - else { - newpos = oldpos + got_size; - break; - } - } - oldpos += got_size; + if (got_size < 0) + return -1; + if (got_size == 0) + break; + curpos += got_size; } - return newpos; } +out: + lzw->position = curpos; + return curpos; } static int lzwclose(void *cookie) @@ -787,6 +840,7 @@ FILE * fzopen(const char * path, const c if (ret->_fileno < 0) ret->_fileno = 0; # endif + cookie->stdio = ret; } break; case 'b': @@ -834,6 +888,7 @@ FILE * fzopen(const char * path, const c if (ret->_fileno < 0) ret->_fileno = 0; # endif + cookie->stdio = ret; } #else /* !HAS_BZLIB_H */ errno = ENOTSUP; @@ -892,6 +947,7 @@ FILE * fzopen(const char * path, const c if (ret->_fileno < 0) ret->_fileno = 0; # endif + cookie->stdio = ret; } break; #else /* !HAS_LZMA_H */ @@ -928,6 +984,7 @@ FILE * fzopen(const char * path, const c if (ret->_fileno < 0) ret->_fileno = 0; # endif + cookie->stdio = ret; } # else /* !HAS_LZMADEC_H */ errno = ENOTSUP; @@ -1048,6 +1105,7 @@ FILE * fdzopen(int fildes, const char * if (ret->_fileno < 0) ret->_fileno = 0; # endif + cookie->stdio = ret; } break; case 'b': @@ -1097,6 +1155,7 @@ FILE * fdzopen(int fildes, const char * if (ret->_fileno < 0) ret->_fileno = 0; # endif + cookie->stdio = ret; } #else /* !HAS_BZLIB_H */ errno = ENOTSUP; @@ -1137,6 +1196,7 @@ FILE * fdzopen(int fildes, const char * cookie->level = level; cookie->encoding = (check[0] == 'w') ? 1 : 0; lret = lzmaopen(&cookie->strm, check[0], *what, level); + if (lret != LZMA_OK) { fclose(cookie->file); free(cookie); @@ -1154,6 +1214,7 @@ FILE * fdzopen(int fildes, const char * if (ret->_fileno < 0) ret->_fileno = 0; # endif + cookie->stdio = ret; } break; #else /* !HAS_LZMA_H */ @@ -1190,6 +1251,7 @@ FILE * fdzopen(int fildes, const char * if (ret->_fileno < 0) ret->_fileno = 0; # endif + cookie->stdio = ret; } # else /* !HAS_LZMADEC_H */ errno = ENOTSUP;
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor