PERFORCE change 180060 for review

Benjamin Fiedler bfiedler at FreeBSD.org
Mon Jun 21 23:47:14 UTC 2010


http://p4web.freebsd.org/@@180060?ac=10

Change 180060 by bfiedler at freebsd-7803 on 2010/06/21 23:47:06

	Merge my missing additions(help, tabsize, 'y') to Gabor's branch

Affected files ...

.. //depot/projects/soc2010/bsdtextproc/gabor_diff/diff.c#2 edit
.. //depot/projects/soc2010/bsdtextproc/gabor_diff/diff.h#2 edit
.. //depot/projects/soc2010/bsdtextproc/gabor_diff/diffreg.c#2 edit
.. //depot/projects/soc2010/bsdtextproc/gabor_diff/pathnames.h#2 edit

Differences ...

==== //depot/projects/soc2010/bsdtextproc/gabor_diff/diff.c#2 (text+ko) ====

@@ -44,9 +44,10 @@
 #include <unistd.h>
 
 #include "diff.h"
+#include "pathnames.h"
 
 int	 aflag, bflag, Bflag, dflag, iflag, lflag, Nflag, Pflag, pflag, rflag;
-int	 sflag, tflag, Tflag, wflag, uniflag, strip_cr;
+int	 sflag, tflag, Tflag, wflag, uniflag, yflag, strip_cr, tabsize=8;
 int	 format, status;
 int	 fcase_behave = FCASE_SENSITIVE;
 unsigned long long context;
@@ -64,17 +65,26 @@
 	TOFILE_OPT,
 	UNIDIR_OPT,
 	STRIPCR_OPT,
-	NOOP_OPT
+	NOOP_OPT,
+
+	LEFTC_OPT,
+	SUPCL_OPT,
+	GTYPE_OPT,
+	LF_OPT,
+	LLF_OPT,
+	TSIZE_OPT,
+	HLINES_OPT,
+	OPT_LFILES,
 };
 
-#define	OPTIONS	"0123456789abBC:cdD:efhI:iL:lnNPpqrS:sTtU:uvwX:x:"
+
+#define	OPTIONS	"0123456789abBC:cdD:efhI:iL:lnNPpqrS:sTtU:uvwX:x:y"
 static struct option longopts[] = {
 	{ "ignore-file-name-case",	no_argument,		NULL,	FCASE_IGNORE_OPT },
 	{ "no-ignore-file-name-case",	no_argument,		NULL,	FCASE_SENSITIVE_OPT },
 	{ "strip-trailing-cr",		no_argument,		NULL,	STRIPCR_OPT },
 	{ "normal",			no_argument,		NULL,	NORMAL_OPT },
-/* XXX: UNIMPLEMENTED
-	{ "tabsize",			optional_argument,	NULL,	OPT_TSIZE }, */
+	{ "tabsize",			optional_argument,	NULL,	TSIZE_OPT },
 	{ "unidirectional-new-file",	no_argument,		NULL,	UNIDIR_OPT },
 	{ "from-file",			required_argument,	NULL,	FROMFILE_OPT },
 	{ "to-file",			required_argument,	NULL,	TOFILE_OPT },
@@ -109,6 +119,8 @@
 	{ "exclude-from",		required_argument,	NULL,	'X' },
 	{ "exclude",			required_argument,	NULL,	'x' },
 	{ "speed-large-files",          no_argument,            NULL,   NOOP_OPT },
+	
+	{ "side-by-side",		no_argument,		NULL,	'y' },
 /* XXX: the following are not very well documented and rarely used. If we need
         them at all, we will need to dig into the code to see what do they do
         actually.
@@ -130,6 +142,16 @@
 	{ NULL,				0,			NULL,	'\0'}
 };
 
+static const char *help_msg[] = { 
+"-a --text  treat files as ASCII text",
+"-B --ignore-blank-lines  Ignore blank newlines in the comparison",
+"-b --ignore-space-change  Ignore all changes due to whitespace",
+"-C NUM --context=[NUM]  Show NUM lines before and after change (default 3)",
+"-D --ifdef=NAME",
+NULL,
+};
+char **help_strs = (char **)help_msg;
+
 void usage(void);
 void push_excludes(char *);
 void push_ignore_pats(char *);
@@ -140,11 +162,12 @@
 main(int argc, char **argv)
 {
 	char	*ep, *fromfile = NULL, *tofile = NULL, **oargv, *src, *dst;
-	int	 ch, lastch, gotstdin, prevoptind, newarg, flags = 0;
+	int	 ch, lastch, gotstdin, prevoptind, newarg, oargc, flags = 0;
 
 	setlocale(LC_ALL, "");
 
 	oargv = argv;
+	oargc = argc;
 	gotstdin = 0;
 
 	lastch = '\0';
@@ -266,6 +289,9 @@
 		case 'x':
 			push_excludes(optarg);
 			break;
+		case 'y':
+			yflag = 1;
+			break;
 		case FROMFILE_OPT:
 			if (tofile != NULL)
 				err(2, "--from-file and --to-file are both specified");
@@ -288,6 +314,15 @@
 		case STRIPCR_OPT:
 			strip_cr = 1;
 			break;
+		case TSIZE_OPT:
+                        if (optarg != NULL) {
+                                context = strtol(optarg, &ep, 10);
+                                if (*ep != '\0' || context < 1 || context >=ULLONG_MAX)
+                                        err(2, "context out of range\n");
+                                tabsize = (int)context;
+                        } else 
+                                tabsize = 8;
+                        break; 
 		case NOOP_OPT:
 			/* noop, compatibility */
 			break;
@@ -296,7 +331,11 @@
 			break;
 		case HELP_OPT:
 		default:
-			usage();
+			for(;*help_strs;help_strs++) 
+			{
+				printf( "%s\n", *help_strs);
+			}
+			exit(2);
 			break;
 		}
 		lastch = ch;
@@ -305,6 +344,20 @@
 	}
 	argc -= optind;
 	argv += optind;
+	
+	if(yflag) {
+		/* remove y flag from args and call sdiff */
+		for(argv=oargv; argv && strcmp(*argv, "-y") != 0; argv++);
+		while(argv != &oargv[oargc]){
+			*argv=*(argv+1);
+			argv++;
+		}
+		oargv[0] = _PATH_SDIFF;
+		*argv= "\0";
+
+		execv(_PATH_SDIFF, oargv);
+		_exit(127);
+	}
 
 	/*
 	 * Do sanity checks, fill in stb1 and stb2 and call the appropriate

==== //depot/projects/soc2010/bsdtextproc/gabor_diff/diff.h#2 (text+ko) ====

@@ -83,7 +83,7 @@
 };
 
 extern int	 aflag, bflag, Bflag, dflag, iflag, lflag, Nflag, Pflag, pflag, rflag,
-		 sflag, tflag, Tflag, wflag, uniflag, strip_cr;
+		 sflag, tflag, Tflag, wflag, uniflag, strip_cr, tabsize;
 extern int	 format, status;
 extern int	 fcase_behave;
 extern unsigned long long context;

==== //depot/projects/soc2010/bsdtextproc/gabor_diff/diffreg.c#2 (text+ko) ====

@@ -1080,6 +1080,7 @@
 fetch(long *f, int a, int b, FILE *lb, int ch, int oldfile)
 {
 	int	 i, j, c, lastc, col, nc;
+	int	 newcol;
 
 	/*
 	 * When doing #ifdef's, copy down to current line
@@ -1128,9 +1129,10 @@
 				return (0);
 			}
 			if (c == '\t' && tflag) {
+				newcol = ((col/tabsize)+1)*tabsize;
 				do {
-					putchar(' ');
-				} while (++col & 7);
+					putwchar(L' ');
+				} while (++col < newcol);
 			} else {
 				if (format == D_EDIT && j == 1 && c == '\n'
 				    && lastc == '.') {

==== //depot/projects/soc2010/bsdtextproc/gabor_diff/pathnames.h#2 (text+ko) ====

@@ -23,3 +23,4 @@
 #include <paths.h>
 
 #define	_PATH_PR	"/usr/bin/pr"
+#define _PATH_SDIFF     "/usr/bin/sdiff"


More information about the p4-projects mailing list