⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unzip.c

📁 psp上的reader 这个是以月光老大的cnreader为基础 增加了zip文件浏览功能
💻 C
📖 第 1 页 / 共 4 页
字号:
{    return unzOpenCurrentFile3(file, NULL, NULL, 0, password);}extern int ZEXPORT unzOpenCurrentFile2 (file,method,level,raw)    unzFile file;    int* method;    int* level;    int raw;{    return unzOpenCurrentFile3(file, method, level, raw, NULL);}/*  Read bytes from the current file.  buf contain buffer where data must be copied  len the size of buf.  return the number of byte copied if somes bytes are copied  return 0 if the end of file was reached  return <0 with error code if there is an error    (UNZ_ERRNO for IO error, or zLib error for uncompress error)*/extern int ZEXPORT unzReadCurrentFile  (file, buf, len)    unzFile file;    voidp buf;    unsigned len;{    int err=UNZ_OK;    uInt iRead = 0;    unz_s* s;    file_in_zip_read_info_s* pfile_in_zip_read_info;    if (file==NULL)        return UNZ_PARAMERROR;    s=(unz_s*)file;    pfile_in_zip_read_info=s->pfile_in_zip_read;    if (pfile_in_zip_read_info==NULL)        return UNZ_PARAMERROR;    if ((pfile_in_zip_read_info->read_buffer == NULL))        return UNZ_END_OF_LIST_OF_FILE;    if (len==0)        return 0;    pfile_in_zip_read_info->stream.next_out = (Bytef*)buf;    pfile_in_zip_read_info->stream.avail_out = (uInt)len;    if ((len>pfile_in_zip_read_info->rest_read_uncompressed) &&        (!(pfile_in_zip_read_info->raw)))        pfile_in_zip_read_info->stream.avail_out =            (uInt)pfile_in_zip_read_info->rest_read_uncompressed;    if ((len>pfile_in_zip_read_info->rest_read_compressed+           pfile_in_zip_read_info->stream.avail_in) &&         (pfile_in_zip_read_info->raw))        pfile_in_zip_read_info->stream.avail_out =            (uInt)pfile_in_zip_read_info->rest_read_compressed+            pfile_in_zip_read_info->stream.avail_in;    while (pfile_in_zip_read_info->stream.avail_out>0)    {        if ((pfile_in_zip_read_info->stream.avail_in==0) &&            (pfile_in_zip_read_info->rest_read_compressed>0))        {            uInt uReadThis = UNZ_BUFSIZE;            if (pfile_in_zip_read_info->rest_read_compressed<uReadThis)                uReadThis = (uInt)pfile_in_zip_read_info->rest_read_compressed;            if (uReadThis == 0)                return UNZ_EOF;            if (ZSEEK(pfile_in_zip_read_info->z_filefunc,                      pfile_in_zip_read_info->filestream,                      pfile_in_zip_read_info->pos_in_zipfile +                         pfile_in_zip_read_info->byte_before_the_zipfile,                         ZLIB_FILEFUNC_SEEK_SET)!=0)                return UNZ_ERRNO;            if (ZREAD(pfile_in_zip_read_info->z_filefunc,                      pfile_in_zip_read_info->filestream,                      pfile_in_zip_read_info->read_buffer,                      uReadThis)!=uReadThis)                return UNZ_ERRNO;#            ifndef NOUNCRYPT            if(s->encrypted)            {                uInt i;                for(i=0;i<uReadThis;i++)                  pfile_in_zip_read_info->read_buffer[i] =                      zdecode(s->keys,s->pcrc_32_tab,                              pfile_in_zip_read_info->read_buffer[i]);            }#            endif            pfile_in_zip_read_info->pos_in_zipfile += uReadThis;            pfile_in_zip_read_info->rest_read_compressed-=uReadThis;            pfile_in_zip_read_info->stream.next_in =                (Bytef*)pfile_in_zip_read_info->read_buffer;            pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis;        }        if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw))        {            uInt uDoCopy,i ;            if ((pfile_in_zip_read_info->stream.avail_in == 0) &&                (pfile_in_zip_read_info->rest_read_compressed == 0))                return (iRead==0) ? UNZ_EOF : iRead;            if (pfile_in_zip_read_info->stream.avail_out <                            pfile_in_zip_read_info->stream.avail_in)                uDoCopy = pfile_in_zip_read_info->stream.avail_out ;            else                uDoCopy = pfile_in_zip_read_info->stream.avail_in ;            for (i=0;i<uDoCopy;i++)                *(pfile_in_zip_read_info->stream.next_out+i) =                        *(pfile_in_zip_read_info->stream.next_in+i);            pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,                                pfile_in_zip_read_info->stream.next_out,                                uDoCopy);            pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy;            pfile_in_zip_read_info->stream.avail_in -= uDoCopy;            pfile_in_zip_read_info->stream.avail_out -= uDoCopy;            pfile_in_zip_read_info->stream.next_out += uDoCopy;            pfile_in_zip_read_info->stream.next_in += uDoCopy;            pfile_in_zip_read_info->stream.total_out += uDoCopy;            iRead += uDoCopy;        }        else        {            uLong uTotalOutBefore,uTotalOutAfter;            const Bytef *bufBefore;            uLong uOutThis;            int flush=Z_SYNC_FLUSH;            uTotalOutBefore = pfile_in_zip_read_info->stream.total_out;            bufBefore = pfile_in_zip_read_info->stream.next_out;            /*            if ((pfile_in_zip_read_info->rest_read_uncompressed ==                     pfile_in_zip_read_info->stream.avail_out) &&                (pfile_in_zip_read_info->rest_read_compressed == 0))                flush = Z_FINISH;            */            err=inflate(&pfile_in_zip_read_info->stream,flush);            if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL))              err = Z_DATA_ERROR;            uTotalOutAfter = pfile_in_zip_read_info->stream.total_out;            uOutThis = uTotalOutAfter-uTotalOutBefore;            pfile_in_zip_read_info->crc32 =                crc32(pfile_in_zip_read_info->crc32,bufBefore,                        (uInt)(uOutThis));            pfile_in_zip_read_info->rest_read_uncompressed -=                uOutThis;            iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);            if (err==Z_STREAM_END)                return (iRead==0) ? UNZ_EOF : iRead;            if (err!=Z_OK)                break;        }    }    if (err==Z_OK)        return iRead;    return err;}/*  Give the current position in uncompressed data*/extern z_off_t ZEXPORT unztell (file)    unzFile file;{    unz_s* s;    file_in_zip_read_info_s* pfile_in_zip_read_info;    if (file==NULL)        return UNZ_PARAMERROR;    s=(unz_s*)file;    pfile_in_zip_read_info=s->pfile_in_zip_read;    if (pfile_in_zip_read_info==NULL)        return UNZ_PARAMERROR;    return (z_off_t)pfile_in_zip_read_info->stream.total_out;}/*  return 1 if the end of file was reached, 0 elsewhere*/extern int ZEXPORT unzeof (file)    unzFile file;{    unz_s* s;    file_in_zip_read_info_s* pfile_in_zip_read_info;    if (file==NULL)        return UNZ_PARAMERROR;    s=(unz_s*)file;    pfile_in_zip_read_info=s->pfile_in_zip_read;    if (pfile_in_zip_read_info==NULL)        return UNZ_PARAMERROR;    if (pfile_in_zip_read_info->rest_read_uncompressed == 0)        return 1;    else        return 0;}/*  Read extra field from the current file (opened by unzOpenCurrentFile)  This is the local-header version of the extra field (sometimes, there is    more info in the local-header version than in the central-header)  if buf==NULL, it return the size of the local extra field that can be read  if buf!=NULL, len is the size of the buffer, the extra header is copied in    buf.  the return value is the number of bytes copied in buf, or (if <0)    the error code*/extern int ZEXPORT unzGetLocalExtrafield (file,buf,len)    unzFile file;    voidp buf;    unsigned len;{    unz_s* s;    file_in_zip_read_info_s* pfile_in_zip_read_info;    uInt read_now;    uLong size_to_read;    if (file==NULL)        return UNZ_PARAMERROR;    s=(unz_s*)file;    pfile_in_zip_read_info=s->pfile_in_zip_read;    if (pfile_in_zip_read_info==NULL)        return UNZ_PARAMERROR;    size_to_read = (pfile_in_zip_read_info->size_local_extrafield -                pfile_in_zip_read_info->pos_local_extrafield);    if (buf==NULL)        return (int)size_to_read;    if (len>size_to_read)        read_now = (uInt)size_to_read;    else        read_now = (uInt)len ;    if (read_now==0)        return 0;    if (ZSEEK(pfile_in_zip_read_info->z_filefunc,              pfile_in_zip_read_info->filestream,              pfile_in_zip_read_info->offset_local_extrafield +              pfile_in_zip_read_info->pos_local_extrafield,              ZLIB_FILEFUNC_SEEK_SET)!=0)        return UNZ_ERRNO;    if (ZREAD(pfile_in_zip_read_info->z_filefunc,              pfile_in_zip_read_info->filestream,              buf,read_now)!=read_now)        return UNZ_ERRNO;    return (int)read_now;}/*  Close the file in zip opened with unzipOpenCurrentFile  Return UNZ_CRCERROR if all the file was read but the CRC is not good*/extern int ZEXPORT unzCloseCurrentFile (file)    unzFile file;{    int err=UNZ_OK;    unz_s* s;    file_in_zip_read_info_s* pfile_in_zip_read_info;    if (file==NULL)        return UNZ_PARAMERROR;    s=(unz_s*)file;    pfile_in_zip_read_info=s->pfile_in_zip_read;    if (pfile_in_zip_read_info==NULL)        return UNZ_PARAMERROR;    if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) &&        (!pfile_in_zip_read_info->raw))    {        if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait)            err=UNZ_CRCERROR;    }    TRYFREE(pfile_in_zip_read_info->read_buffer);    pfile_in_zip_read_info->read_buffer = NULL;    if (pfile_in_zip_read_info->stream_initialised)        inflateEnd(&pfile_in_zip_read_info->stream);    pfile_in_zip_read_info->stream_initialised = 0;    TRYFREE(pfile_in_zip_read_info);    s->pfile_in_zip_read=NULL;    return err;}/*  Get the global comment string of the ZipFile, in the szComment buffer.  uSizeBuf is the size of the szComment buffer.  return the number of byte copied or an error code <0*/extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf)    unzFile file;    char *szComment;    uLong uSizeBuf;{    int err=UNZ_OK;    unz_s* s;    uLong uReadThis ;    if (file==NULL)        return UNZ_PARAMERROR;    s=(unz_s*)file;    uReadThis = uSizeBuf;    if (uReadThis>s->gi.size_comment)        uReadThis = s->gi.size_comment;    if (ZSEEK(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0)        return UNZ_ERRNO;    if (uReadThis>0)    {      *szComment='\0';      if (ZREAD(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis)        return UNZ_ERRNO;    }    if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment))        *(szComment+s->gi.size_comment)='\0';    return (int)uReadThis;}/* Additions by RX '2004 */extern uLong ZEXPORT unzGetOffset (file)    unzFile file;{    unz_s* s;    if (file==NULL)          return UNZ_PARAMERROR;    s=(unz_s*)file;    if (!s->current_file_ok)      return 0;    if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff)      if (s->num_file==s->gi.number_entry)         return 0;    return s->pos_in_central_dir;}extern int ZEXPORT unzSetOffset (file, pos)        unzFile file;        uLong pos;{    unz_s* s;    int err;    if (file==NULL)        return UNZ_PARAMERROR;    s=(unz_s*)file;    s->pos_in_central_dir = pos;    s->num_file = s->gi.number_entry;      /* hack */    err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,                                              &s->cur_file_info_internal,                                              NULL,0,NULL,0,NULL,0);    s->current_file_ok = (err == UNZ_OK);    return err;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -