FreeBSD Bugzilla – Attachment 171507 Details for
Bug 210344
ul(1) truncates long lines
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Accomodate long lines in ul(1)
ul.c.diff.txt (text/plain), 5.59 KB, created by
Pietro Cerutti
on 2016-06-17 14:09:00 UTC
(
hide
)
Description:
Accomodate long lines in ul(1)
Filename:
MIME Type:
Creator:
Pietro Cerutti
Created:
2016-06-17 14:09:00 UTC
Size:
5.59 KB
patch
obsolete
>Index: ul.c >=================================================================== >--- ul.c (revision 301965) >+++ ul.c (working copy) >@@ -78,7 +78,9 @@ > 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 @@ > else > filter(f); > } >+ if (obuf != sobuf) { >+ free(obuf); >+ } > exit(0); > } > >@@ -166,128 +171,145 @@ > { > wint_t c; > int i, w; >+ int 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 '\b': >- if (col > 0) >- col--; >- continue; >+ case '\t': >+ col = (col+8) & ~07; >+ if (col > maxcol) >+ maxcol = col; >+ continue; > >- case '\t': >- col = (col+8) & ~07; >- if (col > maxcol) >- maxcol = col; >- continue; >+ case '\r': >+ col = 0; >+ continue; > >- case '\r': >- col = 0; >- continue; >+ case SO: >+ mode |= ALTSET; >+ continue; > >- case SO: >- mode |= ALTSET; >- continue; >+ case SI: >+ 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(); >+ } >+ 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; > >+ case '\f': >+ flushln(); >+ putwchar('\f'); >+ 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 ((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 +427,7 @@ > 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;
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 210344
: 171507 |
171508