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

📄 unzip.c

📁 psp上的reader 这个是以月光老大的cnreader为基础 增加了zip文件浏览功能
💻 C
📖 第 1 页 / 共 4 页
字号:
extern unzFile ZEXPORT unzOpen2 (path, pzlib_filefunc_def)    const char *path;    zlib_filefunc_def* pzlib_filefunc_def;{    unz_s us;    unz_s *s;    uLong central_pos,uL;    uLong number_disk;          /* number of the current dist, used for                                   spaning ZIP, unsupported, always 0*/    uLong number_disk_with_CD;  /* number the the disk with central dir, used                                   for spaning ZIP, unsupported, always 0*/    uLong number_entry_CD;      /* total number of entries in                                   the central dir                                   (same than number_entry on nospan) */    int err=UNZ_OK;    if (unz_copyright[0]!=' ')        return NULL;    if (pzlib_filefunc_def==NULL)        fill_fopen_filefunc(&us.z_filefunc);    else        us.z_filefunc = *pzlib_filefunc_def;    us.filestream= (*(us.z_filefunc.zopen_file))(us.z_filefunc.opaque,                                                 path,                                                 ZLIB_FILEFUNC_MODE_READ |                                                 ZLIB_FILEFUNC_MODE_EXISTING);    if (us.filestream==NULL)        return NULL;    central_pos = unzlocal_SearchCentralDir(&us.z_filefunc,us.filestream);    if (central_pos==0)        err=UNZ_ERRNO;    if (ZSEEK(us.z_filefunc, us.filestream,                                      central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)        err=UNZ_ERRNO;    /* the signature, already checked */    if (unzlocal_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)        err=UNZ_ERRNO;    /* number of this disk */    if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK)        err=UNZ_ERRNO;    /* number of the disk with the start of the central directory */    if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK)        err=UNZ_ERRNO;    /* total number of entries in the central dir on this disk */    if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK)        err=UNZ_ERRNO;    /* total number of entries in the central dir */    if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK)        err=UNZ_ERRNO;    if ((number_entry_CD!=us.gi.number_entry) ||        (number_disk_with_CD!=0) ||        (number_disk!=0))        err=UNZ_BADZIPFILE;    /* size of the central directory */    if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK)        err=UNZ_ERRNO;    /* offset of start of central directory with respect to the          starting disk number */    if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK)        err=UNZ_ERRNO;    /* zipfile comment length */    if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK)        err=UNZ_ERRNO;    if ((central_pos<us.offset_central_dir+us.size_central_dir) &&        (err==UNZ_OK))        err=UNZ_BADZIPFILE;    if (err!=UNZ_OK)    {        ZCLOSE(us.z_filefunc, us.filestream);        return NULL;    }    us.byte_before_the_zipfile = central_pos -                            (us.offset_central_dir+us.size_central_dir);    us.central_pos = central_pos;    us.pfile_in_zip_read = NULL;    us.encrypted = 0;    s=(unz_s*)ALLOC(sizeof(unz_s));    *s=us;    unzGoToFirstFile((unzFile)s);    return (unzFile)s;}extern unzFile ZEXPORT unzOpen (path)    const char *path;{    return unzOpen2(path, NULL);}/*  Close a ZipFile opened with unzipOpen.  If there is files inside the .Zip opened with unzipOpenCurrentFile (see later),    these files MUST be closed with unzipCloseCurrentFile before call unzipClose.  return UNZ_OK if there is no problem. */extern int ZEXPORT unzClose (file)    unzFile file;{    unz_s* s;    if (file==NULL)        return UNZ_PARAMERROR;    s=(unz_s*)file;    if (s->pfile_in_zip_read!=NULL)        unzCloseCurrentFile(file);    ZCLOSE(s->z_filefunc, s->filestream);    TRYFREE(s);    return UNZ_OK;}/*  Write info about the ZipFile in the *pglobal_info structure.  No preparation of the structure is needed  return UNZ_OK if there is no problem. */extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info)    unzFile file;    unz_global_info *pglobal_info;{    unz_s* s;    if (file==NULL)        return UNZ_PARAMERROR;    s=(unz_s*)file;    *pglobal_info=s->gi;    return UNZ_OK;}/*   Translate date/time from Dos format to tm_unz (readable more easilty)*/local void unzlocal_DosDateToTmuDate (ulDosDate, ptm)    uLong ulDosDate;    tm_unz* ptm;{    uLong uDate;    uDate = (uLong)(ulDosDate>>16);    ptm->tm_mday = (uInt)(uDate&0x1f) ;    ptm->tm_mon =  (uInt)((((uDate)&0x1E0)/0x20)-1) ;    ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ;    ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800);    ptm->tm_min =  (uInt) ((ulDosDate&0x7E0)/0x20) ;    ptm->tm_sec =  (uInt) (2*(ulDosDate&0x1f)) ;}/*  Get Info about the current file in the zipfile, with internal only info*/local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file,                                                  unz_file_info *pfile_info,                                                  unz_file_info_internal                                                  *pfile_info_internal,                                                  char *szFileName,                                                  uLong fileNameBufferSize,                                                  void *extraField,                                                  uLong extraFieldBufferSize,                                                  char *szComment,                                                  uLong commentBufferSize));local int unzlocal_GetCurrentFileInfoInternal (file,                                              pfile_info,                                              pfile_info_internal,                                              szFileName, fileNameBufferSize,                                              extraField, extraFieldBufferSize,                                              szComment,  commentBufferSize)    unzFile file;    unz_file_info *pfile_info;    unz_file_info_internal *pfile_info_internal;    char *szFileName;    uLong fileNameBufferSize;    void *extraField;    uLong extraFieldBufferSize;    char *szComment;    uLong commentBufferSize;{    unz_s* s;    unz_file_info file_info;    unz_file_info_internal file_info_internal;    int err=UNZ_OK;    uLong uMagic;    long lSeek=0;    if (file==NULL)        return UNZ_PARAMERROR;    s=(unz_s*)file;    if (ZSEEK(s->z_filefunc, s->filestream,              s->pos_in_central_dir+s->byte_before_the_zipfile,              ZLIB_FILEFUNC_SEEK_SET)!=0)        err=UNZ_ERRNO;    /* we check the magic */    if (err==UNZ_OK)        if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)            err=UNZ_ERRNO;        else if (uMagic!=0x02014b50)            err=UNZ_BADZIPFILE;    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK)        err=UNZ_ERRNO;    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK)        err=UNZ_ERRNO;    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK)        err=UNZ_ERRNO;    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK)        err=UNZ_ERRNO;    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK)        err=UNZ_ERRNO;    unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date);    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK)        err=UNZ_ERRNO;    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK)        err=UNZ_ERRNO;    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK)        err=UNZ_ERRNO;    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK)        err=UNZ_ERRNO;    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK)        err=UNZ_ERRNO;    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK)        err=UNZ_ERRNO;    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK)        err=UNZ_ERRNO;    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK)        err=UNZ_ERRNO;    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK)        err=UNZ_ERRNO;    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK)        err=UNZ_ERRNO;    lSeek+=file_info.size_filename;    if ((err==UNZ_OK) && (szFileName!=NULL))    {        uLong uSizeRead ;        if (file_info.size_filename<fileNameBufferSize)        {            *(szFileName+file_info.size_filename)='\0';            uSizeRead = file_info.size_filename;        }        else            uSizeRead = fileNameBufferSize;        if ((file_info.size_filename>0) && (fileNameBufferSize>0))            if (ZREAD(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead)                err=UNZ_ERRNO;        lSeek -= uSizeRead;    }    if ((err==UNZ_OK) && (extraField!=NULL))    {        uLong uSizeRead ;        if (file_info.size_file_extra<extraFieldBufferSize)            uSizeRead = file_info.size_file_extra;        else            uSizeRead = extraFieldBufferSize;        if (lSeek!=0)            if (ZSEEK(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)                lSeek=0;            else                err=UNZ_ERRNO;        if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0))            if (ZREAD(s->z_filefunc, s->filestream,extraField,uSizeRead)!=uSizeRead)                err=UNZ_ERRNO;        lSeek += file_info.size_file_extra - uSizeRead;    }    else        lSeek+=file_info.size_file_extra;    if ((err==UNZ_OK) && (szComment!=NULL))    {        uLong uSizeRead ;        if (file_info.size_file_comment<commentBufferSize)        {            *(szComment+file_info.size_file_comment)='\0';            uSizeRead = file_info.size_file_comment;        }        else            uSizeRead = commentBufferSize;        if (lSeek!=0)            if (ZSEEK(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)                lSeek=0;            else                err=UNZ_ERRNO;        if ((file_info.size_file_comment>0) && (commentBufferSize>0))            if (ZREAD(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead)                err=UNZ_ERRNO;        lSeek+=file_info.size_file_comment - uSizeRead;    }    else        lSeek+=file_info.size_file_comment;    if ((err==UNZ_OK) && (pfile_info!=NULL))        *pfile_info=file_info;    if ((err==UNZ_OK) && (pfile_info_internal!=NULL))        *pfile_info_internal=file_info_internal;    return err;}/*  Write info about the ZipFile in the *pglobal_info structure.  No preparation of the structure is needed  return UNZ_OK if there is no problem.*/extern int ZEXPORT unzGetCurrentFileInfo (file,                                          pfile_info,                                          szFileName, fileNameBufferSize,                                          extraField, extraFieldBufferSize,                                          szComment,  commentBufferSize)    unzFile file;    unz_file_info *pfile_info;    char *szFileName;    uLong fileNameBufferSize;    void *extraField;    uLong extraFieldBufferSize;    char *szComment;    uLong commentBufferSize;{    return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL,                                                szFileName,fileNameBufferSize,                                                extraField,extraFieldBufferSize,                                                szComment,commentBufferSize);}/*  Set the current file of the zipfile to the first file.  return UNZ_OK if there is no problem*/extern int ZEXPORT unzGoToFirstFile (file)    unzFile file;{    int err=UNZ_OK;    unz_s* s;    if (file==NULL)        return UNZ_PARAMERROR;    s=(unz_s*)file;    s->pos_in_central_dir=s->offset_central_dir;    s->num_file=0;    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;}/*  Set the current file of the zipfile to the next file.  return UNZ_OK if there is no problem  return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.*/extern int ZEXPORT unzGoToNextFile (file)    unzFile file;{    unz_s* s;    int err;    if (file==NULL)

⌨️ 快捷键说明

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