📄 decomptl.c
字号:
}
#endif /* COMPLEX */
strcpy(rgchSrcFile, szSrcFile);
strcpy(rgchDestFileSav, rgchDestFile);
#ifdef COMPLEX
/* it may LOOK like a filename, but add a slash if it's really a dir */
if ((cch = strlen(rgchDestFile)) != 0 && rgchDestFile[cch - 1] != '\\'
&& (cch != 2 || rgchDestFile[1] != ':') && !access(rgchDestFile, 00)
&& !stat(rgchDestFile, &statBuf) && (statBuf.st_mode & S_IFDIR))
strcat(rgchDestFileSav, "\\");
#endif /* COMPLEX */
#ifdef DOLLAR_SUFFIX
chLast = *(rgchSrcFile + strlen(rgchSrcFile) - 1);
if (chLast == '_' || chLast == '$' || chLast == '*' || chLast == '?')
fUsingDollarSignedSrc = (BOOL)TRUE;
#endif /* DOLLAR_SUFFIX */
#ifdef OS2_VER
usSearchCount = 1;
hdir = HDIR_CREATE;
fFileFound = (BOOL)(!DosFindFirst(rgchSrcFile, &hdir,
FILE_NORMAL | FILE_READONLY, &ffindBuf, sizeof(FILEFINDBUF),
&usSearchCount, 0L));
#else /* !OS2_VER */
fFileFound = (BOOL)(!_dos_findfirst(rgchSrcFile, _A_NORMAL | _A_RDONLY,
&ffindBuf));
#endif /* !OS2_VER */
if (!fFileFound)
{
#ifdef DOLLAR_SUFFIX
fUsingDollarSignedSrc = (BOOL)TRUE;
GetDollarSzFromSzSrc(szSrcFile, rgchSrcFile);
LTryFindFirstFile:
#ifdef OS2_VER
DosFindClose(hdir);
usSearchCount = 1;
hdir = HDIR_CREATE;
fFileFound = (BOOL)(!DosFindFirst(rgchSrcFile, &hdir,
FILE_NORMAL | FILE_READONLY, &ffindBuf, sizeof(FILEFINDBUF),
&usSearchCount, 0L));
#else /* !OS2_VER */
fFileFound = (BOOL)(!_dos_findfirst(rgchSrcFile, _A_NORMAL | _A_RDONLY,
&ffindBuf));
#endif /* !OS2_VER */
if (!fFileFound)
if (*(rgchSrcFile + strlen(rgchSrcFile) - 1) == '_')
{
*(rgchSrcFile + strlen(rgchSrcFile) - 1) = '$';
goto LTryFindFirstFile;
}
else
#endif /* DOLLAR_SUFFIX */
{
printf(szNoSrcFile);
exit(21);
}
}
#ifdef COMPLEX
while (fFileFound)
#endif /* !COMPLEX */
{
BOOL fAppend = fForceAppend;
if ((fhSrc = FhOpenSrc(rgchSrcFile, ffindBuf.ZZNAMEZZ)) == -1)
{
printf(szCantOpenInput, rgchSrcFile);
goto LFindNextFile;
}
printf("%s\n", rgchSrcFile);
if ((wReturn = WReadHeaderInfo(fhSrc)) < rcNoError)
{
ErrorMsgRc(wReturn);
wExitCode = -wReturn;
goto LFindNextFile;
}
#ifdef COMPLEX
if (fComputeOnly)
{
lcbDecompressed = LcbCalculateDecompressedLength(fhSrc, (BOOL)TRUE);
close(fhSrc);
if (lcbDecompressed < (LONG)rcNoError)
{
ErrorMsgRc((SHORT)lcbDecompressed);
wExitCode = (SHORT)(-lcbDecompressed);
}
else
printf(szDecompSize, lcbDecompressed);
goto LFindNextFile;
}
#endif /* COMPLEX */
strcpy(rgchDestFile, rgchDestFileSav);
#ifdef COMPLEX
cch = strlen(rgchDestFile);
if (!cch || rgchDestFile[cch-1] == '\\' || rgchDestFile[cch-1] == ':')
{
DividePathIntoBaseExt(ffindBuf.ZZNAMEZZ, &szSrcBase, &szSrcExt);
#ifdef XL_EXT_TRANSLATE
if (vszExtension[0] == '\0')
FTranslateExcelExtension(szSrcExt);
#endif
if (szSrcExt != NULL)
*(szSrcExt - 1) = '\0';
if (vszBaseName[0] != '\0')
strcat(rgchDestFile, vszBaseName);
else
strcat(rgchDestFile, szSrcBase);
if (vszExtension[0] != '\0')
{
strcat(rgchDestFile, ".");
if (*vszExtension != ' ')
strcat(rgchDestFile, vszExtension);
}
else if (szSrcExt != NULL)
{
strcat(rgchDestFile, ".");
strcat(rgchDestFile, szSrcExt);
}
if (szSrcExt != NULL)
*(szSrcExt - 1) = '.';
}
#endif /* COMPLEX */
if (!fForceAppend && !access(rgchDestFile, 00))
{
#ifdef COMPLEX
if (!vfForceOverwrite)
{
printf(szFileExists, rgchDestFile);
printf(szAppendQ);
if ((fAppend = FUserConfirmsYN()))
goto LAppendToExistingFile;
printf(szOverwriteYN);
}
if (vfForceOverwrite || FUserConfirmsYN())
{
#endif /* COMPLEX */
chmod(rgchDestFile, S_IREAD | S_IWRITE);
remove(rgchDestFile);
if (!access(rgchDestFile, 00))
{
printf(szCantOverwrite, rgchDestFile);
close(fhSrc);
goto LFindNextFile;
}
#ifdef COMPLEX
}
else
{
close(fhSrc);
goto LFindNextFile;
}
#endif /* COMPLEX */
}
#ifdef COMPLEX
LAppendToExistingFile:
#endif /* COMPLEX */
if (fAppend)
{
fhDest = open(rgchDestFile, O_APPEND | O_BINARY | O_CREAT |O_WRONLY,
S_IREAD | S_IWRITE);
if (lseek(fhDest, 0L, 2) == -1L)
{
close(fhSrc);
close(fhDest);
ErrorMsgRc(rcWriteSeekError);
wExitCode = -rcWriteSeekError;
goto LFindNextFile;
}
}
else
fhDest = open(rgchDestFile, O_TRUNC | O_BINARY | O_CREAT | O_WRONLY,
S_IREAD | S_IWRITE);
if (fhDest == -1)
{
close(fhSrc);
printf(szCantOpenOutput, rgchDestFile);
goto LFindNextFile;
}
#ifdef OS2_VER
if (DosQFileInfo((HFILE)fhSrc, (USHORT)0x0001, &fsSrc,
(USHORT)(sizeof(fsSrc))))
#else /* not OS2_VER */
if (_dos_getftime(fhSrc, &usDate, &usTime))
#endif /* OS2_VER */
{
ErrorMsgRc(rcReadError);
wExitCode = -rcReadError;
goto LFindNextFile;
}
lcbDecompressed = LcbDecompressToFile(fhSrc, fhDest, NIL,0L,(BOOL)TRUE);
#ifdef OS2_VER
if (DosSetFileInfo((HFILE)fhDest, (USHORT)0x0001, &fsSrc,
(USHORT)(sizeof(fsSrc))))
#else /* not OS2_VER */
if (_dos_setftime(fhDest, usDate, usTime))
#endif /* OS2_VER */
{
ErrorMsgRc(rcWriteError);
wExitCode = -rcWriteError;
goto LFindNextFile;
}
close(fhSrc);
close(fhDest);
if (lcbDecompressed < rcNoError)
{
#ifdef ZECKFORMAT
if (vfZeckFormat && lcbDecompressed == rcDecompLengthBad)
ExitErrorMsgRc(rcZeckSplitFile);
#endif /* ZECKFORMAT */
ErrorMsgRc((SHORT)lcbDecompressed);
wExitCode = (SHORT)(-lcbDecompressed);
goto LFindNextFile;
}
else
printf(szWroteBytes, lcbDecompressed, rgchDestFile);
LFindNextFile:
#ifdef COMPLEX
#ifdef OS2_VER
usSearchCount = 1;
fFileFound = (BOOL)(!DosFindNext(hdir, &ffindBuf, sizeof(FILEFINDBUF),
&usSearchCount));
#else /* !OS2_VER */
fFileFound = (BOOL)(!_dos_findnext(&ffindBuf));
#endif /* !OS2_VER */
#ifdef DOLLAR_SUFFIX
if (!fFileFound && !fUsingDollarSignedSrc)
{
fUsingDollarSignedSrc = (BOOL)TRUE;
GetDollarSzFromSzSrc(szSrcFile, rgchSrcFile);
LTryFindNextFile:
#ifdef OS2_VER
DosFindClose(hdir);
usSearchCount = 1;
hdir = HDIR_CREATE;
fFileFound = (BOOL)(!DosFindFirst(rgchSrcFile, &hdir,
FILE_NORMAL | FILE_READONLY, &ffindBuf, sizeof(FILEFINDBUF),
&usSearchCount, 0L));
#else /* !OS2_VER */
fFileFound = (BOOL)(!_dos_findfirst(rgchSrcFile,
_A_NORMAL | _A_RDONLY, &ffindBuf));
#endif /* !OS2_VER */
if (!fFileFound && *(rgchSrcFile + strlen(rgchSrcFile) - 1) == '_')
{
*(rgchSrcFile + strlen(rgchSrcFile) - 1) = '$';
goto LTryFindNextFile;
}
}
#endif /* DOLLAR_SUFFIX */
#else /* !COMPLEX */
;
#endif /* !COMPLEX */
} /* while (!fFileFound) */
#ifdef OS2_VER
DosFindClose(hdir);
#endif /* OS2_VER */
exit(wExitCode);
return(wExitCode);
}
/*
** void UsageMessageOnly(void)
**
** Print usage message when command line args are bad.
*/
void UsageMessageOnly(void)
{
printf(szDecompUsage1);
printf(szDecompUsage2);
#ifdef COMPLEX
printf(szDecompUsage3);
printf(szDecompUsage4);
printf(szDecompUsage5);
printf(szDecompUsage6);
printf(szDecompUsage7);
printf(szDecompUsage8);
printf(szDecompUsage9);
printf(szDecompUsage10);
#endif /* COMPLEX */
}
/*
** void Usage(SHORT wExitCode)
**
** Print usage message when command line args are bad then exit.
*/
void Usage(SHORT wExitCode)
{
UsageMessageOnly();
exit(wExitCode);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -