GNU patch only allows s/.// as a regular expression in substitutions.
Our diff implementation writes s/^\.\././ which is basically the same,
because they are used to change ".." lines into ".".

This is required if an ed-formatted diff tries to create a line that
only has a dot in it. Normally, that means end of line input for ed
commands. Inserting ".." and then changing it to "." is a common trick
here.

Compatibility with restrictive GNU patch is a good reason already, but
the stronger reason for this is my current work to support ed-style
diffs in patch directly.

If we limit support of substitutions to s/.//, then it is easily
transformed into code, e.g. p++. No need for any form of regexp
support, at all... and we are GNU patch compatible. ;)

Okay?


Index: diffreg.c
===================================================================
RCS file: /cvs/src/usr.bin/diff/diffreg.c,v
retrieving revision 1.88
diff -u -p -u -p -r1.88 diffreg.c
--- diffreg.c   5 Oct 2015 20:15:00 -0000       1.88
+++ diffreg.c   10 Oct 2015 23:17:58 -0000
@@ -1084,7 +1084,7 @@ proceed:
                 * back and restart where we left off.
                 */
                diff_output(".\n");
-               diff_output("%ds/^\\.\\././\n", a);
+               diff_output("%ds/.//\n", a);
                a += i;
                c += i;
                goto restart;

Reply via email to