Archive-Unzip-Burst
view release on metacpan or search on metacpan
unzip-6.0/extract.c view on Meta::CPAN
#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;
}
#ifdef VMS
/* 2008-07-24 SMS.
* On VMS, if the file name includes a version number,
* and "-V" ("retain VMS version numbers", V_flag) is in
* effect, then the VMS-specific code will handle any
* conflicts with an existing file, making this query
* redundant. (Implicit "y" response here.)
*/
if (query && uO.V_flag) {
/* Not discarding file versions. Look for one. */
int cndx = strlen(G.filename) - 1;
while ((cndx > 0) && (isdigit(G.filename[cndx])))
cndx--;
if (G.filename[cndx] == ';')
/* File version found; skip the generic query,
* proceeding with its default response "y".
*/
query = FALSE;
}
#endif /* VMS */
if (query) {
#ifdef WINDLL
switch (G.lpUserFunctions->replace != NULL ?
(*G.lpUserFunctions->replace)(G.filename, FILNAMSIZ) :
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, sizeof(G.answerbuf), 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':
do {
Info(slide, 0x81, ((char *)slide,
LoadFarString(NewNameQuery)));
fgets(G.filename, FILNAMSIZ, stdin);
/* usually get \n here: better check for it */
fnlen = strlen(G.filename);
if (lastchar(G.filename, fnlen) == '\n')
G.filename[--fnlen] = '\0';
} while (fnlen == 0);
#ifdef WIN32 /* WIN32 fgets( ... , stdin) returns OEM coded strings */
_OEM_INTERN(G.filename);
#endif
renamed = TRUE;
goto startover; /* sorry for a goto */
case 'A': /* dangerous option: force caps */
G.overwrite_mode = OVERWRT_ALWAYS;
/* FALL THROUGH, extract */
case 'y':
case 'Y':
break;
case 'N':
G.overwrite_mode = OVERWRT_NEVER;
/* FALL THROUGH, skip */
case 'n':
/* skip file */
skip_entry = SKIP_Y_EXISTING;
break;
case '\n':
case '\r':
/* Improve echo of '\n' and/or '\r'
(sizeof(G.answerbuf) == 10 (see globals.h), so
there is enough space for the provided text...) */
strcpy(G.answerbuf, "{ENTER}");
/* fall through ... */
default:
/* usually get \n here: remove it for nice display
(fnlen can be re-used here, we are outside the
"enter new filename" loop) */
fnlen = strlen(G.answerbuf);
if (lastchar(G.answerbuf, fnlen) == '\n')
G.answerbuf[--fnlen] = '\0';
Info(slide, 1, ((char *)slide,
LoadFarString(InvalidResponse), G.answerbuf));
goto reprompt; /* yet another goto? */
} /* end switch (*answerbuf) */
#endif /* ?WINDLL */
} /* end if (query) */
if (skip_entry != SKIP_NO) {
#ifdef WINDLL
if (skip_entry == SKIP_Y_EXISTING) {
/* report skipping of an existing entry */
Info(slide, 0, ((char *)slide,
((IS_OVERWRT_NONE || !uO.uflag || renamed) ?
"Target file exists. Skipping %s\n" :
"Target file newer. Skipping %s\n"),
FnFilter1(G.filename)));
}
#endif /* WINDLL */
continue;
}
} /* end if (extracting to disk) */
#ifdef DLL
if ((G.statreportcb != NULL) &&
(*G.statreportcb)(__G__ UZ_ST_START_EXTRACT, G.zipfn,
G.filename, NULL)) {
return IZ_CTRLC; /* cancel operation by user request */
}
#endif
#ifdef MACOS /* MacOS is no preemptive OS, thus call event-handling by hand */
UserStop();
#endif
#ifdef AMIGA
G.filenote_slot = i;
#endif
G.disk_full = 0;
if ((error = extract_or_test_member(__G)) != PK_COOL) {
if (error > error_in_archive)
error_in_archive = error; /* ...and keep going */
#ifdef DLL
if (G.disk_full > 1 || error_in_archive == IZ_CTRLC) {
#else
if (G.disk_full > 1) {
#endif
return error_in_archive; /* (unless disk full) */
}
}
#ifdef DLL
if ((G.statreportcb != NULL) &&
(*G.statreportcb)(__G__ UZ_ST_FINISH_MEMBER, G.zipfn,
G.filename, (zvoid *)&G.lrec.ucsize)) {
return IZ_CTRLC; /* cancel operation by user request */
}
#endif
#ifdef MACOS /* MacOS is no preemptive OS, thus call event-handling by hand */
UserStop();
#endif
} /* end for-loop (i: files in current block) */
return error_in_archive;
} /* end function extract_or_test_entrylist() */
( run in 0.634 second using v1.01-cache-2.11-cpan-6aa56a78535 )