svn commit: r302558 - head/usr.bin/ul

Pietro Cerutti gahr at FreeBSD.org
Mon Jul 11 08:05:47 UTC 2016


Author: gahr (ports committer)
Date: Mon Jul 11 08:05:46 2016
New Revision: 302558
URL: https://svnweb.freebsd.org/changeset/base/302558

Log:
  Do not truncate lines longer than 512 chars.
  
  PR:		210344
  MFC after:	1 week
  Differential Revision:	https://reviews.freebsd.org/D6881

Modified:
  head/usr.bin/ul/ul.c

Modified: head/usr.bin/ul/ul.c
==============================================================================
--- head/usr.bin/ul/ul.c	Mon Jul 11 07:54:58 2016	(r302557)
+++ head/usr.bin/ul/ul.c	Mon Jul 11 08:05:46 2016	(r302558)
@@ -78,7 +78,9 @@ struct	CHAR	{
 	int	c_width;	/* width or -1 if multi-column char. filler */
 } ;
 
-static struct	CHAR	obuf[MAXBUF];
+static struct	CHAR	sobuf[MAXBUF]; /* static output buffer */
+static struct	CHAR	*obuf = sobuf;
+static int	buflen = MAXBUF;
 static int	col, maxcol;
 static int	mode;
 static int	halfpos;
@@ -151,6 +153,9 @@ main(int argc, char **argv)
 		else
 			filter(f);
 	}
+	if (obuf != sobuf) {
+		free(obuf);
+	}
 	exit(0);
 }
 
@@ -166,128 +171,148 @@ filter(FILE *f)
 {
 	wint_t c;
 	int i, w;
+	int copy;
+	
+	copy = 0;
+
+	while ((c = getwc(f)) != WEOF) {
+		if (col == buflen) {
+			if (obuf == sobuf) {
+				obuf = NULL;
+				copy = 1;
+			}
+			obuf = realloc(obuf, sizeof(*obuf) * 2 * buflen);
+			if (obuf == NULL) {
+				obuf = sobuf;
+				break;
+			} else if (copy) {
+				memcpy(obuf, sobuf, sizeof(*obuf) * buflen);
+				copy = 0;
+			}
+			bzero((char *)(obuf + buflen), sizeof(*obuf) * buflen);
+			buflen *= 2;
+		}
+		switch(c) {
+		case '\b':
+			if (col > 0)
+				col--;
+			continue;
 
-	while ((c = getwc(f)) != WEOF && col < MAXBUF) switch(c) {
+		case '\t':
+			col = (col+8) & ~07;
+			if (col > maxcol)
+				maxcol = col;
+			continue;
 
-	case '\b':
-		if (col > 0)
-			col--;
-		continue;
-
-	case '\t':
-		col = (col+8) & ~07;
-		if (col > maxcol)
-			maxcol = col;
-		continue;
-
-	case '\r':
-		col = 0;
-		continue;
-
-	case SO:
-		mode |= ALTSET;
-		continue;
-
-	case SI:
-		mode &= ~ALTSET;
-		continue;
-
-	case IESC:
-		switch (c = getwc(f)) {
-
-		case HREV:
-			if (halfpos == 0) {
-				mode |= SUPERSC;
-				halfpos--;
-			} else if (halfpos > 0) {
-				mode &= ~SUBSC;
-				halfpos--;
-			} else {
-				halfpos = 0;
-				reverse();
-			}
+		case '\r':
+			col = 0;
 			continue;
 
-		case HFWD:
-			if (halfpos == 0) {
-				mode |= SUBSC;
-				halfpos++;
-			} else if (halfpos < 0) {
-				mode &= ~SUPERSC;
-				halfpos++;
-			} else {
-				halfpos = 0;
-				fwd();
-			}
+		case SO:
+			mode |= ALTSET;
 			continue;
 
-		case FREV:
-			reverse();
+		case SI:
+			mode &= ~ALTSET;
 			continue;
 
-		default:
-			errx(1, "unknown escape sequence in input: %o, %o", IESC, c);
-		}
-		continue;
+		case IESC:
+			switch (c = getwc(f)) {
 
-	case '_':
-		if (obuf[col].c_char || obuf[col].c_width < 0) {
-			while (col > 0 && obuf[col].c_width < 0)
-				col--;
-			w = obuf[col].c_width;
-			for (i = 0; i < w; i++)
-				obuf[col++].c_mode |= UNDERL | mode;
+			case HREV:
+				if (halfpos == 0) {
+					mode |= SUPERSC;
+					halfpos--;
+				} else if (halfpos > 0) {
+					mode &= ~SUBSC;
+					halfpos--;
+				} else {
+					halfpos = 0;
+					reverse();
+				}
+				continue;
+
+			case HFWD:
+				if (halfpos == 0) {
+					mode |= SUBSC;
+					halfpos++;
+				} else if (halfpos < 0) {
+					mode &= ~SUPERSC;
+					halfpos++;
+				} else {
+					halfpos = 0;
+					fwd();
+				}
+				continue;
+
+			case FREV:
+				reverse();
+				continue;
+
+			default:
+				errx(1, "unknown escape sequence in input: %o, %o", IESC, c);
+			}
+			continue;
+
+		case '_':
+			if (obuf[col].c_char || obuf[col].c_width < 0) {
+				while (col > 0 && obuf[col].c_width < 0)
+					col--;
+				w = obuf[col].c_width;
+				for (i = 0; i < w; i++)
+					obuf[col++].c_mode |= UNDERL | mode;
+				if (col > maxcol)
+					maxcol = col;
+				continue;
+			}
+			obuf[col].c_char = '_';
+			obuf[col].c_width = 1;
+			/* FALLTHROUGH */
+		case ' ':
+			col++;
 			if (col > maxcol)
 				maxcol = col;
 			continue;
-		}
-		obuf[col].c_char = '_';
-		obuf[col].c_width = 1;
-		/* FALLTHROUGH */
-	case ' ':
-		col++;
-		if (col > maxcol)
-			maxcol = col;
-		continue;
 
-	case '\n':
-		flushln();
-		continue;
+		case '\n':
+			flushln();
+			continue;
 
-	case '\f':
-		flushln();
-		putwchar('\f');
-		continue;
+		case '\f':
+			flushln();
+			putwchar('\f');
+			continue;
 
-	default:
-		if ((w = wcwidth(c)) <= 0)	/* non printing */
+		default:
+			if ((w = wcwidth(c)) <= 0)	/* non printing */
+				continue;
+			if (obuf[col].c_char == '\0') {
+				obuf[col].c_char = c;
+				for (i = 0; i < w; i++)
+					obuf[col + i].c_mode = mode;
+				obuf[col].c_width = w;
+				for (i = 1; i < w; i++)
+					obuf[col + i].c_width = -1;
+			} else if (obuf[col].c_char == '_') {
+				obuf[col].c_char = c;
+				for (i = 0; i < w; i++)
+					obuf[col + i].c_mode |= UNDERL|mode;
+				obuf[col].c_width = w;
+				for (i = 1; i < w; i++)
+					obuf[col + i].c_width = -1;
+			} else if ((wint_t)obuf[col].c_char == c) {
+				for (i = 0; i < w; i++)
+					obuf[col + i].c_mode |= BOLD|mode;
+			} else {
+				w = obuf[col].c_width;
+				for (i = 0; i < w; i++)
+					obuf[col + i].c_mode = mode;
+			}
+			col += w;
+			if (col > maxcol)
+				maxcol = col;
 			continue;
-		if (obuf[col].c_char == '\0') {
-			obuf[col].c_char = c;
-			for (i = 0; i < w; i++)
-				obuf[col + i].c_mode = mode;
-			obuf[col].c_width = w;
-			for (i = 1; i < w; i++)
-				obuf[col + i].c_width = -1;
-		} else if (obuf[col].c_char == '_') {
-			obuf[col].c_char = c;
-			for (i = 0; i < w; i++)
-				obuf[col + i].c_mode |= UNDERL|mode;
-			obuf[col].c_width = w;
-			for (i = 1; i < w; i++)
-				obuf[col + i].c_width = -1;
-		} else if ((wint_t)obuf[col].c_char == c) {
-			for (i = 0; i < w; i++)
-				obuf[col + i].c_mode |= BOLD|mode;
-		} else {
-			w = obuf[col].c_width;
-			for (i = 0; i < w; i++)
-				obuf[col + i].c_mode = mode;
 		}
-		col += w;
-		if (col > maxcol)
-			maxcol = col;
-		continue;
 	}
 	if (ferror(f))
 		err(1, NULL);
@@ -405,7 +430,7 @@ static void
 initbuf(void)
 {
 
-	bzero((char *)obuf, sizeof (obuf));	/* depends on NORMAL == 0 */
+	bzero((char *)obuf, buflen * sizeof(*obuf)); /* depends on NORMAL == 0 */
 	col = 0;
 	maxcol = 0;
 	mode &= ALTSET;


More information about the svn-src-head mailing list