From owner-p4-projects@FreeBSD.ORG Tue Aug 3 22:45:25 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 2E10F106566C; Tue, 3 Aug 2010 22:45:25 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id CE5E7106567C for ; Tue, 3 Aug 2010 22:45:24 +0000 (UTC) (envelope-from bfiedler@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id BA9B58FC1D for ; Tue, 3 Aug 2010 22:45:24 +0000 (UTC) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.4/8.14.4) with ESMTP id o73MjOZR068289 for ; Tue, 3 Aug 2010 22:45:24 GMT (envelope-from bfiedler@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.4/8.14.4/Submit) id o73MjOge068287 for perforce@freebsd.org; Tue, 3 Aug 2010 22:45:24 GMT (envelope-from bfiedler@FreeBSD.org) Date: Tue, 3 Aug 2010 22:45:24 GMT Message-Id: <201008032245.o73MjOge068287@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to bfiedler@FreeBSD.org using -f From: Benjamin Fiedler To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 181810 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 03 Aug 2010 22:45:25 -0000 http://p4web.freebsd.org/@@181810?ac=10 Change 181810 by bfiedler@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 #include #include +#include +#include +#include /* 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);