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

📄 decomptl.c

📁 这是DOS系统的源代码,汇编写的,值得看看,对开发操作系统的人员有价值
💻 C
📖 第 1 页 / 共 2 页
字号:
/* 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 + -