Skip to content
代码片段 群组 项目
adapt.c 41.4 KB
更新 更旧
  • 了解如何忽略特定修订
  •         result *= 10, result += **stringPtr - '0', (*stringPtr)++ ;
        if ((**stringPtr=='K') || (**stringPtr=='M')) {
            result <<= 10;
            if (**stringPtr=='M') result <<= 10;
            (*stringPtr)++ ;
            if (**stringPtr=='i') (*stringPtr)++;
            if (**stringPtr=='B') (*stringPtr)++;
        }
        return result;
    }
    
    
    static void help(const char* progPath)
    
    Paul Cruz's avatar
    Paul Cruz 已提交
    {
        PRINT("Usage:\n");
    
        PRINT("  %s [options] [file(s)]\n", progPath);
    
    Paul Cruz's avatar
    Paul Cruz 已提交
        PRINT("\n");
        PRINT("Options:\n");
        PRINT("  -oFILE : specify the output file name\n");
    
        PRINT("  -i#    : provide initial compression level -- default %d, must be in the range [L, U] where L and U are bound values (see below for defaults)\n", DEFAULT_COMPRESSION_LEVEL);
    
    Paul Cruz's avatar
    Paul Cruz 已提交
        PRINT("  -h     : display help/information\n");
    
        PRINT("  -f     : force the compression level to stay constant\n");
    
        PRINT("  -c     : force write to stdout\n");
    
        PRINT("  -q     : quiet mode -- do not show progress bar or other information\n");
    
        PRINT("  -l#    : provide lower bound for compression level -- default 1\n");
    
        PRINT("  -u#    : provide upper bound for compression level -- default %u\n", ZSTD_maxCLevel());
    
    Paul Cruz's avatar
    Paul Cruz 已提交
    }
    
    /* return 0 if successful, else return error */
    int main(int argCount, const char* argv[])
    {
    
        const char* outFilename = NULL;
        const char** filenameTable = (const char**)malloc(argCount*sizeof(const char*));
        unsigned filenameIdx = 0;
    
        int ret = 0;
    
        int argNum;
    
        g_maxCLevel = ZSTD_maxCLevel();
    
    
        if (filenameTable == NULL) {
            DISPLAY("Error: could not allocate sapce for filename table.\n");
            return 1;
        }
    
    
        for (argNum=1; argNum<argCount; argNum++) {
            const char* argument = argv[argNum];
    
    
            /* output filename designated with "-o" */
    
            if (argument[0]=='-' && strlen(argument) > 1) {
                switch (argument[1]) {
                    case 'o':
                        argument += 2;
                        outFilename = argument;
                        break;
                    case 'i':
                        argument += 2;
                        g_compressionLevel = readU32FromChar(&argument);
    
                        break;
                    case 'h':
    
                        help(argv[0]);
    
                        goto _main_exit;
                    case 'p':
    
                    case 'q':
                        g_useProgressBar = 0;
                        g_displayLevel = 0;
                        break;
    
                    case 'l':
                        argument += 2;
                        g_minCLevel = readU32FromChar(&argument);
                        break;
                    case 'u':
                        argument += 2;
                        g_maxCLevel = readU32FromChar(&argument);
                        break;
    
                    default:
                        DISPLAY("Error: invalid argument provided\n");
                        ret = 1;
                        goto _main_exit;
    
                continue;
    
            /* regular files to be compressed */
            filenameTable[filenameIdx++] = argument;
    
        /* check initial, max, and min compression levels */
        {
            unsigned const minMaxInconsistent = g_minCLevel > g_maxCLevel;
            unsigned const initialNotInRange = g_minCLevel > g_compressionLevel || g_maxCLevel < g_compressionLevel;
            if (minMaxInconsistent || (initialNotInRange && providedInitialCLevel)) {
                DISPLAY("Error: provided compression level parameters are invalid\n");
                ret = 1;
                goto _main_exit;
            }
            else if (initialNotInRange) {
                g_compressionLevel = g_minCLevel;
            }
        }
    
    
        /* error checking with number of files */
    
        if (filenameIdx > 1 && (outFilename != NULL && strcmp(outFilename, stdoutmark))) {
    
            DISPLAY("Error: multiple input files provided, cannot use specified output file\n");
            ret = 1;
            goto _main_exit;
        }
    
        /* compress files */
        if (filenameIdx <= 1) {
            ret |= compressFilename(filenameTable[0], outFilename);
        }
        else {
    
            ret |= compressFilenames(filenameTable, filenameIdx, forceStdout);
    
        }
    _main_exit:
        free(filenameTable);
        return ret;