]> git.cameronkatri.com Git - mandoc.git/commitdiff
correctly parse spacing around in-line equations
authorIngo Schwarze <schwarze@openbsd.org>
Mon, 20 Oct 2014 15:04:56 +0000 (15:04 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Mon, 20 Oct 2014 15:04:56 +0000 (15:04 +0000)
at the beginning and at the end of input lines;
issue reported by kristaps@

roff.c

diff --git a/roff.c b/roff.c
index a395b83cff64fd12a237d9efd13ca58e9cf804df..1dde1d4c4934f5976a983209f47277f60bb7fc18 100644 (file)
--- a/roff.c
+++ b/roff.c
@@ -1,4 +1,4 @@
-/*     $Id: roff.c,v 1.232 2014/10/20 02:33:06 schwarze Exp $ */
+/*     $Id: roff.c,v 1.233 2014/10/20 15:04:56 schwarze Exp $ */
 /*
  * Copyright (c) 2010, 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -1857,7 +1857,8 @@ roff_T_(ROFF_ARGS)
 static enum rofferr
 roff_eqndelim(struct roff *r, char **bufp, size_t *szp, int pos)
 {
-       char    *cp1, *cp2;
+       char            *cp1, *cp2;
+       const char      *bef_pr, *bef_nl, *mac, *aft_nl, *aft_pr;
 
        /*
         * Outside equations, look for an opening delimiter.
@@ -1872,11 +1873,41 @@ roff_eqndelim(struct roff *r, char **bufp, size_t *szp, int pos)
        if (cp2 == NULL)
                return(ROFF_CONT);
 
-       /* Replace the delimiter with an equation macro. */
-
        *cp2++ = '\0';
-       *szp = mandoc_asprintf(&cp1, "%s%s%s", *bufp,
-           r->eqn == NULL ? "\\&\n.EQ\n" : "\n.EN\n\\&", cp2) + 1;
+       bef_pr = bef_nl = aft_nl = aft_pr = "";
+
+       /* Handle preceding text, protecting whitespace. */
+
+       if (**bufp != '\0') {
+               if (r->eqn == NULL)
+                       bef_pr = "\\&";
+               bef_nl = "\n";
+       }
+
+       /*
+        * Prepare replacing the delimiter with an equation macro
+        * and drop leading white space from the equation.
+        */
+
+       if (r->eqn == NULL) {
+               while (*cp2 == ' ')
+                       cp2++;
+               mac = ".EQ";
+       } else
+               mac = ".EN";
+
+       /* Handle following text, protecting whitespace. */
+
+       if (*cp2 != '\0') {
+               aft_nl = "\n";
+               if (r->eqn != NULL)
+                       aft_pr = "\\&";
+       }
+
+       /* Do the actual replacement. */
+
+       *szp = mandoc_asprintf(&cp1, "%s%s%s%s%s%s%s", *bufp,
+           bef_pr, bef_nl, mac, aft_nl, aft_pr, cp2) + 1;
        free(*bufp);
        *bufp = cp1;