aboutsummaryrefslogtreecommitdiff
path: root/usr.bin/ul
diff options
context:
space:
mode:
authorPietro Cerutti <gahr@FreeBSD.org>2016-07-11 08:05:46 +0000
committerPietro Cerutti <gahr@FreeBSD.org>2016-07-11 08:05:46 +0000
commit5a4d1cc66fa0b2caec9f5ddfdc1ca411a67bfdda (patch)
treeb82bede0d1e430fc338c763fe84b6e169a0b4776 /usr.bin/ul
parent3e1c325e63ec37c3b3c748f646aed254c7d4dc77 (diff)
Notes
Diffstat (limited to 'usr.bin/ul')
-rw-r--r--usr.bin/ul/ul.c229
1 files changed, 127 insertions, 102 deletions
diff --git a/usr.bin/ul/ul.c b/usr.bin/ul/ul.c
index 4816b7d669c70..e6df8804f6e2e 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;
@@ -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 && col < MAXBUF) switch(c) {
+ 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 '\t':
+ col = (col+8) & ~07;
+ if (col > maxcol)
+ maxcol = col;
+ continue;
- case '\b':
- if (col > 0)
- col--;
- continue;
+ case '\r':
+ col = 0;
+ continue;
- case '\t':
- col = (col+8) & ~07;
- if (col > maxcol)
- maxcol = col;
- continue;
+ case SO:
+ mode |= ALTSET;
+ continue;
- case '\r':
- col = 0;
- continue;
+ case SI:
+ mode &= ~ALTSET;
+ continue;
- case SO:
- mode |= ALTSET;
- continue;
+ case IESC:
+ switch (c = getwc(f)) {
- case SI:
- mode &= ~ALTSET;
- continue;
+ case HREV:
+ if (halfpos == 0) {
+ mode |= SUPERSC;
+ halfpos--;
+ } else if (halfpos > 0) {
+ mode &= ~SUBSC;
+ halfpos--;
+ } else {
+ halfpos = 0;
+ reverse();
+ }
+ continue;
- case IESC:
- switch (c = getwc(f)) {
+ case HFWD:
+ if (halfpos == 0) {
+ mode |= SUBSC;
+ halfpos++;
+ } else if (halfpos < 0) {
+ mode &= ~SUPERSC;
+ halfpos++;
+ } else {
+ halfpos = 0;
+ fwd();
+ }
+ continue;
- case HREV:
- if (halfpos == 0) {
- mode |= SUPERSC;
- halfpos--;
- } else if (halfpos > 0) {
- mode &= ~SUBSC;
- halfpos--;
- } else {
- halfpos = 0;
+ case FREV:
reverse();
+ continue;
+
+ default:
+ errx(1, "unknown escape sequence in input: %o, %o", IESC, c);
}
continue;
- case HFWD:
- if (halfpos == 0) {
- mode |= SUBSC;
- halfpos++;
- } else if (halfpos < 0) {
- mode &= ~SUPERSC;
- halfpos++;
- } else {
- halfpos = 0;
- fwd();
+ 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;
- case FREV:
- reverse();
+ case '\n':
+ flushln();
continue;
- default:
- errx(1, "unknown escape sequence in input: %o, %o", IESC, c);
- }
- continue;
+ case '\f':
+ flushln();
+ putwchar('\f');
+ 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;
+ 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;
}
- obuf[col].c_char = '_';
- obuf[col].c_width = 1;
- /* FALLTHROUGH */
- case ' ':
- col++;
- if (col > maxcol)
- maxcol = col;
- continue;
-
- case '\n':
- flushln();
- continue;
-
- case '\f':
- flushln();
- putwchar('\f');
- continue;
-
- 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 (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;