aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2021-05-12 19:20:58 -0700
committerBruce Hill <bruce@bruce-hill.com>2021-05-12 19:20:58 -0700
commitf6bb376d1ba7984a35ff06e90a772cb5ba224d0c (patch)
treef3854008443737de5cbbad529613a7533acb2ee8
parent1a1b3ecfee276795e4c9b2981207e2aba289976c (diff)
Added --color flag
-rw-r--r--README.md1
-rw-r--r--bp.14
-rw-r--r--bp.c20
3 files changed, 19 insertions, 6 deletions
diff --git a/README.md b/README.md
index 39f6b5c..9d9dfd8 100644
--- a/README.md
+++ b/README.md
@@ -25,6 +25,7 @@ It's written in pure C with no dependencies.
* `-c` `--context <N>` change how many lines of context are printed (`0`: no context, `all`: the whole file, `<N>` matching lines and `<N-1>` lines before/after)
* `-g` `--grammar <grammar file>` use the specified file as a grammar
* `-G` `--git` get filenames from git
+* `--color yes|no|auto` force output to use or not use color
See `man ./bp.1` for more details.
diff --git a/bp.1 b/bp.1
index d35a9df..a403928 100644
--- a/bp.1
+++ b/bp.1
@@ -67,6 +67,10 @@ Otherwise, if \fI<N>\fR is a positive integer, print the whole line on which
matches occur, as well as the \fI<N-1>\fR lines before and after the match. The
default value for this argument is 1 (print whole lines where matches occur).
+.B \--color \fIyes|no|auto\fR
+Whether or not to use color output. Default is \fIauto\fR, which means that
+output will be colored only when printing to a TTY output.
+
.B \--help
Print the usage and exit.
diff --git a/bp.c b/bp.c
index 935d2fa..6c97439 100644
--- a/bp.c
+++ b/bp.c
@@ -49,6 +49,7 @@ static const char *usage = (
" -r --replace <replacement> replace the input pattern with the given replacement\n"
" -s --skip <skip pattern> skip over the given pattern when looking for matches\n"
" -c --context <context> set number of lines of context to print (all: the whole file, 0: only the match, 1: the line, N: N lines of context)\n"
+ " --color <yes|no|auto> whether or not to use coloring of text output\n"
" -g --grammar <grammar file> use the specified file as a grammar");
// Used as a heuristic to check if a file is binary or text:
@@ -58,7 +59,11 @@ static const char *usage = (
#define USE_DEFAULT_CONTEXT -2
#define ALL_CONTEXT -1
static int context_lines = USE_DEFAULT_CONTEXT;
-static bool print_color = false;
+static enum {
+ COLOR_NO,
+ COLOR_YES,
+ COLOR_AUTO,
+} print_color = COLOR_AUTO;
static bool print_line_numbers = false;
static bool ignorecase = false;
static bool verbose = false;
@@ -87,7 +92,7 @@ static FILE *tty_out = NULL, *tty_in = NULL;
static inline void fprint_filename(FILE *out, const char *filename)
{
if (!filename[0]) return;
- if (print_color) fprintf(out, "\033[0;1;4;33m%s\033[0m\n", filename);
+ if (print_color == COLOR_YES) fprintf(out, "\033[0;1;4;33m%s\033[0m\n", filename);
else fprintf(out, "%s:\n", filename);
}
@@ -346,11 +351,10 @@ static int print_matches(def_t *defs, file_t *f, pat_t *pattern)
printer_t pr = {
.file = f,
.context_lines = context_lines,
- .use_color = print_color,
+ .use_color = print_color == COLOR_YES,
.print_line_numbers = print_line_numbers,
};
- confirm_t confirm_file = confirm;
for (match_t *m = NULL; (m = next_match(defs, f, m, pattern, skip, ignorecase)); ) {
printer_t err_pr = {.file = f, .context_lines = true, .use_color = true, .print_line_numbers = true};
if (print_errors(&err_pr, m) > 0)
@@ -360,7 +364,6 @@ static int print_matches(def_t *defs, file_t *f, pat_t *pattern)
if (printed_filenames++ > 0) printf("\n");
fprint_filename(stdout, f->filename);
}
- confirm_replacements(f, m, &confirm_file);
print_match(stdout, &pr, m);
}
@@ -588,6 +591,8 @@ int main(int argc, char *argv[])
if (flag && flag[0])
errx(EXIT_FAILURE, "Unsupported flags after --context: %s", flag);
}
+ } else if (FLAG("--color")) {
+ print_color = streq(flag, "yes") ? COLOR_YES : streq(flag, "no") ? COLOR_NO : COLOR_AUTO;
} else if (argv[0][0] == '-' && argv[0][1] && argv[0][1] != '-') { // single-char flags
errx(EXIT_FAILURE, "Unrecognized flag: -%c\n\n%s", argv[0][1], usage);
} else if (argv[0][0] != '-') {
@@ -606,13 +611,16 @@ int main(int argc, char *argv[])
if (pattern == NULL)
errx(EXIT_FAILURE, "No pattern provided.\n\n%s", usage);
+ if (confirm == CONFIRM_ASK && mode != MODE_INPLACE)
+ errx(EXIT_FAILURE, "Confirm mode (-C flag) can only be used with inplace mode (-I flag)");
+
for (argc = 0; argv[argc]; ++argc) ; // update argc
if (context_lines == USE_DEFAULT_CONTEXT) context_lines = 1;
if (context_lines < 0 && context_lines != ALL_CONTEXT) context_lines = 0;
if (isatty(STDOUT_FILENO)) {
- print_color = true;
+ if (print_color == COLOR_AUTO) print_color = COLOR_YES;
print_line_numbers = true;
}