summaryrefslogtreecommitdiffstats
path: root/usr.bin
diff options
context:
space:
mode:
authorgahr <gahr@FreeBSD.org>2016-07-20 07:33:48 +0000
committergahr <gahr@FreeBSD.org>2016-07-20 07:33:48 +0000
commit699d61e835d71802a4b669129b0e6c57e587dfea (patch)
tree393354315b92d67838a354eb651546fc679a40d4 /usr.bin
parenta64caf4afbf47fec693a39f291f0a73bef78e5bd (diff)
downloadFreeBSD-src-699d61e835d71802a4b669129b0e6c57e587dfea.zip
FreeBSD-src-699d61e835d71802a4b669129b0e6c57e587dfea.tar.gz
MFC r302558:
Do not truncate lines longer than 512 chars. PR: 210344 Differential Revision: https://reviews.freebsd.org/D6881
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/ul/ul.c241
1 files changed, 133 insertions, 108 deletions
diff --git a/usr.bin/ul/ul.c b/usr.bin/ul/ul.c
index 7aecf6c..34a86be 100644
--- a/usr.bin/ul/ul.c
+++ b/usr.bin/ul/ul.c
@@ -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;
@@ -155,6 +157,9 @@ main(int argc, char **argv)
else
filter(f);
}
+ if (obuf != sobuf) {
+ free(obuf);
+ }
exit(0);
}
@@ -170,128 +175,148 @@ filter(FILE *f)
{
wint_t c;
int i, w;
-
- while ((c = getwc(f)) != WEOF && col < MAXBUF) switch(c) {
-
- 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();
+ 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;
- case HFWD:
- if (halfpos == 0) {
- mode |= SUBSC;
- halfpos++;
- } else if (halfpos < 0) {
- mode &= ~SUPERSC;
- halfpos++;
- } else {
- halfpos = 0;
- fwd();
- }
+ case '\t':
+ col = (col+8) & ~07;
+ if (col > maxcol)
+ maxcol = col;
continue;
- case FREV:
- reverse();
+ case '\r':
+ col = 0;
continue;
- default:
- errx(1, "unknown escape sequence in input: %o, %o", IESC, c);
- }
- continue;
+ case SO:
+ mode |= ALTSET;
+ 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;
+ 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();
+ }
+ 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);
@@ -409,7 +434,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;
OpenPOWER on IntegriCloud