diff options
author | Thomas Koutcher <thomas.koutcher@online.fr> | 2023-01-12 21:41:56 +0100 |
---|---|---|
committer | Thomas Koutcher <thomas.koutcher@online.fr> | 2023-01-12 21:41:56 +0100 |
commit | 8cbf581cdc95dac85285203bd24307f38e0666db (patch) | |
tree | 57caff0d807ebdac34de54ee55cc69a7a6a8bd9e | |
parent | 6a3eb94fb70ce72a09478491049191e2a03e055f (diff) |
Add support for option word-diff-regex
Closes #1252
-rw-r--r-- | include/tig/argv.h | 1 | ||||
-rw-r--r-- | src/argv.c | 11 | ||||
-rw-r--r-- | src/options.c | 20 |
3 files changed, 28 insertions, 4 deletions
diff --git a/include/tig/argv.h b/include/tig/argv.h index c58699fd..d4441d57 100644 --- a/include/tig/argv.h +++ b/include/tig/argv.h @@ -35,6 +35,7 @@ bool argv_appendn(const char ***argv, const char *arg, size_t arglen); bool argv_append_array(const char ***dst_argv, const char *src_argv[]); bool argv_copy(const char ***dst, const char *src[]); bool argv_contains(const char **argv, const char *arg); +bool argv_containsn(const char **argv, const char *arg, size_t arglen); typedef char argv_string[SIZEOF_STR]; typedef unsigned long argv_number; @@ -206,6 +206,17 @@ argv_contains(const char **argv, const char *arg) return false; } +bool +argv_containsn(const char **argv, const char *arg, size_t arglen) +{ + int i; + + for (i = 0; argv && argv[i]; i++) + if (!strncmp(argv[i], arg, arglen)) + return true; + return false; +} + DEFINE_ALLOCATOR(argv_realloc, const char *, SIZEOF_ARG) bool diff --git a/src/options.c b/src/options.c index 66e3830e..4e0d26f4 100644 --- a/src/options.c +++ b/src/options.c @@ -123,7 +123,6 @@ iconv_t opt_iconv_out = ICONV_NONE; char opt_editor[SIZEOF_STR] = ""; const char **opt_cmdline_args = NULL; bool opt_log_follow = false; -bool opt_word_diff = false; /* * Mapping between options and command argument mapping. @@ -260,6 +259,12 @@ update_options_from_argv(const char *argv[]) continue; } + if (!strcmp(flag, "--word-diff=none")) { + /* opt_word_diff = false; */ + mark_option_seen(&opt_word_diff); + continue; + } + if (!strcmp(flag, "--word-diff") || !strcmp(flag, "--word-diff=plain")) { opt_word_diff = true; @@ -267,6 +272,12 @@ update_options_from_argv(const char *argv[]) continue; } + if (!prefixcmp(flag, "--word-diff-regex=")) { + opt_word_diff = true; + mark_option_seen(&opt_word_diff); + /* Keep the flag in argv. */ + } + argv[flags_pos++] = flag; } @@ -1143,10 +1154,11 @@ load_options(void) return error("Failed to format TIG_DIFF_OPTS arguments"); } - if (argv_contains(opt_diff_options, "--word-diff") || - argv_contains(opt_diff_options, "--word-diff=plain")) { + if (!find_option_info_by_value(&opt_word_diff)->seen && + (argv_contains(opt_diff_options, "--word-diff") || + argv_contains(opt_diff_options, "--word-diff=plain") || + argv_containsn(opt_diff_options, "--word-diff-regex=", STRING_SIZE("--word-diff-regex=")))) opt_word_diff = true; - } return SUCCESS; } |