File linenumber_ansi.patch of Package wdiff
--- wdiff-0.5.93/doc/wdiff.texi.orig 2008-06-19 15:54:14.000000000 +0200
+++ wdiff-0.5.93/doc/wdiff.texi 2009-08-06 11:25:21.000000000 +0200
@@ -767,6 +767,45 @@ or underlining. Finally, if this option
@samp{-1} and @samp{-2} are, then sections of common words between
differences are segregated by lines of dashes.
+@item --ansi-red-green
+@itemx -A
+Highlight deleted text in red, inserted text in green. This uses ansi terminal codes.
+This highlighting is done in addition to the normal markers.
+
+@item --bold-inserted
+@itemx -A
+Highlight inserted text in bold face. This uses ansi terminal codes.
+This highlighting is done in addition to the normal markers.
+
+@item --copyright
+@itemx -C
+Print copyright and exit.
+
+@item --no-init-term
+@itemx -K
+Like @samp{-t}, but no termcap init/term strings.
+
+@item --Label @var{argument}
+@itemx -L @var{argument}
+A dummy option for compatibility with GNU @code{diff}.
+
+@item --punctuation
+@itemx -P
+Treat punctuation (@code{ispunct()}) like whitespace (@code{isspace()}).
+
+@item --underline-deleted
+@itemx -U
+Underline deleted text. This uses ansi terminal codes.
+This highlighting is done in addition to the normal markers.
+
+@item --context @var{N}
+@itemx -c @var{N}
+Like @samp{-3}, but only print @var{N} lines of context around each
+difference. Context blocks are seperated by a horizontal line, and are
+preceeded by a line of the format @code{=== @var{LLL},@var{RRR} ===}, where
+@var{LLL} and @var{RRR} are current line numbers in the left and right file,
+respectively.
+
@item --ignore-case
@itemx -i
Do not consider case difference while comparing words. Each lower case
--- wdiff-0.5.93/man/wdiff.1.orig 2009-08-04 22:25:02.000000000 +0200
+++ wdiff-0.5.93/man/wdiff.1 2009-08-06 11:27:33.000000000 +0200
@@ -10,12 +10,27 @@ wdiff \- Compares words in two files and
.PP
Mandatory arguments to long options are mandatory for short options too.
.TP
+\fB\-A\fR, \fB\-\-ansi\-red\-green\fR
+highlight deleted text in red, added text in green; using ansi terminal codes
+.TP
+\fB\-B\fR, \fB\-\-bold\-inserted\fR
+mark inserted text in bold; using ansi terminal codes
+.TP
\fB\-C\fR, \fB\-\-copyright\fR
print copyright then exit
.TP
\fB\-K\fR, \fB\-\-no\-init\-term\fR
like \fB\-t\fR, but no termcap init/term strings
.TP
+\fB\-L\fR \fIdummy\fR, \fB\-\-label\fR=\fIdummy\fR
+dummy option for \fBdiff\fR compatibility
+.TP
+\fB\-P\fR, \fB\-\-punctuation\fR
+treat punctuation (ispunct()) like whitespace (isspace())
+.TP
+\fB\-U\fR, \fB\-\-underline\-deleted\fR
+underline deleted text; using ansi terminal codes
+.TP
\fB\-1\fR, \fB\-\-no\-deleted\fR
inhibit output of deleted words
.TP
@@ -28,6 +43,13 @@ inhibit output of common words
\fB\-a\fR, \fB\-\-auto\-pager\fR
automatically calls a pager
.TP
+\fB\-c\fR\fIN\fR, \fB\-\-context\fR=\fIN\fR
+like \fB-3\fR, but only print N lines of context around each difference.
+Context blocks are seperated by a horizontal line, and
+are preceeded by a line of the format '=== \fILLL\fR,\fIRRR\fR ===', where
+\fILLL\fR and \fIRRR\fR are current line numbers in the left and right
+file, respectively.
+.TP
\fB\-h\fR, \fB\-\-help\fR
print this help
.TP
@@ -53,18 +75,19 @@ use termcap as for terminal displays
print program version then exit
.TP
\fB\-w\fR, \fB\-\-start\-delete\fR=\fISTRING\fR
-string to mark beginning of delete region
+string to mark beginning of delete region; default '[-'
.TP
\fB\-x\fR, \fB\-\-end\-delete\fR=\fISTRING\fR
-string to mark end of delete region
+string to mark end of delete region; default '-]'
.TP
\fB\-y\fR, \fB\-\-start\-insert\fR=\fISTRING\fR
-string to mark beginning of insert region
+string to mark beginning of insert region; default '{+'
.TP
\fB\-z\fR, \fB\-\-end\-insert\fR=\fISTRING\fR
-string to mark end of insert region
+string to mark end of insert region; default '+}'
.SH AUTHOR
Written by Franc,ois Pinard <pinard@iro.umontreal.ca>.
+Patches by Hans Lermen (1994), Juergen Weigert <jw@suse.de>
.SH "REPORTING BUGS"
Report bugs to <wdiff\-bugs@gnu.org>.
.SH COPYRIGHT
--- wdiff-0.5.93/src/wdiff.c.orig 2009-08-04 22:24:16.000000000 +0200
+++ wdiff-0.5.93/src/wdiff.c 2009-08-06 10:52:16.000000000 +0200
@@ -19,6 +19,11 @@
#ifdef LERMEN_STUFF
#define LVERSION "L3"
#endif
+#define ANSI_BOLD "\033[1m"
+#define ANSI_UNDERLINE "\033[4m"
+#define ANSI_RED_BG "\033[41m"
+#define ANSI_GREEN_BG "\033[42m"
+#define ANSI_NORMAL "\033[0m"
#include "system.h"
@@ -107,6 +112,10 @@ struct option const longopts[] =
{
{"auto-pager" , 0, NULL, 'a'},
{"avoid-wraps" , 0, NULL, 'n'},
+ {"ansi-red-green" , 0, NULL, 'A'},
+ {"bold-inserted" , 0, NULL, 'B'},
+ {"underline-deleted" , 0, NULL, 'U'},
+ {"label" , 1, NULL, 'L'},
{"copyright" , 0, NULL, 'C'},
{"end-delete" , 1, NULL, 'x'},
{"end-insert" , 1, NULL, 'z'},
@@ -142,6 +151,9 @@ int no_wrapping; /* end/restart strings
int autopager; /* if calling the pager automatically */
int overstrike; /* if using printer overstrikes */
int overstrike_for_less; /* if output aimed to the "less" program */
+int ansi_red_green; // highlight deleted text in red, added text in green
+int bold_inserted; // mark inserted text in bold
+int underline_deleted; // underline deleted text
const char *user_delete_start; /* user specified string for start of delete */
const char *user_delete_end; /* user specified string for end of delete */
const char *user_insert_start; /* user specified string for start of insert */
@@ -245,6 +257,8 @@ setup_signals (void)
#define BUFLINE_SIZE 1024
struct bufline {
struct bufline *next;
+ int left_line_no; // current line number in left file
+ int right_line_no; // current line number in right file
char line[BUFLINE_SIZE];
};
@@ -291,6 +305,8 @@ static void flush_buflines(void)
while (headbufline != tailbufline) {
if (bufline_overrun) {
fprintf(output_file, "\n%s\n", SEPARATOR_LINE);
+ fprintf(output_file, "=== %d,%d ===\n",
+ tailbufline->left_line_no, tailbufline->right_line_no);
bufline_overrun = 0;
}
fputs(tailbufline->line, output_file);
@@ -298,12 +314,17 @@ static void flush_buflines(void)
}
}
+static int left_line_number = 0;
+static int right_line_number = 0;
+
static inline void save_char(int c)
{
headbufline->line[bufcols++] = c;
if (c == '\n') {
headbufline->line[bufcols] = 0;
inc_headbuf();
+ headbufline->left_line_no = left_line_number;
+ headbufline->right_line_no = right_line_number;
bufcols = 0;
}
}
@@ -311,6 +332,9 @@ static inline void save_char(int c)
static inline int our_putc(int c, FILE *stream)
{
if (context_lines && stream == output_file) {
+ if ((c == '\n') && (in_emphasize < 2)) right_line_number++;
+ if ((c == '\n') && (in_emphasize != 1)) left_line_number++;
+
if (!in_emphasize) {
if (behind_emphasize) {
if (c == '\n') behind_emphasize--;
@@ -335,7 +359,7 @@ static void real_end_of_insert (void);
static void our_start_of_delete (void)
{
if (context_lines) flush_buflines();
- in_emphasize = 1;
+ in_emphasize = 2;
real_start_of_delete();
}
static void our_end_of_delete (void)
@@ -466,7 +490,11 @@ real_start_of_delete (void)
tputs (term_delete_start, 0, putc_for_tputs);
#endif
if (user_delete_start)
- fprintf (output_file, "%s", user_delete_start);
+ {
+ fprintf (output_file, "%s", user_delete_start);
+ if (underline_deleted) fputs (ANSI_UNDERLINE, output_file);
+ if (ansi_red_green) fputs (ANSI_RED_BG, output_file);
+ }
}
/*-------------------------.
@@ -483,7 +511,10 @@ real_end_of_delete (void)
return;
if (user_delete_end)
- fprintf (output_file, "%s", user_delete_end);
+ {
+ if (ansi_red_green || underline_deleted) fputs (ANSI_NORMAL, output_file);
+ fprintf (output_file, "%s", user_delete_end);
+ }
#if HAVE_TPUTS
if (term_delete_end)
tputs (term_delete_end, 0, putc_for_tputs);
@@ -510,7 +541,12 @@ real_start_of_insert (void)
tputs (term_insert_start, 0, putc_for_tputs);
#endif
if (user_insert_start)
- fprintf (output_file, "%s", user_insert_start);
+ {
+ fprintf (output_file, "%s", user_insert_start);
+ if (bold_inserted) fputs (ANSI_BOLD, output_file);
+ if (ansi_red_green) fputs (ANSI_GREEN_BG, output_file);
+ }
+
}
/*-------------------------.
@@ -527,7 +563,10 @@ real_end_of_insert (void)
return;
if (user_insert_end)
- fprintf (output_file, "%s", user_insert_end);
+ {
+ if (bold_inserted || ansi_red_green) fputs (ANSI_NORMAL, output_file);
+ fprintf (output_file, "%s", user_insert_end);
+ }
#if HAVE_TPUTS
if (term_insert_end)
tputs (term_insert_end, 0, putc_for_tputs);
@@ -599,7 +638,10 @@ copy_whitespace (SIDE *side, FILE *file)
if (side->character == '\n')
{
if (no_wrapping && user_delete_end)
- fprintf (output_file, "%s", user_delete_end);
+ {
+ if (ansi_red_green || underline_deleted) fputs (ANSI_NORMAL, output_file);
+ fprintf (output_file, "%s", user_delete_end);
+ }
#if HAVE_TPUTS
if (term_delete_end)
tputs (term_delete_end, 0, putc_for_tputs);
@@ -610,7 +652,11 @@ copy_whitespace (SIDE *side, FILE *file)
tputs (term_delete_start, 0, putc_for_tputs);
#endif
if (no_wrapping && user_delete_start)
- fprintf (output_file, "%s", user_delete_start);
+ {
+ fprintf (output_file, "%s", user_delete_start);
+ if (underline_deleted) fputs (ANSI_UNDERLINE, output_file);
+ if (ansi_red_green) fputs (ANSI_RED_BG, output_file);
+ }
}
else if (overstrike_for_less)
{
@@ -626,7 +672,10 @@ copy_whitespace (SIDE *side, FILE *file)
if (side->character == '\n')
{
if (no_wrapping && user_insert_end)
- fprintf (output_file, "%s", user_insert_end);
+ {
+ if (bold_inserted || ansi_red_green) fputs (ANSI_NORMAL, output_file);
+ fprintf (output_file, "%s", user_insert_end);
+ }
#if HAVE_TPUTS
if (term_insert_end)
tputs (term_insert_end, 0, putc_for_tputs);
@@ -637,7 +686,11 @@ copy_whitespace (SIDE *side, FILE *file)
tputs (term_insert_start, 0, putc_for_tputs);
#endif
if (no_wrapping && user_insert_start)
- fprintf (output_file, "%s", user_insert_start);
+ {
+ fprintf (output_file, "%s", user_insert_start);
+ if (bold_inserted) fputs (ANSI_BOLD, output_file);
+ if (ansi_red_green) fputs (ANSI_GREEN_BG, output_file);
+ }
}
else if (overstrike_for_less)
{
@@ -1351,7 +1404,11 @@ Mandatory arguments to long options are
-3, --no-common inhibit output of common words\n"));
#ifdef LERMEN_STUFF
printf (_("\
- -c --context like -3, but print given context lines\n"));
+ -c --context=N like -3, but print N lines of context\n\
+ -A --ansi-red-green highlight deleted text in red, added text in green\n\
+ -B --bold-inserted mark inserted text in bold\n\
+ -U --underline-deleted underline deleted text\n\
+ -L --label=LABEL use LABEL insted of filename"));
#endif
printf (_("\
-a, --auto-pager automatically calls a pager\n\
@@ -1403,6 +1460,9 @@ main (int argc, char *const argv[])
autopager = 0;
overstrike = 0;
overstrike_for_less = 0;
+ ansi_red_green = 0;
+ bold_inserted = 0;
+ underline_deleted = 0;
user_delete_start = NULL;
user_delete_end = NULL;
user_insert_start = NULL;
@@ -1423,7 +1483,7 @@ main (int argc, char *const argv[])
count_changed_right = 0;
while (option_char = getopt_long (argc, (char **) argv,
- "123CKahilnpPstvw:x:y:z:c:", longopts, NULL),
+ "123ABUCKahilnpPstvw:x:y:z:c:L:", longopts, NULL),
option_char != EOF)
switch (option_char)
{
@@ -1439,6 +1499,18 @@ main (int argc, char *const argv[])
inhibit_common = 1;
break;
+ case 'U':
+ underline_deleted = 1;
+ break;
+
+ case 'B':
+ bold_inserted = 1;
+ break;
+
+ case 'A':
+ ansi_red_green = 1;
+ break;
+
case 'C':
print_copyright ();
exit (EXIT_SUCCESS);
@@ -1508,10 +1579,16 @@ warranty; not even for MERCHANTABILITY o
stdout);
fputs (_("\
\n\
-Written by Franc,ois Pinard <pinard@iro.umontreal.ca>.\n"),
+Written by Franc,ois Pinard <pinard@iro.umontreal.ca>.\n\
+Patches by Hans Lermen (1994), Juergen Weigert <jw@suse.de>\n"),
stdout);
exit (EXIT_SUCCESS);
+ case 'L':
+ // just here for compat with diff. Not really implemented.
+ // user_label = optarg;
+ break;
+
case 'w':
user_delete_start = optarg;
break;