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

📄 api.c

📁 完整的解压zip文件的源码。包含密码功能
💻 C
字号:
/*---------------------------------------------------------------------------  api.c  This module supplies an UnZip engine for use directly from C/C++  programs.  The functions are:    UzpVer *UzpVersion(void);    void UzpVersion2(UzpVer2 *version)    int UzpMain(int argc, char *argv[]);    int UzpAltMain(int argc, char *argv[], UzpInit *init);    int UzpValidate(char *archive, int AllCodes);    void UzpFreeMemBuffer(UzpBuffer *retstr);    int UzpUnzipToMemory(char *zip, char *file, UzpOpts *optflgs,                         UzpCB *UsrFuncts, UzpBuffer *retstr);  non-WINDLL only (a special WINDLL variant is defined in windll/windll.c):    int UzpGrep(char *archive, char *file, char *pattern, int cmd, int SkipBin,                UzpCB *UsrFuncts);  OS/2 only (for now):    int UzpFileTree(char *name, cbList(callBack), char *cpInclude[],          char *cpExclude[]);  You must define `DLL' in order to include the API extensions.  ---------------------------------------------------------------------------*/#ifdef OS2#  define  INCL_DOSMEMMGR#  include <os2.h>#endif#include <setjmp.h>#define UNZIP_INTERNAL#include "unzip.h"#include "version.h"#ifdef WINDLL#  include "windll/windll.h"#endif#ifdef DLL      /* This source file supplies DLL-only interface code. */jmp_buf dll_error_return;/*---------------------------------------------------------------------------    Documented API entry points  ---------------------------------------------------------------------------*/UzpVer * UZ_EXP UzpVersion()   /* should be pointer to const struct */{    static UzpVer version;     /* doesn't change between calls */    version.structlen = UZPVER_LEN;#ifdef BETA    version.flag = 1;#else    version.flag = 0;#endif    version.betalevel = BETALEVEL;    version.date = VERSION_DATE;#ifdef ZLIB_VERSION    version.zlib_version = ZLIB_VERSION;    version.flag |= 2;#else    version.zlib_version = NULL;#endif    /* someday each of these may have a separate patchlevel: */    version.unzip.major = UZ_MAJORVER;    version.unzip.minor = UZ_MINORVER;    version.unzip.patchlevel = PATCHLEVEL;    version.zipinfo.major = ZI_MAJORVER;    version.zipinfo.minor = ZI_MINORVER;    version.zipinfo.patchlevel = PATCHLEVEL;    /* these are retained for backward compatibility only: */    version.os2dll.major = UZ_MAJORVER;    version.os2dll.minor = UZ_MINORVER;    version.os2dll.patchlevel = PATCHLEVEL;    version.windll.major = UZ_MAJORVER;    version.windll.minor = UZ_MINORVER;    version.windll.patchlevel = PATCHLEVEL;    return &version;}void UZ_EXP UzpVersion2(UzpVer2 *version){    version->structlen = UZPVER_LEN;#ifdef BETA    version->flag = 1;#else    version->flag = 0;#endif    strcpy(version->betalevel, BETALEVEL);    strcpy(version->date, VERSION_DATE);#ifdef ZLIB_VERSION    strcpy(version->zlib_version, ZLIB_VERSION);    version->flag |= 2;#else    version->zlib_version[0] = '\0';#endif    /* someday each of these may have a separate patchlevel: */    version->unzip.major = UZ_MAJORVER;    version->unzip.minor = UZ_MINORVER;    version->unzip.patchlevel = PATCHLEVEL;    version->zipinfo.major = ZI_MAJORVER;    version->zipinfo.minor = ZI_MINORVER;    version->zipinfo.patchlevel = PATCHLEVEL;    /* these are retained for backward compatibility only: */    version->os2dll.major = UZ_MAJORVER;    version->os2dll.minor = UZ_MINORVER;    version->os2dll.patchlevel = PATCHLEVEL;    version->windll.major = UZ_MAJORVER;    version->windll.minor = UZ_MINORVER;    version->windll.patchlevel = PATCHLEVEL;}#ifndef WINDLLint UZ_EXP UzpAltMain(int argc, char *argv[], UzpInit *init){    int r, (*dummyfn)();    CONSTRUCTGLOBALS();    if (init->structlen >= (sizeof(ulg) + sizeof(dummyfn)) && init->msgfn)        G.message = init->msgfn;    if (init->structlen >= (sizeof(ulg) + 2*sizeof(dummyfn)) && init->inputfn)        G.input = init->inputfn;    if (init->structlen >= (sizeof(ulg) + 3*sizeof(dummyfn)) && init->pausefn)        G.mpause = init->pausefn;    if (init->structlen >= (sizeof(ulg) + 4*sizeof(dummyfn)) && init->userfn)        (*init->userfn)();    /* allow void* arg? */    r = unzip(__G__ argc, argv);    DESTROYGLOBALS()    RETURN(r);}#endif /* !WINDLL */#ifndef __16BIT__void UZ_EXP UzpFreeMemBuffer(UzpBuffer *retstr){    if (retstr->strptr != NULL) {        free(retstr->strptr);        retstr->strptr = NULL;    }}#ifndef WINDLLstatic int UzpDLL_Init OF((zvoid *pG, UzpCB *UsrFuncts));static int UzpDLL_Init(pG, UsrFuncts)zvoid *pG;UzpCB *UsrFuncts;{    int (*dummyfn)();    if (UsrFuncts->structlen >= (sizeof(ulg) + sizeof(dummyfn)) &&        UsrFuncts->msgfn)        ((Uz_Globs *)pG)->message = UsrFuncts->msgfn;    else        return FALSE;    if (UsrFuncts->structlen >= (sizeof(ulg) + 2*sizeof(dummyfn)) &&        UsrFuncts->inputfn)        ((Uz_Globs *)pG)->input = UsrFuncts->inputfn;    if (UsrFuncts->structlen >= (sizeof(ulg) + 3*sizeof(dummyfn)) &&        UsrFuncts->pausefn)        ((Uz_Globs *)pG)->mpause = UsrFuncts->pausefn;    if (UsrFuncts->structlen >= (sizeof(ulg) + 4*sizeof(dummyfn)) &&        UsrFuncts->passwdfn)        ((Uz_Globs *)pG)->decr_passwd = UsrFuncts->passwdfn;    if (UsrFuncts->structlen >= (sizeof(ulg) + 5*sizeof(dummyfn)) &&        UsrFuncts->statrepfn)        ((Uz_Globs *)pG)->statreportcb = UsrFuncts->statrepfn;    return TRUE;}int UZ_EXP UzpUnzipToMemory(char *zip, char *file, UzpOpts *optflgs,    UzpCB *UsrFuncts, UzpBuffer *retstr){    int r;#if (defined(WINDLL) && !defined(CRTL_CP_IS_ISO))    char *intern_zip, *intern_file;#endif    CONSTRUCTGLOBALS();#if (defined(WINDLL) && !defined(CRTL_CP_IS_ISO))    intern_zip = (char *)malloc(strlen(zip)+1);    if (intern_zip == NULL) {       DESTROYGLOBALS()       return PK_MEM;    }    intern_file = (char *)malloc(strlen(file)+1);    if (intern_file == NULL) {       DESTROYGLOBALS()       free(intern_zip);       return PK_MEM;    }    ISO_TO_INTERN(zip, intern_zip);    ISO_TO_INTERN(file, intern_file);#   define zip intern_zip#   define file intern_file#endif    /* Copy those options that are meaningful for UzpUnzipToMemory, instead of     * a simple "memcpy(G.UzO, optflgs, sizeof(UzpOpts));"     */    uO.pwdarg = optflgs->pwdarg;    uO.aflag = optflgs->aflag;    uO.C_flag = optflgs->C_flag;    uO.qflag = optflgs->qflag;  /* currently,  overridden in unzipToMemory */    if (!UzpDLL_Init((zvoid *)&G, UsrFuncts)) {       DESTROYGLOBALS();       return PK_BADERR;    }    G.redirect_data = 1;    r = (unzipToMemory(__G__ zip, file, retstr) <= PK_WARN);    DESTROYGLOBALS()#if (defined(WINDLL) && !defined(CRTL_CP_IS_ISO))#  undef file#  undef zip    free(intern_file);    free(intern_zip);#endif    if (!r && retstr->strlength) {       free(retstr->strptr);       retstr->strptr = NULL;    }    return r;}#endif /* !WINDLL */#endif /* !__16BIT__ */#ifdef OS2DLLint UZ_EXP UzpFileTree(char *name, cbList(callBack), char *cpInclude[],                char *cpExclude[]){    int r;    CONSTRUCTGLOBALS();    uO.qflag = 2;    uO.vflag = 1;    uO.C_flag = 1;    G.wildzipfn = name;    G.process_all_files = TRUE;    if (cpInclude) {        char **ptr = cpInclude;        while (*ptr != NULL) ptr++;        G.filespecs = ptr - cpInclude;        G.pfnames = cpInclude, G.process_all_files = FALSE;    }    if (cpExclude) {        char **ptr = cpExclude;        while (*ptr != NULL) ptr++;        G.xfilespecs = ptr - cpExclude;        G.pxnames = cpExclude, G.process_all_files = FALSE;    }    G.processExternally = callBack;    r = process_zipfiles(__G)==0;    DESTROYGLOBALS()    return r;}#endif /* OS2DLL *//*---------------------------------------------------------------------------    Helper functions  ---------------------------------------------------------------------------*/void setFileNotFound(__G)    __GDEF{    G.filenotfound++;}int unzipToMemory(__GPRO__ char *zip, char *file, UzpBuffer *retstr){    int r;    char *incname[2];    G.process_all_files = FALSE;    G.extract_flag = TRUE;    uO.qflag = 2;    G.wildzipfn = zip;    G.pfnames = incname;    incname[0] = file;    incname[1] = NULL;    G.filespecs = 1;    r = process_zipfiles(__G);    if (retstr) {        retstr->strptr = (char *)G.redirect_buffer;        retstr->strlength = G.redirect_size;    }    return r;                   /* returns `PK_???' error values */}int redirect_outfile(__G)     __GDEF{    if (G.redirect_size != 0 || G.redirect_buffer != NULL)        return FALSE;#ifndef NO_SLIDE_REDIR    G.redirect_slide = !G.pInfo->textmode;#endif    G.redirect_size = (G.pInfo->textmode ?                       G.lrec.ucsize * lenEOL : G.lrec.ucsize);#ifdef OS2    DosAllocMem((void **)&G.redirect_buffer, G.redirect_size+1,      PAG_READ|PAG_WRITE|PAG_COMMIT);    G.redirect_pointer = G.redirect_buffer;#else#ifdef __16BIT__    if ((ulg)((extent)G.redirect_size) != G.redirect_size)        return FALSE;#endif    G.redirect_pointer = G.redirect_buffer = malloc(G.redirect_size+1);#endif    if (!G.redirect_buffer)        return FALSE;    G.redirect_pointer[G.redirect_size] = '\0';    return TRUE;}int writeToMemory(__GPRO__ uch *rawbuf, ulg size){    if (rawbuf != G.redirect_pointer)        memcpy(G.redirect_pointer,rawbuf,size);    G.redirect_pointer += size;    return 0;}int close_redirect(__G)     __GDEF{    if (G.pInfo->textmode) {        *G.redirect_pointer = '\0';        G.redirect_size = G.redirect_pointer - G.redirect_buffer;        if ((G.redirect_buffer =             realloc(G.redirect_buffer, G.redirect_size + 1)) == NULL) {            G.redirect_size = 0;            return EOF;        }    }    return 0;}#ifndef __16BIT__#ifndef WINDLL/* Purpose: Determine if file in archive contains the string szSearch   Parameters: archive  = archive name               file     = file contained in the archive. This cannot be                          a wild card to be meaningful               pattern  = string to search for               cmd      = 0 - case-insensitive search                          1 - case-sensitve search                          2 - case-insensitive, whole words only                          3 - case-sensitive, whole words only               SkipBin  = if true, skip any files that have control                          characters other than CR, LF, or tab in the first                          100 characters.   Returns:    TRUE if a match is found               FALSE if no match is found               -1 on error   Comments: This does not pretend to be as useful as the standard             Unix grep, which returns the strings associated with a             particular pattern, nor does it search past the first             matching occurrence of the pattern. */int UZ_EXP UzpGrep(char *archive, char *file, char *pattern, int cmd,                   int SkipBin, UzpCB *UsrFuncts){    int retcode = FALSE, compare;    ulg i, j, patternLen, buflen;    char * sz, *p;    UzpOpts flgopts;    UzpBuffer retstr;    memzero(&flgopts, sizeof(UzpOpts));         /* no special options */    if (!UzpUnzipToMemory(archive, file, &flgopts, UsrFuncts, &retstr)) {       return -1;   /* not enough memory, file not found, or other error */    }    if (SkipBin) {        if (retstr.strlength < 100)            buflen = retstr.strlength;        else            buflen = 100;        for (i = 0; i < buflen; i++) {            if (iscntrl(retstr.strptr[i])) {                if ((retstr.strptr[i] != 0x0A) &&                    (retstr.strptr[i] != 0x0D) &&                    (retstr.strptr[i] != 0x09))                {                    /* OK, we now think we have a binary file of some sort */                    free(retstr.strptr);                    return FALSE;                }            }        }    }    patternLen = strlen(pattern);    if (retstr.strlength < patternLen) {        free(retstr.strptr);        return FALSE;    }    sz = malloc(patternLen + 3); /* add two in case doing whole words only */    if (cmd > 1) {        strcpy(sz, " ");        strcat(sz, pattern);        strcat(sz, " ");    } else        strcpy(sz, pattern);    if ((cmd == 0) || (cmd == 2)) {        for (i = 0; i < strlen(sz); i++)            sz[i] = toupper(sz[i]);        for (i = 0; i < retstr.strlength; i++)            retstr.strptr[i] = toupper(retstr.strptr[i]);    }    for (i = 0; i < (retstr.strlength - patternLen); i++) {        p = &retstr.strptr[i];        compare = TRUE;        for (j = 0; j < patternLen; j++) {            /* We cannot do strncmp here, as we may be dealing with a             * "binary" file, such as a word processing file, or perhaps             * even a true executable of some sort. */            if (p[j] != sz[j]) {                compare = FALSE;                break;            }        }        if (compare == TRUE) {            retcode = TRUE;            break;        }    }    free(sz);    free(retstr.strptr);    return retcode;}#endif /* !WINDLL */#endif /* !__16BIT__ */int UZ_EXP UzpValidate(char *archive, int AllCodes){    int retcode;    CONSTRUCTGLOBALS();    uO.jflag = 1;    uO.tflag = 1;    uO.overwrite_none = 0;    G.extract_flag = (!uO.zipinfo_mode &&                      !uO.cflag && !uO.tflag && !uO.vflag && !uO.zflag#ifdef TIMESTAMP                      && !uO.T_flag#endif                     );    uO.qflag = 2;                        /* turn off all messages */    G.fValidate = TRUE;    G.pfnames = (char **)&fnames[0];    /* assign default filename vector */#ifdef WINDLL    Wiz_NoPrinting(TRUE);#endif    if (archive == NULL) {      /* something is screwed up:  no filename */        DESTROYGLOBALS();        return PK_NOZIP;    }    G.wildzipfn = (char *)malloc(FILNAMSIZ + 1);    strcpy(G.wildzipfn, archive);#if (defined(WINDLL) && !defined(CRTL_CP_IS_ISO))    _ISO_INTERN(G.wildzipfn);#endif    G.process_all_files = TRUE;         /* for speed */    retcode = setjmp(dll_error_return);    if (retcode) {#ifdef WINDLL        Wiz_NoPrinting(FALSE);#endif        free(G.wildzipfn);        DESTROYGLOBALS();        return PK_BADERR;    }    retcode = process_zipfiles(__G);    free(G.wildzipfn);#ifdef WINDLL    Wiz_NoPrinting(FALSE);#endif    DESTROYGLOBALS();    /* PK_WARN == 1 and PK_FIND == 11. When we are just looking at an       archive, we should still be able to see the files inside it,       even if we can't decode them for some reason.       We also still want to be able to get at files even if there is       something odd about the zip archive, hence allow PK_WARN,       PK_FIND, IZ_UNSUP as well as PK_ERR     */    if (AllCodes)        return retcode;    if ((retcode == PK_OK) || (retcode == PK_WARN) || (retcode == PK_ERR) ||        (retcode == IZ_UNSUP) || (retcode == PK_FIND))        return TRUE;    else        return FALSE;}#endif /* DLL */

⌨️ 快捷键说明

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