Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 16 Dec 2012 17:01:23 +0000 (UTC)
From:      Eitan Adler <eadler@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r244303 - stable/9/usr.bin/cut
Message-ID:  <201212161701.qBGH1Nd4015903@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: eadler
Date: Sun Dec 16 17:01:23 2012
New Revision: 244303
URL: http://svnweb.freebsd.org/changeset/base/244303

Log:
  MFC r243320,r243474:
  
  Add 'w' flag to:
  
  	Use whitespace (spaces and tabs) as the delimiter.
  	Consecutive spaces and tabs count as one single field
  	separator.
  Approved by:	cperciva (implicit)

Modified:
  stable/9/usr.bin/cut/cut.1
  stable/9/usr.bin/cut/cut.c
Directory Properties:
  stable/9/usr.bin/cut/   (props changed)

Modified: stable/9/usr.bin/cut/cut.1
==============================================================================
--- stable/9/usr.bin/cut/cut.1	Sun Dec 16 16:59:59 2012	(r244302)
+++ stable/9/usr.bin/cut/cut.1	Sun Dec 16 17:01:23 2012	(r244303)
@@ -31,7 +31,7 @@
 .\"     @(#)cut.1	8.1 (Berkeley) 6/6/93
 .\" $FreeBSD$
 .\"
-.Dd December 21, 2006
+.Dd August 8, 2012
 .Dt CUT 1
 .Os
 .Sh NAME
@@ -47,7 +47,7 @@
 .Op Ar
 .Nm
 .Fl f Ar list
-.Op Fl d Ar delim
+.Op Fl w | Fl d Ar delim
 .Op Fl s
 .Op Ar
 .Sh DESCRIPTION
@@ -119,6 +119,9 @@ that form the character are selected.
 .It Fl s
 Suppress lines with no field delimiter characters.
 Unless specified, lines with no delimiters are passed through unmodified.
+.It Fl w
+Use whitespace (spaces and tabs) as the delimiter.
+Consecutive spaces and tabs count as one single field separator.
 .El
 .Sh ENVIRONMENT
 The

Modified: stable/9/usr.bin/cut/cut.c
==============================================================================
--- stable/9/usr.bin/cut/cut.c	Sun Dec 16 16:59:59 2012	(r244302)
+++ stable/9/usr.bin/cut/cut.c	Sun Dec 16 17:01:23 2012	(r244303)
@@ -58,6 +58,7 @@ static int	dflag;
 static int	fflag;
 static int	nflag;
 static int	sflag;
+static int	wflag;
 
 static size_t	autostart, autostop, maxval;
 static char *	positions;
@@ -67,6 +68,7 @@ static int	b_n_cut(FILE *, const char *)
 static int	c_cut(FILE *, const char *);
 static int	f_cut(FILE *, const char *);
 static void	get_list(char *);
+static int	is_delim(wchar_t);
 static void	needpos(size_t);
 static void	usage(void);
 
@@ -84,7 +86,7 @@ main(int argc, char *argv[])
 	dchar = '\t';			/* default delimiter is \t */
 	strcpy(dcharmb, "\t");
 
-	while ((ch = getopt(argc, argv, "b:c:d:f:sn")) != -1)
+	while ((ch = getopt(argc, argv, "b:c:d:f:snw")) != -1)
 		switch(ch) {
 		case 'b':
 			get_list(optarg);
@@ -111,6 +113,9 @@ main(int argc, char *argv[])
 		case 'n':
 			nflag = 1;
 			break;
+		case 'w':
+			wflag = 1;
+			break;
 		case '?':
 		default:
 			usage();
@@ -119,9 +124,9 @@ main(int argc, char *argv[])
 	argv += optind;
 
 	if (fflag) {
-		if (bflag || cflag || nflag)
+		if (bflag || cflag || nflag || (wflag && dflag))
 			usage();
-	} else if (!(bflag || cflag) || dflag || sflag)
+	} else if (!(bflag || cflag) || dflag || sflag || wflag)
 		usage();
 	else if (!bflag && nflag)
 		usage();
@@ -359,18 +364,30 @@ out:
 }
 
 static int
+is_delim(wchar_t ch)
+{
+	if (wflag) {
+		if (ch == ' ' || ch == '\t')
+			return 1;
+	} else {
+		if (ch == dchar)
+			return 1;
+	}
+	return 0;
+}
+
+static int
 f_cut(FILE *fp, const char *fname)
 {
 	wchar_t ch;
 	int field, i, isdelim;
 	char *pos, *p;
-	wchar_t sep;
 	int output;
 	char *lbuf, *mlbuf;
 	size_t clen, lbuflen, reallen;
 
 	mlbuf = NULL;
-	for (sep = dchar; (lbuf = fgetln(fp, &lbuflen)) != NULL;) {
+	while ((lbuf = fgetln(fp, &lbuflen)) != NULL) {
 		reallen = lbuflen;
 		/* Assert EOL has a newline. */
 		if (*(lbuf + lbuflen - 1) != '\n') {
@@ -394,7 +411,7 @@ f_cut(FILE *fp, const char *fname)
 			if (clen == 0)
 				clen = 1;
 			/* this should work if newline is delimiter */
-			if (ch == sep)
+			if (is_delim(ch))
 				isdelim = 1;
 			if (ch == '\n') {
 				if (!isdelim && !sflag)
@@ -421,8 +438,13 @@ f_cut(FILE *fp, const char *fname)
 				if (clen == 0)
 					clen = 1;
 				p += clen;
-				if (ch == '\n' || ch == sep)
+				if (ch == '\n' || is_delim(ch)) {
+					/* compress whitespace */
+					if (wflag && ch != '\n')
+						while (is_delim(*p))
+							p++;
 					break;
+				}
 				if (*pos)
 					for (i = 0; i < (int)clen; i++)
 						putchar(p[i - clen]);
@@ -452,6 +474,6 @@ usage(void)
 	(void)fprintf(stderr, "%s\n%s\n%s\n",
 		"usage: cut -b list [-n] [file ...]",
 		"       cut -c list [file ...]",
-		"       cut -f list [-s] [-d delim] [file ...]");
+		"       cut -f list [-s] [-w | -d delim] [file ...]");
 	exit(1);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201212161701.qBGH1Nd4015903>