From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from krisdoz.my.domain (kristaps@localhost [127.0.0.1]) by krisdoz.my.domain (8.14.3/8.14.3) with ESMTP id p6R79fsx027541 for ; Wed, 27 Jul 2011 03:09:42 -0400 (EDT) Received: (from kristaps@localhost) by krisdoz.my.domain (8.14.3/8.14.3/Submit) id p6R79fgg026266; Wed, 27 Jul 2011 03:09:41 -0400 (EDT) Date: Wed, 27 Jul 2011 03:09:41 -0400 (EDT) Message-Id: <201107270709.p6R79fgg026266@krisdoz.my.domain> X-Mailinglist: mdocml-source Reply-To: source@mdocml.bsd.lv MIME-Version: 1.0 From: kristaps@mdocml.bsd.lv To: source@mdocml.bsd.lv Subject: mdocml: First, roff_res() has no need to invoke ROFF_RERUN: since it's X-Mailer: activitymail 1.26, http://search.cpan.org/dist/activitymail/ Content-Type: text/plain; charset=utf-8 Log Message: ----------- First, roff_res() has no need to invoke ROFF_RERUN: since it's executed before any other roff processing occurs, it's Ok to just let it do its thing and pass through. Also, make sure this function is ALWAYS called, not just when first_string is defined. Second, add a new function, roff_parsetext(), that post-processes non-macro lines. This, for the time being, amounts to detecting soft hyphens. This fixes a long-standing bug in that -man now has proper hyphen breaking! Modified Files: -------------- mdocml: mdoc.c roff.c Revision Data ------------- Index: mdoc.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc.c,v retrieving revision 1.191 retrieving revision 1.192 diff -Lmdoc.c -Lmdoc.c -u -p -r1.191 -r1.192 --- mdoc.c +++ mdoc.c @@ -755,11 +755,6 @@ mdoc_ptext(struct mdoc *m, int line, cha ws = NULL; for (c = end = buf + offs; *c; c++) { switch (*c) { - case '-': - if (mandoc_hyph(buf + offs, c)) - *c = ASCII_HYPH; - ws = NULL; - break; case ' ': if (NULL == ws) ws = c; Index: roff.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/roff.c,v retrieving revision 1.153 retrieving revision 1.154 diff -Lroff.c -Lroff.c -u -p -r1.153 -r1.154 --- roff.c +++ roff.c @@ -159,7 +159,7 @@ static const char *roff_getstrn(const st const char *, size_t); static enum rofferr roff_line_ignore(ROFF_ARGS); static enum rofferr roff_nr(ROFF_ARGS); -static int roff_res(struct roff *, +static void roff_res(struct roff *, char **, size_t *, int, int); static enum rofferr roff_rm(ROFF_ARGS); static void roff_setstr(struct roff *, @@ -400,8 +400,8 @@ roff_alloc(struct mparse *parse) * `\*', e.g., `\*(ab'). These must be handled before the actual line * is processed. * This also checks the syntax of regular escapes. -*/ -static int + */ +static void roff_res(struct roff *r, char **bufp, size_t *szp, int ln, int pos) { enum mandoc_esc esc; @@ -413,8 +413,7 @@ roff_res(struct roff *r, char **bufp, si size_t nsz; char *n; - /* Search for a leading backslash and save a pointer to it. */ - +again: cp = *bufp + pos; while (NULL != (cp = strchr(cp, '\\'))) { stesc = cp++; @@ -426,7 +425,7 @@ roff_res(struct roff *r, char **bufp, si */ if ('\0' == *cp) - return(1); + return; if ('*' != *cp) { res = cp; @@ -437,7 +436,7 @@ roff_res(struct roff *r, char **bufp, si mandoc_msg (MANDOCERR_BADESCAPE, r->parse, ln, (int)(stesc - *bufp), NULL); - continue; + return; } cp++; @@ -450,7 +449,7 @@ roff_res(struct roff *r, char **bufp, si switch (*cp) { case ('\0'): - return(1); + return; case ('('): cp++; maxl = 2; @@ -473,7 +472,7 @@ roff_res(struct roff *r, char **bufp, si (MANDOCERR_BADESCAPE, r->parse, ln, (int)(stesc - *bufp), NULL); - return(1); + return; } if (0 == maxl && ']' == *cp) break; @@ -495,6 +494,8 @@ roff_res(struct roff *r, char **bufp, si /* Replace the escape sequence by the string. */ + pos += (stesc - *bufp); + nsz = *szp + strlen(res) + 1; n = mandoc_malloc(nsz); @@ -506,10 +507,41 @@ roff_res(struct roff *r, char **bufp, si *bufp = n; *szp = nsz; - return(0); + goto again; + } +} + +/* + * Process text streams: convert all breakable hyphens into ASCII_HYPH. + */ +static enum rofferr +roff_parsetext(char *p) +{ + size_t sz; + const char *start; + enum mandoc_esc esc; + + start = p; + + while ('\0' != *p) { + sz = strcspn(p, "-\\"); + p += sz; + + if ('\\' == *p) { + /* Skip over escapes. */ + p++; + esc = mandoc_escape + ((const char **)&p, NULL, NULL); + if (ESCAPE_ERROR == esc) + break; + } else if ('-' == *p) { + if (mandoc_hyph(start, p)) + *p = ASCII_HYPH; + p++; + } } - return(1); + return(ROFF_CONT); } enum rofferr @@ -525,8 +557,7 @@ roff_parseln(struct roff *r, int ln, cha * words to fill in. */ - if ( ! roff_res(r, bufp, szp, ln, pos)) - return(ROFF_REPARSE); + roff_res(r, bufp, szp, ln, pos); ppos = pos; ctl = mandoc_getcontrol(*bufp, &pos); @@ -551,13 +582,13 @@ roff_parseln(struct roff *r, int ln, cha return(eqn_read(&r->eqn, ln, *bufp, pos, offs)); if (r->tbl) return(tbl_read(r->tbl, ln, *bufp, pos)); - return(ROFF_CONT); + return(roff_parsetext(*bufp + pos)); } else if ( ! ctl) { if (r->eqn) return(eqn_read(&r->eqn, ln, *bufp, pos, offs)); if (r->tbl) return(tbl_read(r->tbl, ln, *bufp, pos)); - return(ROFF_CONT); + return(roff_parsetext(*bufp + pos)); } else if (r->eqn) return(eqn_read(&r->eqn, ln, *bufp, ppos, offs)); -- To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv