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

📄 decomptl.c

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