diff options
Diffstat (limited to 'c/tools/brotli.c')
-rw-r--r-- | c/tools/brotli.c | 175 |
1 files changed, 142 insertions, 33 deletions
diff --git a/c/tools/brotli.c b/c/tools/brotli.c index 2abfc27..17a3bb6 100644 --- a/c/tools/brotli.c +++ b/c/tools/brotli.c @@ -195,6 +195,7 @@ static Command ParseParams(Context* params) { This check is an additional guard that is never triggered, but provides a guard for future changes. */ if (next_option_index > (MAX_OPTIONS - 2)) { + fprintf(stderr, "too many options passed\n"); return COMMAND_INVALID; } @@ -220,80 +221,135 @@ static Command ParseParams(Context* params) { for (j = 1; j < arg_len; ++j) { char c = arg[j]; if (c >= '0' && c <= '9') { - if (quality_set) return COMMAND_INVALID; + if (quality_set) { + fprintf(stderr, "quality already set\n"); + return COMMAND_INVALID; + } quality_set = BROTLI_TRUE; params->quality = c - '0'; continue; } else if (c == 'c') { - if (output_set) return COMMAND_INVALID; + if (output_set) { + fprintf(stderr, "write to standard output already set\n"); + return COMMAND_INVALID; + } output_set = BROTLI_TRUE; params->write_to_stdout = BROTLI_TRUE; continue; } else if (c == 'd') { - if (command_set) return COMMAND_INVALID; + if (command_set) { + fprintf(stderr, "command already set when parsing -d\n"); + return COMMAND_INVALID; + } command_set = BROTLI_TRUE; command = COMMAND_DECOMPRESS; continue; } else if (c == 'f') { - if (params->force_overwrite) return COMMAND_INVALID; + if (params->force_overwrite) { + fprintf(stderr, "force output overwrite already set\n"); + return COMMAND_INVALID; + } params->force_overwrite = BROTLI_TRUE; continue; } else if (c == 'h') { /* Don't parse further. */ return COMMAND_HELP; } else if (c == 'j' || c == 'k') { - if (keep_set) return COMMAND_INVALID; + if (keep_set) { + fprintf(stderr, "argument --rm / -j or --keep / -n already set\n"); + return COMMAND_INVALID; + } keep_set = BROTLI_TRUE; params->junk_source = TO_BROTLI_BOOL(c == 'j'); continue; } else if (c == 'n') { - if (!params->copy_stat) return COMMAND_INVALID; + if (!params->copy_stat) { + fprintf(stderr, "argument --no-copy-stat / -n already set\n"); + return COMMAND_INVALID; + } params->copy_stat = BROTLI_FALSE; continue; } else if (c == 't') { - if (command_set) return COMMAND_INVALID; + if (command_set) { + fprintf(stderr, "command already set when parsing -t\n"); + return COMMAND_INVALID; + } command_set = BROTLI_TRUE; command = COMMAND_TEST_INTEGRITY; continue; } else if (c == 'v') { - if (params->verbose) return COMMAND_INVALID; + if (params->verbose) { + fprintf(stderr, "argument --verbose / -v already set\n"); + return COMMAND_INVALID; + } params->verbose = BROTLI_TRUE; continue; } else if (c == 'V') { /* Don't parse further. */ return COMMAND_VERSION; } else if (c == 'Z') { - if (quality_set) return COMMAND_INVALID; + if (quality_set) { + fprintf(stderr, "quality already set\n"); + return COMMAND_INVALID; + } quality_set = BROTLI_TRUE; params->quality = 11; continue; } /* o/q/w/D/S with parameter is expected */ if (c != 'o' && c != 'q' && c != 'w' && c != 'D' && c != 'S') { + fprintf(stderr, "invalid argument -%c\n", c); + return COMMAND_INVALID; + } + if (j + 1 != arg_len) { + fprintf(stderr, "expected parameter for argument -%c\n", c); return COMMAND_INVALID; } - if (j + 1 != arg_len) return COMMAND_INVALID; i++; - if (i == argc || !argv[i] || argv[i][0] == 0) return COMMAND_INVALID; + if (i == argc || !argv[i] || argv[i][0] == 0) { + fprintf(stderr, "expected parameter for argument -%c\n", c); + return COMMAND_INVALID; + } params->not_input_indices[next_option_index++] = i; if (c == 'o') { - if (output_set) return COMMAND_INVALID; + if (output_set) { + fprintf(stderr, "write to standard output already set (-o)\n"); + return COMMAND_INVALID; + } params->output_path = argv[i]; } else if (c == 'q') { - if (quality_set) return COMMAND_INVALID; + if (quality_set) { + fprintf(stderr, "quality already set\n"); + return COMMAND_INVALID; + } quality_set = ParseInt(argv[i], BROTLI_MIN_QUALITY, BROTLI_MAX_QUALITY, ¶ms->quality); - if (!quality_set) return COMMAND_INVALID; + if (!quality_set) { + fprintf(stderr, "error parsing quality value [%s]\n", argv[i]); + return COMMAND_INVALID; + } } else if (c == 'w') { - if (lgwin_set) return COMMAND_INVALID; + if (lgwin_set) { + fprintf(stderr, "lgwin parameter already set\n"); + return COMMAND_INVALID; + } lgwin_set = ParseInt(argv[i], 0, BROTLI_MAX_WINDOW_BITS, ¶ms->lgwin); - if (!lgwin_set) return COMMAND_INVALID; + if (!lgwin_set) { + fprintf(stderr, "error parsing lgwin value [%s]\n", argv[i]); + return COMMAND_INVALID; + } if (params->lgwin != 0 && params->lgwin < BROTLI_MIN_WINDOW_BITS) { + fprintf(stderr, + "lgwin parameter (%d) smaller than the minimum (%d)\n", + params->lgwin, BROTLI_MIN_WINDOW_BITS); return COMMAND_INVALID; } } else if (c == 'S') { - if (suffix_set) return COMMAND_INVALID; + if (suffix_set) { + fprintf(stderr, "suffix already set\n"); + return COMMAND_INVALID; + } suffix_set = BROTLI_TRUE; params->suffix = argv[i]; } @@ -301,40 +357,67 @@ static Command ParseParams(Context* params) { } else { /* Double-dash. */ arg = &arg[2]; if (strcmp("best", arg) == 0) { - if (quality_set) return COMMAND_INVALID; + if (quality_set) { + fprintf(stderr, "quality already set\n"); + return COMMAND_INVALID; + } quality_set = BROTLI_TRUE; params->quality = 11; } else if (strcmp("decompress", arg) == 0) { - if (command_set) return COMMAND_INVALID; + if (command_set) { + fprintf(stderr, "command already set when parsing --decompress\n"); + return COMMAND_INVALID; + } command_set = BROTLI_TRUE; command = COMMAND_DECOMPRESS; } else if (strcmp("force", arg) == 0) { - if (params->force_overwrite) return COMMAND_INVALID; + if (params->force_overwrite) { + fprintf(stderr, "force output overwrite already set\n"); + return COMMAND_INVALID; + } params->force_overwrite = BROTLI_TRUE; } else if (strcmp("help", arg) == 0) { /* Don't parse further. */ return COMMAND_HELP; } else if (strcmp("keep", arg) == 0) { - if (keep_set) return COMMAND_INVALID; + if (keep_set) { + fprintf(stderr, "argument --rm / -j or --keep / -n already set\n"); + return COMMAND_INVALID; + } keep_set = BROTLI_TRUE; params->junk_source = BROTLI_FALSE; } else if (strcmp("no-copy-stat", arg) == 0) { - if (!params->copy_stat) return COMMAND_INVALID; + if (!params->copy_stat) { + fprintf(stderr, "argument --no-copy-stat / -n already set\n"); + return COMMAND_INVALID; + } params->copy_stat = BROTLI_FALSE; } else if (strcmp("rm", arg) == 0) { - if (keep_set) return COMMAND_INVALID; + if (keep_set) { + fprintf(stderr, "argument --rm / -j or --keep / -n already set\n"); + return COMMAND_INVALID; + } keep_set = BROTLI_TRUE; params->junk_source = BROTLI_TRUE; } else if (strcmp("stdout", arg) == 0) { - if (output_set) return COMMAND_INVALID; + if (output_set) { + fprintf(stderr, "write to standard output already set\n"); + return COMMAND_INVALID; + } output_set = BROTLI_TRUE; params->write_to_stdout = BROTLI_TRUE; } else if (strcmp("test", arg) == 0) { - if (command_set) return COMMAND_INVALID; + if (command_set) { + fprintf(stderr, "command already set when parsing --test\n"); + return COMMAND_INVALID; + } command_set = BROTLI_TRUE; command = COMMAND_TEST_INTEGRITY; } else if (strcmp("verbose", arg) == 0) { - if (params->verbose) return COMMAND_INVALID; + if (params->verbose) { + fprintf(stderr, "argument --verbose / -v already set\n"); + return COMMAND_INVALID; + } params->verbose = BROTLI_TRUE; } else if (strcmp("version", arg) == 0) { /* Don't parse further. */ @@ -343,30 +426,56 @@ static Command ParseParams(Context* params) { /* key=value */ const char* value = strrchr(arg, '='); size_t key_len; - if (!value || value[1] == 0) return COMMAND_INVALID; + if (!value || value[1] == 0) { + fprintf(stderr, "must pass the parameter as --%s=value\n", arg); + return COMMAND_INVALID; + } key_len = (size_t)(value - arg); value++; if (strncmp("lgwin", arg, key_len) == 0) { - if (lgwin_set) return COMMAND_INVALID; + if (lgwin_set) { + fprintf(stderr, "lgwin parameter already set\n"); + return COMMAND_INVALID; + } lgwin_set = ParseInt(value, 0, BROTLI_MAX_WINDOW_BITS, ¶ms->lgwin); - if (!lgwin_set) return COMMAND_INVALID; + if (!lgwin_set) { + fprintf(stderr, "error parsing lgwin value [%s]\n", value); + return COMMAND_INVALID; + } if (params->lgwin != 0 && params->lgwin < BROTLI_MIN_WINDOW_BITS) { + fprintf(stderr, + "lgwin parameter (%d) smaller than the minimum (%d)\n", + params->lgwin, BROTLI_MIN_WINDOW_BITS); return COMMAND_INVALID; } } else if (strncmp("output", arg, key_len) == 0) { - if (output_set) return COMMAND_INVALID; + if (output_set) { + fprintf(stderr, + "write to standard output already set (--output)\n"); + return COMMAND_INVALID; + } params->output_path = value; } else if (strncmp("quality", arg, key_len) == 0) { - if (quality_set) return COMMAND_INVALID; + if (quality_set) { + fprintf(stderr, "quality already set\n"); + return COMMAND_INVALID; + } quality_set = ParseInt(value, BROTLI_MIN_QUALITY, BROTLI_MAX_QUALITY, ¶ms->quality); - if (!quality_set) return COMMAND_INVALID; + if (!quality_set) { + fprintf(stderr, "error parsing quality value [%s]\n", value); + return COMMAND_INVALID; + } } else if (strncmp("suffix", arg, key_len) == 0) { - if (suffix_set) return COMMAND_INVALID; + if (suffix_set) { + fprintf(stderr, "suffix already set\n"); + return COMMAND_INVALID; + } suffix_set = BROTLI_TRUE; params->suffix = value; } else { + fprintf(stderr, "invalid parameter: [%s]\n", arg); return COMMAND_INVALID; } } |