Interactive Diff
July 12, 2019
[ There will be no exercises next week, as my daughter is visiting from out-of-town and I will be spending time with her. ]
One of my favorite books is The Unix Programming Environment by Brian Kernighan and Rob Pike, which I have recently been re-reading; the spine of my copy broke long ago, so I must be careful turning the pages, and I wrap the book in a rubber band every time I put it back on my shelf. It is an excellent introduction to Unix, still relevant today even though it was published in 1984. The recent exercise Remind was inspired by a program in Section 4.4, and today’s exercise is a rewrite of the program in Section 6.8.
NAME
idiff -- interactive diff
USAGE
idiff file1 file2 -- interactively merge file differences
DESCRIPTION
idiff takes two files file1 and file2, diffs them, and presents
the difference to the user interactively. At each difference,
the user may accept the text from file1 by responding <, or accept the text from file2 by responding >, or edit the difference
by responding e (in which case whatever the user saves from the
editor is entered into the output file), or execute a command
by typing !cmd, in which case the user must then respond when
the prompt is repeated. The assembled output with the selected
differences is placed in file idiff.out.
EXAMPLE
$ cat file1
This is
a test
of
your
skill
and comprehension.
$ cat file2
This is
not a test
of
our
ability.
$ diff file1 file2
2c2
< a test --- > not a test
4,6d4,5
< your
< skill
< and comprehension. --- > our
> ability.
$ idiff file1 file2
2c2
< a test --- > not a test
? >
4,6c4,5
< your
< skill
< and comprehension. --- > our
> ability.
? <
$ cat idiff.out
This is
not a test
of
your
skill
and comprehension.
[ WordPress is determined not to render less-than and greater-than signs properly. Look at https://ideone.com/nI9CNB if you can’t make sense of what you see. ]
Your task is to write idiff. When you are finished, you are welcome to read or run a suggested solution, or to post your own solution or discuss the exercise in the comments below.