]> git.cameronkatri.com Git - mandoc.git/commitdiff
Fix `ds' handling. This was stripping characters from "val", when the
authorKristaps Dzonsons <kristaps@bsd.lv>
Tue, 27 Jul 2010 13:16:00 +0000 (13:16 +0000)
committerKristaps Dzonsons <kristaps@bsd.lv>
Tue, 27 Jul 2010 13:16:00 +0000 (13:16 +0000)
syntax of `ds' is such that ALL text following the first
non-space/non-double-quote is part of the value.  This also fixes the
warning of *(string++) = NULL report by kristaps@ and joerg@.

roff.7
roff.c

diff --git a/roff.7 b/roff.7
index 1b455217d6e454e956e9713267701bae112b2dd6..9b8250bce973049a6cbdeb106318db7ead95df37 100644 (file)
--- a/roff.7
+++ b/roff.7
@@ -1,4 +1,4 @@
-.\"    $Id: roff.7,v 1.13 2010/07/07 15:04:54 kristaps Exp $
+.\"    $Id: roff.7,v 1.14 2010/07/27 13:16:00 kristaps Exp $
 .\"
 .\" Copyright (c) 2010 Kristaps Dzonsons <kristaps@bsd.lv>
 .\" Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
@@ -15,7 +15,7 @@
 .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 .\"
-.Dd $Mdocdate: July 7 2010 $
+.Dd $Mdocdate: July 27 2010 $
 .Dt ROFF 7
 .Os
 .Sh NAME
@@ -106,6 +106,15 @@ The
 .Cm key
 values may be invoked in subsequent text by using \e*(NN for two-letter
 pairs, \e*N for one-letter, and \e*[NNN] for arbitrary-length values.
+.Pp
+If
+.Cm val
+is begun with a double-quote mark, the mark is passed over.
+.Cm val
+consists of
+.Em all
+text following this point, including whitespace and trailing
+double-quotes.
 .Ss \&de1
 The syntax of this macro is the same as that of
 .Sx \&ig ,
diff --git a/roff.c b/roff.c
index 1e054d0e49fce9a394331a78fff47431c82b05f3..3363da158412a2e0381b0f6768163bf98022a374 100644 (file)
--- a/roff.c
+++ b/roff.c
@@ -1,4 +1,4 @@
-/*     $Id: roff.c,v 1.95 2010/07/21 09:15:48 kristaps Exp $ */
+/*     $Id: roff.c,v 1.96 2010/07/27 13:16:00 kristaps Exp $ */
 /*
  * Copyright (c) 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
@@ -969,30 +969,40 @@ roff_cond(ROFF_ARGS)
 static enum rofferr
 roff_ds(ROFF_ARGS)
 {
-       char *name, *string, *end;
+       char            *name, *string;
+
+       /*
+        * A symbol is named by the first word following the macro
+        * invocation up to a space.  Its value is anything after the
+        * name's trailing whitespace and optional double-quote.  Thus,
+        *
+        *  [.ds foo "bar  "     ]
+        *
+        * will have `bar  "     ' as its value.
+        */
 
        name = *bufp + pos;
        if ('\0' == *name)
                return(ROFF_IGN);
 
        string = name;
+       /* Read until end of name. */
        while (*string && ' ' != *string)
                string++;
+
+       /* Nil-terminate name. */
        if (*string)
-               *(string++) = NULL;
-       if (*string && '"' == *string)
-               string++;
+               *(string++) = '\0';
+       
+       /* Read past spaces. */
        while (*string && ' ' == *string)
                string++;
-       end = string;
-       while (*end)
-               end++;
-       if (string < end) {
-               end--;
-               if (*end == '"')
-                       *end = '\0';
-       }
 
+       /* Read passed initial double-quote. */
+       if (*string && '"' == *string)
+               string++;
+
+       /* The rest is the value. */
        roff_setstr(r, name, string);
        return(ROFF_IGN);
 }
@@ -1060,6 +1070,7 @@ roff_setstr(struct roff *r, const char *name, const char *string)
        } else
                free(n->string);
 
+       ROFF_DEBUG("roff: new symbol: [%s] = [%s]\n", name, string);
        n->string = string ? strdup(string) : NULL;
 }