📄 decomptl.c
字号:
/* TS = none */
/*
** DECOMPTL.C -- Decompression Tool for Setup Toolkits.
*/
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <string.h>
#include <fcntl.h>
#include <direct.h>
#include <ctype.h>
#include <sys\types.h>
#include <sys\stat.h>
#ifndef OS2_VER
#include <dos.h>
#endif /* !OS2_VER */
#include "..\sutkcomp.h"
#include "strings.h"
/* forward declarations */
int main(int argc, char ** argv);
void Usage(SHORT wExitCode);
void UsageMessageOnly(void);
int FhOpenSrc(SZ szSrcPath, SZ szSrcFileName);
#ifdef COMPLEX
void GetSzSrcFileFromUser(SZ * pszSrcFile);
void GetSzDestFileFromUser(SZ szDestFile, SZ szSrcFile);
extern void DividePathIntoBaseExt(SZ szPath, SZ *pszBase, SZ *pszExt);
extern BOOL FUserConfirmsYN(void);
extern void GetDollarSzFromSzSrc(SZ szSrcFile, SZ szDstFile);
extern BOOL vfForceOverwrite;
#endif /* COMPLEX */
extern void ExitErrorMsgRc(SHORT rc);
extern void ErrorMsgRc(SHORT rc);
extern void MSCopyright(BOOL fCompress);
#ifdef ZECKFORMAT
extern BOOL vfZeckFormat;
#endif /* ZECKFORMAT */
#ifdef OS2_VER
#define ZZNAMEZZ achName
#else /* !OS2_VER */
#define ZZNAMEZZ name
#endif /* !OS2_VER */
#ifdef XL_EXT_TRANSLATE
/*
** static BOOL FTranslateExcelExtension(SZ szSrcExt)
**
** If extension is of the form "CP?", use the Excel translation table
** to fill vszExtension (as if it had been found in the header).
*/
static BOOL FTranslateExcelExtension(SZ szSrcExt)
{
if (*szSrcExt != 'C' && *szSrcExt != 'c')
return(FALSE);
if (*(szSrcExt + 1) != 'P' && *(szSrcExt + 1) != 'p')
return(FALSE);
switch (*(szSrcExt + 2))
{
default:
return(FALSE);
case '1':
strcpy(vszExtension, "1");
break;
case '2':
strcpy(vszExtension, "2");
break;
case '3':
strcpy(vszExtension, "3");
break;
case 'c':
case 'C':
strcpy(vszExtension, "XLC");
break;
case 'e':
case 'E':
strcpy(vszExtension, "EXE");
break;
case 'f':
case 'F':
strcpy(vszExtension, "FON");
break;
case 'h':
case 'H':
strcpy(vszExtension, "HLP");
break;
case 'm':
case 'M':
strcpy(vszExtension, "XLM");
break;
case 's':
case 'S':
strcpy(vszExtension, "XLS");
break;
case 't':
case 'T':
strcpy(vszExtension, "CBT");
break;
case 'v':
case 'V':
strcpy(vszExtension, "DRV");
break;
case 'w':
case 'W':
strcpy(vszExtension, "XLW");
break;
case 'y':
case 'Y':
strcpy(vszExtension, "SYS");
break;
}
return(TRUE);
}
#endif
int FhOpenSrc(SZ szSrcPath, SZ szSrcFileName)
{
CHAR rgchSrcFile[_MAX_PATH + _MAX_FNAME + _MAX_EXT + 1];
CHAR * pch;
strcpy(rgchSrcFile, szSrcPath);
if ((pch = strrchr(rgchSrcFile, '\\')) == NULL)
{
if (rgchSrcFile[1] == ':')
rgchSrcFile[2] = '\0';
else
rgchSrcFile[0] = '\0';
}
else
*(pch + 1) = '\0';
strcat(rgchSrcFile, szSrcFileName);
strcpy(szSrcPath, rgchSrcFile);
return(open(rgchSrcFile, O_RDONLY | O_BINARY));
}
#ifdef COMPLEX
void GetSzSrcFileFromUser(SZ * pszSrcFile)
{
if ((*pszSrcFile = (SZ)malloc(80 * sizeof(CHAR))) == NULL)
ExitErrorMsgRc(rcOutOfMemory);
LAskForSrcName:
printf(szEnterSrcName);
if (gets(*pszSrcFile) == NULL)
{
printf(szGetsFailure);
exit(26);
}
*(*pszSrcFile + 79) = '\0';
while (strlen(*pszSrcFile) && isspace(**pszSrcFile))
memmove(*pszSrcFile, *pszSrcFile + 1, 79);
if (!strlen(*pszSrcFile))
goto LAskForSrcName;
}
#endif /* COMPLEX */
#ifdef COMPLEX
void GetSzDestFileFromUser(SZ szDestFile, SZ szSrcFile)
{
while (1)
{
printf(szEnterDestName);
if (gets(szDestFile) == NULL)
{
printf(szGetsFailure);
exit(26);
}
*(szDestFile + 79) = '\0';
while (strlen(szDestFile) && isspace(*szDestFile))
memmove(szDestFile, szDestFile + 1, 79);
if (stricmp(szSrcFile, szDestFile))
return;
printf(szSrcDestDifferent);
}
}
#endif /* COMPLEX */
/*
** int main(int argc, char * argv[])
**
** Main decompress routine.
*/
int main(int argc, char * argv[])
{
int iArg;
SZ szSrcFile = NULL;
BOOL fForceAppend = FALSE;
BOOL fComputeOnly = FALSE;
BOOL fFileFound;
#ifdef COMPLEX
SZ szSrcBase;
SZ szSrcExt;
SHORT cch;
struct stat statBuf;
#endif /* COMPLEX */
#ifdef DOLLAR_SUFFIX
CHAR chLast;
#endif /* DOLLAR_SUFFIX */
int fhDest;
int fhSrc;
CHAR rgchSrcFile[_MAX_PATH + _MAX_FNAME + _MAX_EXT + 1];
CHAR rgchDestFile[_MAX_PATH + _MAX_FNAME + _MAX_EXT + 1];
CHAR rgchDestFileSav[_MAX_PATH + _MAX_FNAME + _MAX_EXT + 1];
LONG lcbDecompressed;
SHORT wReturn;
SHORT wExitCode = 0;
#ifdef OS2_VER
HDIR hdir;
USHORT usSearchCount;
FILEFINDBUF ffindBuf;
FILESTATUS fsSrc;
#else /* !OS2_VER */
struct find_t ffindBuf;
USHORT usDate;
USHORT usTime;
#endif /* !OS2_VER */
#ifdef DOLLAR_SUFFIX
BOOL fUsingDollarSignedSrc = FALSE;
#endif /* DOLLAR_SUFFIX */
#ifdef COMPLEX
vfForceOverwrite = FALSE;
#endif /* COMPLEX */
MSCopyright(FALSE);
for (iArg = 1; iArg < argc
&& (argv[iArg][0] == '-' || argv[iArg][0] == '/'); iArg++)
{
switch (argv[iArg][1])
{
default:
Usage(20);
case 'a':
case 'A':
fForceAppend = (BOOL)TRUE;
break;
#ifdef COMPLEX
case 'f':
case 'F':
vfForceOverwrite = (BOOL)TRUE;
break;
#endif /* COMPLEX */
case '?':
case 'h':
case 'H':
Usage(0);
#ifdef COMPLEX
case 'q':
case 'Q':
fComputeOnly = (BOOL)TRUE;
break;
#endif /* COMPLEX */
}
}
#ifdef COMPLEX
/* there can be at most two filenames after flags */
if (iArg < argc - 2)
#else /* !COMPLEX */
/* there must be two filenames after flags */
if (iArg != argc - 2)
#endif /* !COMPLEX */
Usage(19);
if (iArg < argc)
{
szSrcFile = argv[iArg++];
if (!strcmp(szSrcFile, "?"))
Usage(0);
}
if (iArg < argc)
strcpy(rgchDestFile, argv[iArg]);
#ifdef COMPLEX
else
strcpy(rgchDestFile, "");
if (szSrcFile == NULL)
{
UsageMessageOnly();
GetSzSrcFileFromUser(&szSrcFile);
if (!fComputeOnly)
GetSzDestFileFromUser(rgchDestFile, szSrcFile);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -