summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Koutcher <thomas.koutcher@online.fr>2023-01-12 21:41:56 +0100
committerThomas Koutcher <thomas.koutcher@online.fr>2023-01-12 21:41:56 +0100
commit8cbf581cdc95dac85285203bd24307f38e0666db (patch)
tree57caff0d807ebdac34de54ee55cc69a7a6a8bd9e
parent6a3eb94fb70ce72a09478491049191e2a03e055f (diff)
Add support for option word-diff-regex
Closes #1252
-rw-r--r--include/tig/argv.h1
-rw-r--r--src/argv.c11
-rw-r--r--src/options.c20
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;
diff --git a/src/argv.c b/src/argv.c
index 3a00e6f4..b170dbce 100644
--- a/src/argv.c
+++ b/src/argv.c
@@ -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;
}