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

📄 extract.c

📁 压缩解压,是unzip540的升级,这个外国网站摘来的源码,是evb编写.
💻 C
📖 第 1 页 / 共 5 页
字号:
                error_in_archive = PK_BADERR;                continue;   /* can still do next file */            }            G.inptr = G.inbuf + (int)inbuf_offset;            G.incnt -= (int)inbuf_offset;        } else {            G.incnt += (int)(G.inptr-G.inbuf) - (int)inbuf_offset;            G.inptr = G.inbuf + (int)inbuf_offset;        }        /* should be in proper position now, so check for sig */        if (readbuf(__G__ G.sig, 4) == 0) {  /* bad offset */            Info(slide, 0x401, ((char *)slide, LoadFarString(OffsetMsg),              *pfilnum, "EOF", (long)request));            error_in_archive = PK_BADERR;            continue;   /* but can still try next one */        }        if (strncmp(G.sig, local_hdr_sig, 4)) {            Info(slide, 0x401, ((char *)slide, LoadFarString(OffsetMsg),              *pfilnum, LoadFarStringSmall(LocalHdrSig), (long)request));            /*                GRRDUMP(G.sig, 4)                GRRDUMP(local_hdr_sig, 4)             */            error_in_archive = PK_ERR;            if ((*pfilnum == 1 && G.extra_bytes != 0L) ||                (G.extra_bytes == 0L && *pold_extra_bytes != 0L)) {                Info(slide, 0x401, ((char *)slide,                  LoadFarString(AttemptRecompensate)));                if (G.extra_bytes) {                    *pold_extra_bytes = G.extra_bytes;                    G.extra_bytes = 0L;                } else                    G.extra_bytes = *pold_extra_bytes; /* third attempt */                if (((error = seek_zipf(__G__ G.pInfo->offset)) != PK_OK) ||                    (readbuf(__G__ G.sig, 4) == 0)) {  /* bad offset */                    if (error != PK_BADERR)                      Info(slide, 0x401, ((char *)slide,                        LoadFarString(OffsetMsg), *pfilnum, "EOF",                        (long)request));                    error_in_archive = PK_BADERR;                    continue;   /* but can still try next one */                }                if (strncmp(G.sig, local_hdr_sig, 4)) {                    Info(slide, 0x401, ((char *)slide,                      LoadFarString(OffsetMsg), *pfilnum,                      LoadFarStringSmall(LocalHdrSig), (long)request));                    error_in_archive = PK_BADERR;                    continue;                }            } else                continue;  /* this one hosed; try next */        }        if ((error = process_local_file_hdr(__G)) != PK_COOL) {            Info(slide, 0x421, ((char *)slide, LoadFarString(BadLocalHdr),              *pfilnum));            error_in_archive = error;   /* only PK_EOF defined */            continue;   /* can still try next one */        }        if ((error = do_string(__G__ G.lrec.filename_length, DS_FN_L)) !=             PK_COOL)        {            if (error > error_in_archive)                error_in_archive = error;            if (error > PK_WARN) {                Info(slide, 0x401, ((char *)slide, LoadFarString(FilNamMsg),                  FnFilter1(G.filename), "local"));                continue;   /* go on to next one */            }        }#ifndef SFX        if (G.pInfo->cfilname != (char Far *)NULL) {            if (zfstrcmp(G.pInfo->cfilname, G.filename) != 0) {#  ifdef SMALL_MEM                char *temp_cfilnam = slide + (7 * (WSIZE>>3));                zfstrcpy((char Far *)temp_cfilnam, G.pInfo->cfilname);#    define  cFile_PrintBuf  temp_cfilnam#  else#    define  cFile_PrintBuf  G.pInfo->cfilname#  endif                Info(slide, 0x401, ((char *)slide,                  LoadFarStringSmall2(LvsCFNamMsg),                  FnFilter2(cFile_PrintBuf), FnFilter1(G.filename)));#  undef    cFile_PrintBuf                zfstrcpy(G.filename, G.pInfo->cfilname);                if (error_in_archive < PK_WARN)                    error_in_archive = PK_WARN;            }            zffree(G.pInfo->cfilname);            G.pInfo->cfilname = (char Far *)NULL;        }#endif /* !SFX */        if (G.lrec.compression_method == STORED) {            ulg csiz_decrypted = G.lrec.csize;            if (G.pInfo->encrypted)                csiz_decrypted -= 12;            if (G.lrec.ucsize != csiz_decrypted) {                Info(slide, 0x401, ((char *)slide,                  LoadFarStringSmall2(WrnStorUCSizCSizDiff),                  FnFilter1(G.filename), G.lrec.ucsize, csiz_decrypted));                G.lrec.ucsize = csiz_decrypted;                if (error_in_archive < PK_WARN)                    error_in_archive = PK_WARN;            }        }        if (G.extra_field != (uch *)NULL) {            free(G.extra_field);            G.extra_field = (uch *)NULL;        }        if ((error =             do_string(__G__ G.lrec.extra_field_length, EXTRA_FIELD)) != 0)        {            if (error > error_in_archive)                error_in_archive = error;            if (error > PK_WARN) {                Info(slide, 0x401, ((char *)slide,                  LoadFarString(ExtFieldMsg),                  FnFilter1(G.filename), "local"));                continue;   /* go on */            }        }#if CRYPT        if (G.pInfo->encrypted &&            (error = decrypt(__G__ uO.pwdarg)) != PK_COOL) {            if (error == PK_WARN) {                if (!((uO.tflag && uO.qflag) || (!uO.tflag && !QCOND2)))                    Info(slide, 0x401, ((char *)slide,                      LoadFarString(SkipIncorrectPasswd),                      FnFilter1(G.filename)));                ++(*pnum_bad_pwd);            } else {  /* (error > PK_WARN) */                if (error > error_in_archive)                    error_in_archive = error;                Info(slide, 0x401, ((char *)slide,                  LoadFarString(SkipCannotGetPasswd),                  FnFilter1(G.filename)));            }            continue;   /* go on to next file */        }#endif /* CRYPT */        /*         * just about to extract file:  if extracting to disk, check if         * already exists, and if so, take appropriate action according to         * fflag/uflag/overwrite_all/etc. (we couldn't do this in upper         * loop because we don't store the possibly renamed filename[] in         * info[])         */#ifdef DLL        if (!uO.tflag && !uO.cflag && !G.redirect_data)#else        if (!uO.tflag && !uO.cflag)#endif        {            renamed = FALSE;   /* user hasn't renamed output file yet */startover:            query = FALSE;            skip_entry = SKIP_NO;            /* for files from DOS FAT, check for use of backslash instead             *  of slash as directory separator (bug in some zipper(s); so             *  far, not a problem in HPFS, NTFS or VFAT systems)             */#ifndef SFX            if (G.pInfo->hostnum == FS_FAT_ && !MBSCHR(G.filename, '/')) {                char *p=G.filename;                if (*p) do {                    if (*p == '\\') {                        if (!G.reported_backslash) {                            Info(slide, 0x21, ((char *)slide,                              LoadFarString(BackslashPathSep), G.zipfn));                            G.reported_backslash = TRUE;                            if (!error_in_archive)                                error_in_archive = PK_WARN;                        }                        *p = '/';                    }                } while (*PREINCSTR(p));            }#endif /* !SFX */            if (!renamed) {               /* remove absolute path specs */               if (G.filename[0] == '/') {                   Info(slide, 0x401, ((char *)slide,                        LoadFarString(AbsolutePathWarning),                        FnFilter1(G.filename)));                   if (!error_in_archive)                       error_in_archive = PK_WARN;                   do {                       char *p = G.filename + 1;                       do {                           *(p-1) = *p;                       } while (*p++ != '\0');                   } while (G.filename[0] == '/');               }            }            /* mapname can create dirs if not freshening or if renamed */            error = mapname(__G__ renamed);            if ((errcode = error & ~MPN_MASK) != PK_OK &&                error_in_archive < errcode)                error_in_archive = errcode;            if ((errcode = error & MPN_MASK) > MPN_INF_TRUNC) {                if (errcode == MPN_CREATED_DIR) {#ifdef SET_DIR_ATTRIB                    direntry *d_entry;                    error = defer_dir_attribs(__G__ &d_entry);                    if (d_entry == (direntry *)NULL) {                        /* There may be no dir_attribs info available, or                         * we have encountered a mem allocation error.                         * In case of an error, report it and set program                         * error state to warning level.                         */                        if (error) {                            Info(slide, 0x401, ((char *)slide,                                 LoadFarString(DirlistEntryNoMem)));                            if (!error_in_archive)                                error_in_archive = PK_WARN;                        }                    } else {                        d_entry->next = (*pdirlist);                        (*pdirlist) = d_entry;                        ++(*pnum_dirs);                    }#endif /* SET_DIR_ATTRIB */                } else if (errcode == MPN_VOL_LABEL) {#ifdef DOS_OS2_W32                    Info(slide, 0x401, ((char *)slide,                      LoadFarString(SkipVolumeLabel),                      FnFilter1(G.filename),                      uO.volflag? "hard disk " : ""));#else                    Info(slide, 1, ((char *)slide,                      LoadFarString(SkipVolumeLabel),                      FnFilter1(G.filename), ""));#endif                } else if (errcode > MPN_INF_SKIP &&                           error_in_archive < PK_ERR)                    error_in_archive = PK_ERR;                Trace((stderr, "mapname(%s) returns error code = %d\n",                  FnFilter1(G.filename), error));                continue;   /* go on to next file */            }#ifdef QDOS            QFilename(__G__ G.filename);#endif            switch (check_for_newer(__G__ G.filename)) {                case DOES_NOT_EXIST:#ifdef NOVELL_BUG_FAILSAFE                    G.dne = TRUE;   /* stat() says file DOES NOT EXIST */#endif                    /* freshen (no new files): skip unless just renamed */                    if (uO.fflag && !renamed)                        skip_entry = SKIP_Y_NONEXIST;                    break;                case EXISTS_AND_OLDER:#ifdef UNIXBACKUP                    if (!uO.B_flag)#endif                    {                        if (IS_OVERWRT_NONE)                            /* never overwrite:  skip file */                            skip_entry = SKIP_Y_EXISTING;                        else if (!IS_OVERWRT_ALL)                            query = TRUE;                    }                    break;                case EXISTS_AND_NEWER:             /* (or equal) */#ifdef UNIXBACKUP                    if ((!uO.B_flag && IS_OVERWRT_NONE) ||#else                    if (IS_OVERWRT_NONE ||#endif                        (uO.uflag && !renamed)) {                        /* skip if update/freshen & orig name */                        skip_entry = SKIP_Y_EXISTING;                    } else {#ifdef UNIXBACKUP                        if (!IS_OVERWRT_ALL && !uO.B_flag)#else                        if (!IS_OVERWRT_ALL)#endif                            query = TRUE;                    }                    break;                }            if (query) {#ifdef WINDLL                switch (G.lpUserFunctions->replace != NULL ?                        (*G.lpUserFunctions->replace)(G.filename) :                        IDM_REPLACE_NONE) {                    case IDM_REPLACE_RENAME:                        _ISO_INTERN(G.filename);                        renamed = TRUE;                        goto startover;                    case IDM_REPLACE_ALL:                        G.overwrite_mode = OVERWRT_ALWAYS;                        /* FALL THROUGH, extract */                    case IDM_REPLACE_YES:                        break;                    case IDM_REPLACE_NONE:                        G.overwrite_mode = OVERWRT_NEVER;                        /* FALL THROUGH, skip */                    case IDM_REPLACE_NO:                        skip_entry = SKIP_Y_EXISTING;                        break;                }#else /* !WINDLL */                extent fnlen;reprompt:                Info(slide, 0x81, ((char *)slide,                  LoadFarString(ReplaceQuery),                  FnFilter1(G.filename)));                if (fgets(G.answerbuf, 9, stdin) == (char *)NULL) {                    Info(slide, 1, ((char *)slide,                      LoadFarString(AssumeNone)));                    *G.answerbuf = 'N';                    if (!error_in_archive)                        error_in_archive = 1;  /* not extracted:  warning */                }                switch (*G.answerbuf) {                    case 'r':                    case 'R':

⌨️ 快捷键说明

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