PERFORCE change 181810 for review
Benjamin Fiedler
bfiedler at FreeBSD.org
Tue Aug 3 22:45:25 UTC 2010
http://p4web.freebsd.org/@@181810?ac=10
Change 181810 by bfiedler at freebsd-7803 on 2010/08/03 22:45:14
Support -a flag; --label option in progress
Affected files ...
.. //depot/projects/soc2010/bsdtextproc/diff3/diff3prog.c#4 edit
Differences ...
==== //depot/projects/soc2010/bsdtextproc/diff3/diff3prog.c#4 (text+ko) ====
@@ -76,6 +76,9 @@
#include <unistd.h>
#include <limits.h>
#include <getopt.h>
+#include <errno.h>
+#include <wchar.h>
+#include <wctype.h>
/* diff3 - 3-way differential file comparison */
@@ -118,16 +121,18 @@
int overlapcnt;
FILE *fp[3];
int cline[3]; /* # of the last-read line in each file (0-2) */
+char *diff_prog = NULL;
+char *labels[3] = {NULL};
/*
* the latest known correspondence between line numbers of the 3 files
* is stored in last[1-3];
*/
int last[4];
-int Aflag, eflag, iflag, Tflag;
+int aflag, Aflag, eflag, iflag, Tflag;
int oflag; /* indicates whether to mark overlaps (-E or -X)*/
int strip_cr;
int debug = 0;
-char f1mark[40], f3mark[40]; /* markers for -E and -X */
+char f1mark[40], f2mark[40], f3mark[40]; /* markers for -E and -X */
int duplicate(struct range *, struct range *);
int edit(struct diff *, int, int);
@@ -139,6 +144,7 @@
void change(int, struct range *, int);
void keep(int, struct range *);
void merge(int, int);
+static int asciifile(FILE *);
void prange(struct range *);
void repos(int);
void separate(const char *);
@@ -159,13 +165,13 @@
{ "show-overlap", no_argument, NULL, 'E' },
{ "overlap-only", no_argument, NULL, 'x' },
{ "initial-tab", no_argument, NULL, 'T' },
+ { "text", no_argument, NULL, 'a' },
/* features to implement */
{ "show-all", no_argument, NULL, 'A' },
{ "easy-only", no_argument, NULL, '3' },
{ "merge", no_argument, NULL, 'm' },
{ "label", required_argument, NULL, 'L' },
- { "text", no_argument, NULL, 'a' },
{ "strip-trailing-cr", no_argument, NULL, STRIPCR_OPT },
{ "diff-program", required_argument, NULL, DIFFPROG_OPT },
{ "version", no_argument, NULL, 'v' },
@@ -185,6 +191,9 @@
case 'A':
Aflag = 1;
break;
+ case 'a':
+ aflag = 1;
+ break;
case 'E':
eflag = 3;
oflag = 1;
@@ -195,6 +204,12 @@
case 'i':
iflag = 1;
break;
+ case 'L':
+ oflag = 1;
+ for(i=0; i<3 && labels[i] != NULL; i++);
+ i = i <= 2 ? i : 2 ;
+ labels[i] = optarg;
+ break;
case 'T':
Tflag = 1;
break;
@@ -210,7 +225,9 @@
case STRIPCR_OPT:
strip_cr = 1;
break;
-
+ case DIFFPROG_OPT:
+ diff_prog = optarg;
+ break;
}
}
argc -= optind;
@@ -221,9 +238,14 @@
if (oflag) {
(void)snprintf(f1mark, sizeof(f1mark), "<<<<<<< %s",
- argc >= 6 ? argv[5] : argv[2]);
+ labels[0] != NULL ? labels[0] :
+ argc >= 6 ? argv[5] : argv[2]);
+ (void)snprintf(f2mark, sizeof(f2mark), "||||||| %s",
+ labels[1] != NULL ? labels[1] :
+ argc >= 6 ? argv[4] : argv[3]);
(void)snprintf(f3mark, sizeof(f3mark), ">>>>>>> %s",
- argc >= 7 ? argv[6] : argv[4]);
+ labels[2] != NULL ? labels[2] :
+ argc >= 7 ? argv[6] : argv[4]);
}
increase();
@@ -344,6 +366,12 @@
d1 = d13;
d2 = d23;
j = 0;
+
+ if( (asciifile(fp[0]) && asciifile(fp[1]) && asciifile(fp[2]) ) == 0)
+ {
+ printf("Binary file detected; comparison failed\n");
+ exit(EXIT_FAILURE);
+ }
while ((t1 = d1 < d13 + m1) | (t2 = d2 < d23 + m2)) {
if (debug) {
printf("%d,%d=%d,%d %d,%d=%d,%d\n",
@@ -435,6 +463,29 @@
edscript(j);
}
+static int
+asciifile(FILE *f)
+{
+ wint_t ch = L'\0';
+ size_t i;
+
+ if (aflag || f == NULL)
+ return (1);
+
+ rewind(f);
+ errno = 0;
+ for (i = 0; i <= BUFSIZ; i++) {
+ if ((ch = fgetwc(f)) == WEOF) {
+ if (errno == EILSEQ)
+ return (0);
+ break;
+ }
+ if (!iswspace(ch) && iswcntrl(ch))
+ return (0);
+ }
+ return (1);
+}
+
void
separate(const char *s)
{
@@ -506,12 +557,8 @@
if ((line = getline(fp[i], &j)) == NULL)
trouble();
if (pr != NULL)
- {
- if(Tflag == 1)
- printf("\t%s", line);
- else
- printf("%s%s", pr, line);
- }
+ printf("%s%s", Tflag == 1? "\t" : pr, line);
+
cline[i]++;
}
return ((int) n);
More information about the p4-projects
mailing list