Page MenuHomeFreeBSD

D30545.id92894.diff
No OneTemporary

D30545.id92894.diff

Index: usr.bin/diff/diff.h
===================================================================
--- usr.bin/diff/diff.h
+++ usr.bin/diff/diff.h
@@ -90,12 +90,13 @@
struct excludes *next;
};
-extern int lflag, Nflag, Pflag, rflag, sflag, Tflag, cflag, Wflag;
+extern int lflag, Nflag, Pflag, rflag, sflag, Tflag, cflag, Wflag, color;
extern int diff_format, diff_context, status, ignore_file_case;
extern int suppress_common;
extern int tabsize, width;
extern char *start, *ifdefname, *diffargs, *label[2], *ignore_pats;
extern char *group_format;
+extern const char *add_code, *del_code;
extern struct stat stb1, stb2;
extern struct excludes *excludes_list;
extern regex_t ignore_re;
Index: usr.bin/diff/diff.1
===================================================================
--- usr.bin/diff/diff.1
+++ usr.bin/diff/diff.1
@@ -44,6 +44,7 @@
.Fl n | q | u | y
.Oc
.Op Fl -brief
+.Op Fl -color Ns = Ns Ar when
.Op Fl -changed-group-format Ar GFMT
.Op Fl -ed
.Op Fl -expand-tabs
@@ -71,6 +72,7 @@
.Op Fl I Ar pattern | Fl -ignore-matching-lines Ar pattern
.Op Fl L Ar label | Fl -label Ar label
.Op Fl -brief
+.Op Fl -color Ns = Ns Ar when
.Op Fl -changed-group-format Ar GFMT
.Op Fl -ed
.Op Fl -expand-tabs
@@ -96,6 +98,7 @@
.Op Fl aBbdiltw
.Op Fl I Ar pattern | Fl -ignore-matching-lines Ar pattern
.Op Fl -brief
+.Op Fl -color Ns = Ns Ar when
.Op Fl -changed-group-format Ar GFMT
.Op Fl -ed
.Op Fl -expand-tabs
@@ -122,6 +125,7 @@
.Op Fl I Ar pattern | Fl -ignore-matching-lines Ar pattern
.Op Fl L Ar label | Fl -label Ar label
.Op Fl -brief
+.Op Fl -color Ns = Ns Ar when
.Op Fl -changed-group-format Ar GFMT
.Op Fl -ed
.Op Fl -expand-tabs
@@ -150,6 +154,7 @@
.Fl n | q | u
.Oc
.Op Fl -brief
+.Op Fl -color Ns = Ns Ar when
.Op Fl -changed-group-format Ar GFMT
.Op Fl -context
.Op Fl -ed
@@ -184,6 +189,7 @@
.Ar dir1 dir2
.Nm diff
.Op Fl aBbditwW
+.Op Fl -color Ns = Ns Ar when
.Op Fl -expand-tabs
.Op Fl -ignore-all-blanks
.Op Fl -ignore-blank-lines
@@ -332,6 +338,17 @@
.It Fl b -ignore-space-change
Causes trailing blanks (spaces and tabs) to be ignored, and other
strings of blanks to compare equal.
+.It Fl Fl color= Ns Oo Ar when Oc
+Mark up the matching text with the expression stored in the
+.Ev DIFFCOLOR
+environment variable.
+The possible values of
+.Ar when
+are
+.Dq Cm never ,
+.Dq Cm always
+and
+.Dq Cm auto .
.It Fl d -minimal
Try very hard to produce a diff as small as possible.
This may consume a lot of processing power and memory when processing
Index: usr.bin/diff/diff.c
===================================================================
--- usr.bin/diff/diff.c
+++ usr.bin/diff/diff.c
@@ -38,11 +38,18 @@
#include "diff.h"
#include "xmalloc.h"
-int lflag, Nflag, Pflag, rflag, sflag, Tflag, cflag, Wflag;
+#define COLORFLAG_UNSET -1
+#define COLORFLAG_NEVER 0
+#define COLORFLAG_AUTO 0
+#define COLORFLAG_ALWAYS 0
+
+int lflag, Nflag, Pflag, rflag, sflag, Tflag, cflag, Wflag, color = 0;
int diff_format, diff_context, status, ignore_file_case, suppress_common;
int tabsize = 8, width = 130;
+static int colorflag = COLORFLAG_UNSET;
char *start, *ifdefname, *diffargs, *label[2], *ignore_pats;
char *group_format = NULL;
+const char *add_code, *del_code;
struct stat stb1, stb2;
struct excludes *excludes_list;
regex_t ignore_re;
@@ -57,6 +64,7 @@
OPT_HORIZON_LINES,
OPT_CHANGED_GROUP_FORMAT,
OPT_SUPPRESS_COMMON,
+ OPT_COLOR,
};
static struct option longopts[] = {
@@ -97,6 +105,7 @@
{ "tabsize", required_argument, NULL, OPT_TSIZE },
{ "changed-group-format", required_argument, NULL, OPT_CHANGED_GROUP_FORMAT},
{ "suppress-common-lines", no_argument, NULL, OPT_SUPPRESS_COMMON },
+ { "color", optional_argument, NULL, OPT_COLOR },
{ NULL, 0, 0, '\0'}
};
@@ -106,6 +115,8 @@
void push_ignore_pats(char *);
void read_excludes_file(char *file);
void set_argstr(char **, char **);
+static const char *init_code(int, const char *);
+static int do_color(void);
int
main(int argc, char **argv)
@@ -301,6 +312,17 @@
case OPT_SUPPRESS_COMMON:
suppress_common = 1;
break;
+ case OPT_COLOR:
+ if (optarg == NULL || strncmp(optarg, "auto", 4) == 0)
+ colorflag = COLORFLAG_AUTO;
+ else if (strncmp(optarg, "always", 6) == 0)
+ colorflag = COLORFLAG_ALWAYS;
+ else if (strncmp(optarg, "never", 5) == 0)
+ colorflag = COLORFLAG_NEVER;
+ else
+ errx(2, "unsupported --color value '%s' (must be always, auto, or never)",
+ optarg);
+ break;
default:
usage();
break;
@@ -316,6 +338,12 @@
argc -= optind;
argv += optind;
+ if (do_color()) {
+ color = 1;
+ add_code = init_code(1, "32");
+ del_code = init_code(2, "31");
+ }
+
#ifdef __OpenBSD__
if (pledge("stdio rpath tmppath", NULL) == -1)
err(2, "pledge");
@@ -550,3 +578,43 @@
fprintf(stderr, "error: conflicting output format options.\n");
usage();
}
+
+static int
+do_color(void)
+{
+ const char *p, *p2;
+ int ret = 0;
+
+ p = getenv("CLICOLOR");
+ p2 = getenv("COLORTERM");
+
+ if ((p != NULL && *p != '\0') || (p2 != NULL && *p2 != '\0'))
+ ret = isatty(STDOUT_FILENO) ? 1 : 0;
+
+ if (colorflag == COLORFLAG_AUTO)
+ ret = isatty(STDOUT_FILENO) ? 1 : 0;
+ else if (colorflag == COLORFLAG_ALWAYS)
+ ret = 1;
+ else if (colorflag == COLORFLAG_NEVER)
+ ret = 0;
+
+ return ret;
+}
+
+static const char *
+init_code(int i, const char *rv)
+{
+ char *buf, *p, *env;
+ int j;
+
+ env = getenv("DIFFCOLORS");
+ if (env != NULL && *env != '\0') {
+ p = strdup(env);
+ for (j = 0; j < i; j++)
+ buf = strsep(&p, ":");
+ free(p);
+ if (buf != NULL)
+ return buf;
+ }
+ return rv;
+}
Index: usr.bin/diff/diffreg.c
===================================================================
--- usr.bin/diff/diffreg.c
+++ usr.bin/diff/diffreg.c
@@ -1183,13 +1183,23 @@
}
}
if (diff_format == D_SIDEBYSIDE) {
+ if (color && (a>b))
+ printf("\033[%sm", add_code);
+ else if (color && (c>d))
+ printf("\033[%sm", del_code);
if (a > b) {
print_space(0, hw + padding , *pflags);
} else {
nc = fetch(ixold, a, b, f1, '\0', 1, *pflags);
print_space(nc, hw - nc + padding, *pflags);
}
+ if (color && (a>b))
+ printf("\033[%sm", add_code);
+ else if (color && (c>d))
+ printf("\033[%sm", del_code);
printf("%c", (a>b)? '>' : ((c>d)? '<' : '|'));
+ if (color && (c>d))
+ printf("\33[m");
print_space(hw + padding + 1 , padding, *pflags);
fetch(ixnew, c, d, f2, '\0', 0, *pflags);
printf("\n");
@@ -1263,6 +1273,10 @@
nc = hw;
if ((diff_format != D_IFDEF && diff_format != D_GFORMAT) &&
ch != '\0') {
+ if (color && (ch == '>' || ch == '+'))
+ printf("\033[%sm", add_code);
+ else if (color && (ch == '<' || ch == '-'))
+ printf("\033[%sm", del_code);
printf("%c", ch);
if (Tflag && (diff_format == D_NORMAL ||
diff_format == D_CONTEXT ||
@@ -1335,6 +1349,8 @@
}
}
}
+ if (color)
+ printf("\33[m");
return col;
}

File Metadata

Mime Type
text/plain
Expires
Sat, Nov 15, 11:50 AM (9 h, 24 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
25325393
Default Alt Text
D30545.id92894.diff (6 KB)

Event Timeline