commit 2b9186217b1d8cca1354498715e7fddb01ccd481 from: Martin Pieuchot date: Wed Mar 18 17:19:56 2020 UTC Implement -u and -U commit - 72311eba1e091f581f894b17962842d212a0a73a commit + 2b9186217b1d8cca1354498715e7fddb01ccd481 blob - b4a9acb0cdc71e2d714c76d3f510873470cb8236 blob + 222a4a24891b9bbe1b5841616efa323af443afa4 --- diff.1 +++ diff.1 @@ -23,6 +23,8 @@ .Nd compare files .Sh SYNOPSIS .Nm diff +.Op Fl u +.Op Fl U Ar number .Ar file1 file2 .Sh DESCRIPTION The @@ -32,6 +34,18 @@ utility compares the contents of and .Ar file2 line by line. +.Pp +The options are as follows: +.Bl -tag -width Ds +.It Fl u +Produces a unified diff with 3 lines of context. +.It Fl U Ar number +Similar to +.Fl u +with +.Ar number +lines of context. +.El .Sh EXIT STATUS The .Nm blob - 3344aeac27a0c5d0e85706e5967a72c931ebb1b1 blob + 1052643f3e50a4a715acce0247da56ddc6b786af --- diff.c +++ diff.c @@ -25,6 +25,7 @@ #include #include +#include #include #include #include @@ -32,8 +33,12 @@ #include "diff_main.h" +#define DEFAULT_CONTEXT 3 + +#define F_UNIFIED (1 << 0) + __dead void usage(void); -int diffreg(char *, char *, int); +int diffreg(char *, char *, int, int); char *mmapfile(const char *, struct stat *); const struct diff_algo_config myers, patience, myers_divide; @@ -75,10 +80,21 @@ usage(void) int main(int argc, char *argv[]) { - int ch; + int ch, context = DEFAULT_CONTEXT, flags = 0; + long lval; + char *ep; - while ((ch = getopt(argc, argv, "")) != -1) { + while ((ch = getopt(argc, argv, "uU:")) != -1) { switch (ch) { + case 'U': + lval = strtol(optarg, &ep, 10); + if (*ep != '\0' || lval < 0 || lval >= INT_MAX) + usage(); + context = (int)lval; + /* FALLTHROUGH */ + case 'u': + flags |= F_UNIFIED; + break; default: usage(); } @@ -90,11 +106,11 @@ main(int argc, char *argv[]) if (argc != 2) usage(); - return diffreg(argv[0], argv[1], 0); + return diffreg(argv[0], argv[1], flags, context); } int -diffreg(char *file1, char *file2, int flags) +diffreg(char *file1, char *file2, int flags, int context) { char *str1, *str2; struct stat st1, st2; @@ -106,8 +122,12 @@ diffreg(char *file1, char *file2, int flags) str1 = mmapfile(file1, &st1); str2 = mmapfile(file2, &st2); - diff_unidiff(stdout, &diff_config, &info, str1, st1.st_size, str2, - st2.st_size, 3); + if (flags & F_UNIFIED) + diff_unidiff(stdout, &diff_config, &info, str1, st1.st_size, + str2, st2.st_size, context); + else + diff_plain(stdout, &diff_config, &info, str1, st1.st_size, + str2, st2.st_size); munmap(str1, st1.st_size); munmap(str2, st2.st_size); blob - 480a582f5d2848c9cb614cf98532f97a5bfb5ba2 blob + e35c921f7b05f08a48e761caa0c410bfd5525ac9 --- test/verify_all.sh +++ test/verify_all.sh @@ -39,7 +39,7 @@ verify_diff_script() { return 1 fi fi - echo "OK: $diff_prog $orig_left $orig_right" + echo "OK: $diff_prog -u $orig_left $orig_right" return 0 } @@ -48,7 +48,7 @@ for left in test*.left.* ; do expected_diff="$(echo "$left" | sed 's/test\([0-9]*\)\..*/expect\1.diff/')" got_diff="verify.$expected_diff" - "$diff_prog" "$left" "$right" > "$got_diff" + "$diff_prog" -u "$left" "$right" > "$got_diff" set -e verify_diff_script "$left" "$right" "$got_diff"