Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F135949958
D30545.id92894.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
6 KB
Referenced Files
None
Subscribers
None
D30545.id92894.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D30545: diff(1): Add --color support
Attached
Detach File
Event Timeline
Log In to Comment