]> git.cameronkatri.com Git - mandoc.git/blobdiff - roff.c
Correctly make quotes around `Lk' link-name argument. Noted by Aldis
[mandoc.git] / roff.c
diff --git a/roff.c b/roff.c
index 1e054d0e49fce9a394331a78fff47431c82b05f3..c21cc025f29d09bdae5ced5774e0348060b2288e 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.97 2010/07/27 19:56:50 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;
 }
 
@@ -1070,7 +1081,7 @@ roff_getstrn(const struct roff *r, const char *name, size_t len)
        const struct roffstr *n;
 
        n = r->first_string;
-       while (n && (strncmp(name, n->name, len) || '\0' != n->name[len]))
+       while (n && (strncmp(name, n->name, len) || '\0' != n->name[(int)len]))
                n = n->next;
 
        return(n ? n->string : NULL);