svn commit: r310594 - user/bapt/diff
Baptiste Daroussin
bapt at FreeBSD.org
Mon Dec 26 11:42:34 UTC 2016
Author: bapt
Date: Mon Dec 26 11:42:33 2016
New Revision: 310594
URL: https://svnweb.freebsd.org/changeset/base/310594
Log:
Implement diff -l for compatibility with GNU diff
Obtained from: soc2012
Modified:
user/bapt/diff/Makefile
user/bapt/diff/diff.c
user/bapt/diff/diff.h
user/bapt/diff/diffreg.c
Modified: user/bapt/diff/Makefile
==============================================================================
--- user/bapt/diff/Makefile Mon Dec 26 11:20:40 2016 (r310593)
+++ user/bapt/diff/Makefile Mon Dec 26 11:42:33 2016 (r310594)
@@ -3,5 +3,6 @@
PROG= diff
SRCS= diff.c diffdir.c diffreg.c xmalloc.c
WARNS= 7
+CFLAGS+= -Wno-incompatible-pointer-types-discards-qualifiers
.include <bsd.prog.mk>
Modified: user/bapt/diff/diff.c
==============================================================================
--- user/bapt/diff/diff.c Mon Dec 26 11:20:40 2016 (r310593)
+++ user/bapt/diff/diff.c Mon Dec 26 11:42:33 2016 (r310594)
@@ -39,7 +39,7 @@ __FBSDID("$FreeBSD$");
#include "diff.h"
#include "xmalloc.h"
-int Nflag, Pflag, rflag, sflag, Tflag;
+int lflag, Nflag, Pflag, rflag, sflag, Tflag;
int diff_format, diff_context, status;
char *start, *ifdefname, *diffargs, *label[2], *ignore_pats;
struct stat stb1, stb2;
@@ -57,6 +57,7 @@ static struct option longopts[] = {
{ "forward-ed", no_argument, 0, 'f' },
{ "ignore-matching-lines", required_argument, 0, 'I' },
{ "ignore-case", no_argument, 0, 'i' },
+ { "paginate", no_argument, NULL, 'l' },
{ "label", required_argument, 0, 'L' },
{ "new-file", no_argument, 0, 'N' },
{ "rcs", no_argument, 0, 'n' },
@@ -154,6 +155,9 @@ main(int argc, char **argv)
else
usage();
break;
+ case 'l':
+ lflag = 1;
+ break;
case 'N':
Nflag = 1;
break;
Modified: user/bapt/diff/diff.h
==============================================================================
--- user/bapt/diff/diff.h Mon Dec 26 11:20:40 2016 (r310593)
+++ user/bapt/diff/diff.h Mon Dec 26 11:42:33 2016 (r310594)
@@ -82,7 +82,7 @@ struct excludes {
struct excludes *next;
};
-extern int Nflag, Pflag, rflag, sflag, Tflag;
+extern int lflag, Nflag, Pflag, rflag, sflag, Tflag;
extern int diff_format, diff_context, status;
extern char *start, *ifdefname, *diffargs, *label[2], *ignore_pats;
extern struct stat stb1, stb2;
Modified: user/bapt/diff/diffreg.c
==============================================================================
--- user/bapt/diff/diffreg.c Mon Dec 26 11:20:40 2016 (r310593)
+++ user/bapt/diff/diffreg.c Mon Dec 26 11:42:33 2016 (r310594)
@@ -86,6 +86,8 @@ __FBSDID("$FreeBSD$");
#include "diff.h"
#include "xmalloc.h"
+#define _PATH_PR "/usr/bin/pr"
+
#define MINIMUM(a, b) (((a) < (b)) ? (a) : (b))
#define MAXIMUM(a, b) (((a) > (b)) ? (a) : (b))
@@ -297,6 +299,8 @@ diffreg(char *file1, char *file2, int fl
{
FILE *f1, *f2;
int i, rval;
+ int ostdout = -1;
+ pid_t pid = -1;
f1 = f2 = NULL;
rval = D_SAME;
@@ -372,6 +376,43 @@ diffreg(char *file1, char *file2, int fl
status |= 1;
goto closem;
}
+ if (lflag) {
+ /* redirect stdout to pr */
+ int pfd[2];
+ char *header;
+ char * prargv[] = { "pr", "-h", NULL, "-f", NULL };
+
+ xasprintf(&header, "%s %s %s", diffargs, file1, file2);
+ prargv[2] = header;
+ fflush(stdout);
+ rewind(stdout);
+ pipe(pfd);
+ switch ((pid = fork())) {
+ case -1:
+ status |= 2;
+ free(header);
+ err(2, "No more processes");
+ case 0:
+ /* child */
+ if (pfd[0] != STDIN_FILENO) {
+ dup2(pfd[0], STDIN_FILENO);
+ close(pfd[0]);
+ }
+ close(pfd[1]);
+ execv(_PATH_PR, (char *const *)prargv);
+ _exit(127);
+ default:
+ /* parent */
+ if (pfd[1] != STDOUT_FILENO) {
+ ostdout = dup(STDOUT_FILENO);
+ dup2(pfd[1], STDOUT_FILENO);
+ close(pfd[1]);
+ }
+ close(pfd[0]);
+ rewind(stdout);
+ free(header);
+ }
+ }
prepare(0, f1, stb1.st_size, flags);
prepare(1, f2, stb2.st_size, flags);
@@ -404,6 +445,20 @@ diffreg(char *file1, char *file2, int fl
ixnew = xreallocarray(ixnew, len[1] + 2, sizeof(*ixnew));
check(f1, f2, flags);
output(file1, f1, file2, f2, flags);
+ if (ostdout != -1) {
+ int wstatus;
+
+ /* close the pipe to pr and restore stdout */
+ fflush(stdout);
+ rewind(stdout);
+ if (ostdout != STDOUT_FILENO) {
+ close(STDOUT_FILENO);
+ dup2(ostdout, STDOUT_FILENO);
+ close(ostdout);
+ }
+ waitpid(pid, &wstatus, 0);
+ }
+
closem:
if (anychange) {
status |= 1;
More information about the svn-src-user
mailing list