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

📄 unzip.c

📁 psp上的reader 这个是以月光老大的cnreader为基础 增加了zip文件浏览功能
💻 C
📖 第 1 页 / 共 4 页
字号:
        return UNZ_PARAMERROR;    s=(unz_s*)file;    if (!s->current_file_ok)        return UNZ_END_OF_LIST_OF_FILE;    if (s->gi.number_entry != 0xffff)    /* 2^16 files overflow hack */      if (s->num_file+1==s->gi.number_entry)        return UNZ_END_OF_LIST_OF_FILE;    s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename +            s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ;    s->num_file++;    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;}/*  Try locate the file szFileName in the zipfile.  For the iCaseSensitivity signification, see unzipStringFileNameCompare  return value :  UNZ_OK if the file is found. It becomes the current file.  UNZ_END_OF_LIST_OF_FILE if the file is not found*/extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity)    unzFile file;    const char *szFileName;    int iCaseSensitivity;{    unz_s* s;    int err;    /* We remember the 'current' position in the file so that we can jump     * back there if we fail.     */    unz_file_info cur_file_infoSaved;    unz_file_info_internal cur_file_info_internalSaved;    uLong num_fileSaved;    uLong pos_in_central_dirSaved;    if (file==NULL)        return UNZ_PARAMERROR;    if (___strlen(szFileName)>=UNZ_MAXFILENAMEINZIP)        return UNZ_PARAMERROR;    s=(unz_s*)file;    if (!s->current_file_ok)        return UNZ_END_OF_LIST_OF_FILE;    /* Save the current state */    num_fileSaved = s->num_file;    pos_in_central_dirSaved = s->pos_in_central_dir;    cur_file_infoSaved = s->cur_file_info;    cur_file_info_internalSaved = s->cur_file_info_internal;    err = unzGoToFirstFile(file);    while (err == UNZ_OK)    {        char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1];        err = unzGetCurrentFileInfo(file,NULL,                                    szCurrentFileName,sizeof(szCurrentFileName)-1,                                    NULL,0,NULL,0);        if (err == UNZ_OK)        {            if (unzStringFileNameCompare(szCurrentFileName,                                            szFileName,iCaseSensitivity)==0)                return UNZ_OK;            err = unzGoToNextFile(file);        }    }    /* We failed, so restore the state of the 'current file' to where we     * were.     */    s->num_file = num_fileSaved ;    s->pos_in_central_dir = pos_in_central_dirSaved ;    s->cur_file_info = cur_file_infoSaved;    s->cur_file_info_internal = cur_file_info_internalSaved;    return err;}/*///////////////////////////////////////////// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net)// I need random access//// Further optimization could be realized by adding an ability// to cache the directory in memory. The goal being a single// comprehensive file read to put the file I need in a memory.*//*typedef struct unz_file_pos_s{    uLong pos_in_zip_directory;   // offset in file    uLong num_of_file;            // # of file} unz_file_pos;*/extern int ZEXPORT unzGetFilePos(file, file_pos)    unzFile file;    unz_file_pos* file_pos;{    unz_s* s;    if (file==NULL || file_pos==NULL)        return UNZ_PARAMERROR;    s=(unz_s*)file;    if (!s->current_file_ok)        return UNZ_END_OF_LIST_OF_FILE;    file_pos->pos_in_zip_directory  = s->pos_in_central_dir;    file_pos->num_of_file           = s->num_file;    return UNZ_OK;}extern int ZEXPORT unzGoToFilePos(file, file_pos)    unzFile file;    unz_file_pos* file_pos;{    unz_s* s;    int err;    if (file==NULL || file_pos==NULL)        return UNZ_PARAMERROR;    s=(unz_s*)file;    /* jump to the right spot */    s->pos_in_central_dir = file_pos->pos_in_zip_directory;    s->num_file           = file_pos->num_of_file;    /* set the current file */    err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,                                               &s->cur_file_info_internal,                                               NULL,0,NULL,0,NULL,0);    /* return results */    s->current_file_ok = (err == UNZ_OK);    return err;}/*// Unzip Helper Functions - should be here?///////////////////////////////////////////*//*  Read the local header of the current zipfile  Check the coherency of the local header and info in the end of central        directory about this file  store in *piSizeVar the size of extra info in local header        (filename and size of extra field data)*/local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar,                                                    poffset_local_extrafield,                                                    psize_local_extrafield)    unz_s* s;    uInt* piSizeVar;    uLong *poffset_local_extrafield;    uInt  *psize_local_extrafield;{    uLong uMagic,uData,uFlags;    uLong size_filename;    uLong size_extra_field;    int err=UNZ_OK;    *piSizeVar = 0;    *poffset_local_extrafield = 0;    *psize_local_extrafield = 0;    if (ZSEEK(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile +                                s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0)        return UNZ_ERRNO;    if (err==UNZ_OK)        if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)            err=UNZ_ERRNO;        else if (uMagic!=0x04034b50)            err=UNZ_BADZIPFILE;    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)        err=UNZ_ERRNO;/*    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion))        err=UNZ_BADZIPFILE;*/    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK)        err=UNZ_ERRNO;    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)        err=UNZ_ERRNO;    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method))        err=UNZ_BADZIPFILE;    if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) &&                         (s->cur_file_info.compression_method!=Z_DEFLATED))        err=UNZ_BADZIPFILE;    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */        err=UNZ_ERRNO;    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */        err=UNZ_ERRNO;    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) &&                              ((uFlags & 8)==0))        err=UNZ_BADZIPFILE;    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */        err=UNZ_ERRNO;    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) &&                              ((uFlags & 8)==0))        err=UNZ_BADZIPFILE;    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */        err=UNZ_ERRNO;    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) &&                              ((uFlags & 8)==0))        err=UNZ_BADZIPFILE;    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK)        err=UNZ_ERRNO;    else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename))        err=UNZ_BADZIPFILE;    *piSizeVar += (uInt)size_filename;    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK)        err=UNZ_ERRNO;    *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile +                                    SIZEZIPLOCALHEADER + size_filename;    *psize_local_extrafield = (uInt)size_extra_field;    *piSizeVar += (uInt)size_extra_field;    return err;}/*  Open for reading data the current file in the zipfile.  If there is no error and the file is opened, the return value is UNZ_OK.*/extern int ZEXPORT unzOpenCurrentFile3 (file, method, level, raw, password)    unzFile file;    int* method;    int* level;    int raw;    const char* password;{    int err=UNZ_OK;    uInt iSizeVar;    unz_s* s;    file_in_zip_read_info_s* pfile_in_zip_read_info;    uLong offset_local_extrafield;  /* offset of the local extra field */    uInt  size_local_extrafield;    /* size of the local extra field */#    ifndef NOUNCRYPT    char source[12];#    else    if (password != NULL)        return UNZ_PARAMERROR;#    endif    if (file==NULL)        return UNZ_PARAMERROR;    s=(unz_s*)file;    if (!s->current_file_ok)        return UNZ_PARAMERROR;    if (s->pfile_in_zip_read != NULL)        unzCloseCurrentFile(file);    if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar,                &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK)        return UNZ_BADZIPFILE;    pfile_in_zip_read_info = (file_in_zip_read_info_s*)                                        ALLOC(sizeof(file_in_zip_read_info_s));    if (pfile_in_zip_read_info==NULL)        return UNZ_INTERNALERROR;    pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE);    pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield;    pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;    pfile_in_zip_read_info->pos_local_extrafield=0;    pfile_in_zip_read_info->raw=raw;    if (pfile_in_zip_read_info->read_buffer==NULL)    {        TRYFREE(pfile_in_zip_read_info);        return UNZ_INTERNALERROR;    }    pfile_in_zip_read_info->stream_initialised=0;    if (method!=NULL)        *method = (int)s->cur_file_info.compression_method;    if (level!=NULL)    {        *level = 6;        switch (s->cur_file_info.flag & 0x06)        {          case 6 : *level = 1; break;          case 4 : *level = 2; break;          case 2 : *level = 9; break;        }    }    if ((s->cur_file_info.compression_method!=0) &&        (s->cur_file_info.compression_method!=Z_DEFLATED))        err=UNZ_BADZIPFILE;    pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc;    pfile_in_zip_read_info->crc32=0;    pfile_in_zip_read_info->compression_method =            s->cur_file_info.compression_method;    pfile_in_zip_read_info->filestream=s->filestream;    pfile_in_zip_read_info->z_filefunc=s->z_filefunc;    pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile;    pfile_in_zip_read_info->stream.total_out = 0;    if ((s->cur_file_info.compression_method==Z_DEFLATED) &&        (!raw))    {      pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;      pfile_in_zip_read_info->stream.zfree = (free_func)0;      pfile_in_zip_read_info->stream.opaque = (voidpf)0;      pfile_in_zip_read_info->stream.next_in = (voidpf)0;      pfile_in_zip_read_info->stream.avail_in = 0;      err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS);      if (err == Z_OK)        pfile_in_zip_read_info->stream_initialised=1;      else        return err;        /* windowBits is passed < 0 to tell that there is no zlib header.         * Note that in this case inflate *requires* an extra "dummy" byte         * after the compressed stream in order to complete decompression and         * return Z_STREAM_END.         * In unzip, i don't wait absolutely Z_STREAM_END because I known the         * size of both compressed and uncompressed data         */    }    pfile_in_zip_read_info->rest_read_compressed =            s->cur_file_info.compressed_size ;    pfile_in_zip_read_info->rest_read_uncompressed =            s->cur_file_info.uncompressed_size ;    pfile_in_zip_read_info->pos_in_zipfile =            s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER +              iSizeVar;    pfile_in_zip_read_info->stream.avail_in = (uInt)0;    s->pfile_in_zip_read = pfile_in_zip_read_info;#    ifndef NOUNCRYPT    if (password != NULL)    {        int i;        s->pcrc_32_tab = get_crc_table();        init_keys(password,s->keys,s->pcrc_32_tab);        if (ZSEEK(s->z_filefunc, s->filestream,                  s->pfile_in_zip_read->pos_in_zipfile +                     s->pfile_in_zip_read->byte_before_the_zipfile,                  SEEK_SET)!=0)            return UNZ_INTERNALERROR;        if(ZREAD(s->z_filefunc, s->filestream,source, 12)<12)            return UNZ_INTERNALERROR;        for (i = 0; i<12; i++)            zdecode(s->keys,s->pcrc_32_tab,source[i]);        s->pfile_in_zip_read->pos_in_zipfile+=12;        s->encrypted=1;    }#    endif    return UNZ_OK;}extern int ZEXPORT unzOpenCurrentFile (file)    unzFile file;{    return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL);}extern int ZEXPORT unzOpenCurrentFilePassword (file, password)    unzFile file;    const char* password;

⌨️ 快捷键说明

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