>From bffe3fef5440f17aa37d0167e4b5af8a2906838c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niklas=20Hamb=C3=BCchen?= Date: Sun, 14 Aug 2011 19:30:57 +0200 Subject: [PATCH] Add --ed-line-numbers-only option to diff --- src/analyze.c | 6 +++++- src/diff.c | 8 +++++++- src/diff.h | 4 ++++ src/ed.c | 37 +++++++++++++++++++++++++++++++++++++ 4 files changed, 53 insertions(+), 2 deletions(-) diff --git a/src/analyze.c b/src/analyze.c index e797248..95e1e62 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -597,7 +597,7 @@ diff_2_files (struct comparison *cmp) /* Get the results of comparison in the form of a chain of `struct change's -- an edit script. */ - if (output_style == OUTPUT_ED) + if (output_style == OUTPUT_ED || output_style == OUTPUT_ED_LINE_NUMBERS_ONLY) script = build_reverse_script (cmp->file); else script = build_script (cmp->file); @@ -660,6 +660,10 @@ diff_2_files (struct comparison *cmp) print_ed_script (script); break; + case OUTPUT_ED_LINE_NUMBERS_ONLY: + print_ed_script_line_numbers_only (script); + break; + case OUTPUT_FORWARD_ED: pr_forward_ed_script (script); break; diff --git a/src/diff.c b/src/diff.c index cc1b611..2ad39b2 100644 --- a/src/diff.c +++ b/src/diff.c @@ -106,7 +106,7 @@ static bool unidirectional_new_file; static bool report_identical_files; static char const shortopts[] = -"0123456789abBcC:dD:eEfF:hHiI:lL:nNpPqrsS:tTuU:vwW:x:X:y"; +"0123456789abBcC:dD:eEfF:hHiI:lL:nNopPqrsS:tTuU:vwW:x:X:y"; /* Values for long options that do not have single-letter equivalents. */ enum @@ -162,6 +162,7 @@ static struct option const longopts[] = {"changed-group-format", 1, 0, CHANGED_GROUP_FORMAT_OPTION}, {"context", 2, 0, 'C'}, {"ed", 0, 0, 'e'}, + {"ed-line-numbers-only", 0, 0, 'o'}, {"exclude", 1, 0, 'x'}, {"exclude-from", 1, 0, 'X'}, {"expand-tabs", 0, 0, 't'}, @@ -379,6 +380,10 @@ main (int argc, char **argv) specify_style (OUTPUT_ED); break; + case 'o': + specify_style (OUTPUT_ED_LINE_NUMBERS_ONLY); + break; + case 'E': if (ignore_white_space < IGNORE_TAB_EXPANSION) ignore_white_space = IGNORE_TAB_EXPANSION; @@ -864,6 +869,7 @@ static char const * const option_help_msgid[] = { -F RE --show-function-line=RE Show the most recent line matching RE."), N_("-q --brief Output only whether files differ."), N_("-e --ed Output an ed script."), + N_("-o --ed-line-numbers-only Output an ed script, line numebers only."), N_("--normal Output a normal diff."), N_("-n --rcs Output an RCS format diff."), N_("-y --side-by-side Output in two columns.\n\ diff --git a/src/diff.h b/src/diff.h index 71b33f4..7237016 100644 --- a/src/diff.h +++ b/src/diff.h @@ -64,6 +64,9 @@ enum output_style /* Output the differences as commands suitable for `ed' (-e). */ OUTPUT_ED, + /* Output the differences as `ed'-style line number headers (-o). */ + OUTPUT_ED_LINE_NUMBERS_ONLY, + /* Output the diff as a forward ed script (-f). */ OUTPUT_FORWARD_ED, @@ -327,6 +330,7 @@ int diff_dirs (struct comparison const *, int (*) (struct comparison const *, ch /* ed.c */ void print_ed_script (struct change *); +void print_ed_script_line_numbers_only (struct change *); void pr_forward_ed_script (struct change *); /* ifdef.c */ diff --git a/src/ed.c b/src/ed.c index 08acf50..23f8a7b 100644 --- a/src/ed.c +++ b/src/ed.c @@ -21,6 +21,7 @@ #include "diff.h" static void print_ed_hunk (struct change *); +static void print_ed_hunk_line_number_header (struct change *); static void print_rcs_hunk (struct change *); static void pr_forward_ed_hunk (struct change *); @@ -32,6 +33,42 @@ print_ed_script (struct change *script) print_script (script, find_reverse_change, print_ed_hunk); } +/* Print our script as ed commands, + printing line number headers only, omitting the actual contents. */ + +void +print_ed_script_line_numbers_only (struct change *script) +{ + print_script (script, find_reverse_change, print_ed_hunk_line_number_header); +} + +/* Print the line number headers of an ed diff */ + +static void +print_ed_hunk_line_number_header (struct change *hunk) +{ + lin f0, l0, f1, l1; + enum changes changes; + +#ifdef DEBUG + debug_script (hunk); +#endif + + /* Determine range of line numbers involved in each file. */ + changes = analyze_hunk (hunk, &f0, &l0, &f1, &l1); + if (!changes) + return; + + begin_output (); + + /* Print out the line number header for this hunk */ + print_number_range (',', &files[0], f0, l0); + fputc (change_letter[changes], outfile); + fputc ('\n', outfile); + + /* Do not print the actual change content. */ +} + /* Print a hunk of an ed diff */ static void -- 1.7.4.1