source@mandoc.bsd.lv
 help / color / mirror / Atom feed
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
Date: Wed, 27 Jul 2011 03:09:41 -0400 (EDT)	[thread overview]
Message-ID: <201107270709.p6R79fgg026266@krisdoz.my.domain> (raw)

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

                 reply	other threads:[~2011-07-27  7:09 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=201107270709.p6R79fgg026266@krisdoz.my.domain \
    --to=kristaps@mdocml.bsd.lv \
    --cc=source@mdocml.bsd.lv \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).