]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_argv.c
Simplify the roff(7) .ce and .rj terminal formatter by using the
[mandoc.git] / mdoc_argv.c
index 6fae24df1a40ebb17c607bad663383c6bb03d442..f4ce4a8730f3149145ce3fc1f6a4ad3d9e5ed817 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_argv.c,v 1.116 2018/08/17 20:33:37 schwarze Exp $ */
+/*     $Id: mdoc_argv.c,v 1.119 2018/12/21 17:15:19 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2012, 2014-2018 Ingo Schwarze <schwarze@openbsd.org>
@@ -416,11 +416,8 @@ mdoc_args(struct roff_man *mdoc, int line, int *pos,
        char *buf, enum roff_tok tok, char **v)
 {
        struct roff_node *n;
-       char             *v_local;
        enum argsflag     fl;
 
-       if (v == NULL)
-               v = &v_local;
        fl = tok == TOKEN_NONE ? ARGSFL_NONE : mdocargs[tok - MDOC_Dd].flags;
 
        /*
@@ -448,18 +445,20 @@ args(struct roff_man *mdoc, int line, int *pos,
                char *buf, enum argsflag fl, char **v)
 {
        char            *p;
+       char            *v_local;
        int              pairs;
 
        if (buf[*pos] == '\0') {
                if (mdoc->flags & MDOC_PHRASELIT &&
                    ! (mdoc->flags & MDOC_PHRASE)) {
-                       mandoc_msg(MANDOCERR_ARG_QUOTE,
-                           mdoc->parse, line, *pos, NULL);
+                       mandoc_msg(MANDOCERR_ARG_QUOTE, line, *pos, NULL);
                        mdoc->flags &= ~MDOC_PHRASELIT;
                }
                return ARGS_EOLN;
        }
 
+       if (v == NULL)
+               v = &v_local;
        *v = buf + *pos;
 
        if (fl == ARGSFL_DELIM && args_checkpunct(buf, *pos))
@@ -505,7 +504,7 @@ args(struct roff_man *mdoc, int line, int *pos,
                        p = strchr(*v, '\0');
                        if (p[-1] == ' ')
                                mandoc_msg(MANDOCERR_SPACE_EOL,
-                                   mdoc->parse, line, *pos, NULL);
+                                   line, *pos, NULL);
                        *pos += (int)(p - *v);
                }
 
@@ -526,13 +525,12 @@ args(struct roff_man *mdoc, int line, int *pos,
         * Whitespace is NOT involved in literal termination.
         */
 
-       if (mdoc->flags & MDOC_PHRASELIT || buf[*pos] == '\"') {
-               if ( ! (mdoc->flags & MDOC_PHRASELIT))
+       if (mdoc->flags & MDOC_PHRASELIT ||
+           (mdoc->flags & MDOC_PHRASE && buf[*pos] == '\"')) {
+               if ((mdoc->flags & MDOC_PHRASELIT) == 0) {
                        *v = &buf[++(*pos)];
-
-               if (mdoc->flags & MDOC_PHRASE)
                        mdoc->flags |= MDOC_PHRASELIT;
-
+               }
                pairs = 0;
                for ( ; buf[*pos]; (*pos)++) {
                        /* Move following text left after quoted quotes. */
@@ -553,7 +551,7 @@ args(struct roff_man *mdoc, int line, int *pos,
                if (buf[*pos] == '\0') {
                        if ( ! (mdoc->flags & MDOC_PHRASE))
                                mandoc_msg(MANDOCERR_ARG_QUOTE,
-                                   mdoc->parse, line, *pos, NULL);
+                                   line, *pos, NULL);
                        return ARGS_WORD;
                }
 
@@ -567,14 +565,15 @@ args(struct roff_man *mdoc, int line, int *pos,
                        (*pos)++;
 
                if ('\0' == buf[*pos])
-                       mandoc_msg(MANDOCERR_SPACE_EOL, mdoc->parse,
-                           line, *pos, NULL);
+                       mandoc_msg(MANDOCERR_SPACE_EOL, line, *pos, NULL);
 
                return ARGS_WORD;
        }
 
        p = &buf[*pos];
-       *v = mandoc_getarg(mdoc->parse, &p, line, pos);
+       *v = roff_getarg(mdoc->roff, &p, line, pos);
+       if (v == &v_local)
+               free(*v);
 
        /*
         * After parsing the last word in this phrase,
@@ -585,7 +584,7 @@ args(struct roff_man *mdoc, int line, int *pos,
                mdoc->flags &= ~MDOC_PHRASEQL;
                mdoc->flags |= MDOC_PHRASEQF;
        }
-       return ARGS_WORD;
+       return ARGS_ALLOC;
 }
 
 /*
@@ -656,7 +655,9 @@ argv_multi(struct roff_man *mdoc, int line,
                        v->value = mandoc_reallocarray(v->value,
                            v->sz + MULTI_STEP, sizeof(char *));
 
-               v->value[(int)v->sz] = mandoc_strdup(p);
+               if (ac != ARGS_ALLOC)
+                       p = mandoc_strdup(p);
+               v->value[(int)v->sz] = p;
        }
 }
 
@@ -671,7 +672,10 @@ argv_single(struct roff_man *mdoc, int line,
        if (ac == ARGS_EOLN)
                return;
 
+       if (ac != ARGS_ALLOC)
+               p = mandoc_strdup(p);
+
        v->sz = 1;
        v->value = mandoc_malloc(sizeof(char *));
-       v->value[0] = mandoc_strdup(p);
+       v->value[0] = p;
 }