]> git.cameronkatri.com Git - mandoc.git/blobdiff - roff.c
Explain how to transform markup for the terminal when not using a
[mandoc.git] / roff.c
diff --git a/roff.c b/roff.c
index db11e1907f53df241b98c48d19a3638cfabe9001..e2e498da0ce4cd5733ee0fbe9cb21028a007c110 100644 (file)
--- a/roff.c
+++ b/roff.c
@@ -1,4 +1,4 @@
-/*     $Id: roff.c,v 1.320 2017/07/08 15:28:09 schwarze Exp $ */
+/*     $Id: roff.c,v 1.324 2017/07/14 17:16:16 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -153,6 +153,7 @@ static      void             roffnode_cleanscope(struct roff *);
 static void             roffnode_pop(struct roff *);
 static void             roffnode_push(struct roff *, enum roff_tok,
                                const char *, int, int);
+static void             roff_addtbl(struct roff_man *, struct tbl_node *);
 static enum rofferr     roff_als(ROFF_ARGS);
 static enum rofferr     roff_block(ROFF_ARGS);
 static enum rofferr     roff_block_text(ROFF_ARGS);
@@ -979,18 +980,21 @@ roff_body_alloc(struct roff_man *man, int line, int pos, int tok)
        return n;
 }
 
-void
-roff_addtbl(struct roff_man *man, const struct tbl_span *tbl)
+static void
+roff_addtbl(struct roff_man *man, struct tbl_node *tbl)
 {
        struct roff_node        *n;
+       const struct tbl_span   *span;
 
        if (man->macroset == MACROSET_MAN)
                man_breakscope(man, ROFF_TS);
-       n = roff_node_alloc(man, tbl->line, 0, ROFFT_TBL, TOKEN_NONE);
-       n->span = tbl;
-       roff_node_append(man, n);
-       n->flags |= NODE_VALID | NODE_ENDED;
-       man->next = ROFF_NEXT_SIBLING;
+       while ((span = tbl_span(tbl)) != NULL) {
+               n = roff_node_alloc(man, tbl->line, 0, ROFFT_TBL, TOKEN_NONE);
+               n->span = span;
+               roff_node_append(man, n);
+               n->flags |= NODE_VALID | NODE_ENDED;
+               man->next = ROFF_NEXT_SIBLING;
+       }
 }
 
 void
@@ -1123,13 +1127,13 @@ roff_res(struct roff *r, struct buf *buf, int ln, int pos)
        size_t           maxl;  /* expected length of the escape name */
        size_t           naml;  /* actual length of the escape name */
        enum mandoc_esc  esc;   /* type of the escape sequence */
-       enum mandoc_os   os_e;  /* kind of RCS id seen */
        int              inaml; /* length returned from mandoc_escape() */
        int              expand_count;  /* to avoid infinite loops */
        int              npos;  /* position in numeric expression */
        int              arg_complete; /* argument not interrupted by eol */
        int              done;  /* no more input available */
        int              deftype; /* type of definition to paste */
+       int              rcsid; /* kind of RCS id seen */
        char             term;  /* character terminating the escape */
 
        /* Search forward for comments. */
@@ -1145,20 +1149,21 @@ roff_res(struct roff *r, struct buf *buf, int ln, int pos)
 
                /* Comment found, look for RCS id. */
 
+               rcsid = 0;
                if ((cp = strstr(stesc, "$" "OpenBSD")) != NULL) {
-                       os_e = MANDOC_OS_OPENBSD;
+                       rcsid = 1 << MANDOC_OS_OPENBSD;
                        cp += 8;
                } else if ((cp = strstr(stesc, "$" "NetBSD")) != NULL) {
-                       os_e = MANDOC_OS_NETBSD;
+                       rcsid = 1 << MANDOC_OS_NETBSD;
                        cp += 7;
                }
                if (cp != NULL &&
                    isalnum((unsigned char)*cp) == 0 &&
                    strchr(cp, '$') != NULL) {
-                       if (r->man->meta.rcsids & (1 << os_e))
+                       if (r->man->meta.rcsids & rcsid)
                                mandoc_msg(MANDOCERR_RCS_REP, r->parse,
                                    ln, stesc + 1 - buf->buf, stesc + 1);
-                       r->man->meta.rcsids |= 1 << os_e;
+                       r->man->meta.rcsids |= rcsid;
                }
 
                /* Handle trailing whitespace. */
@@ -1501,8 +1506,11 @@ roff_parseln(struct roff *r, int ln, struct buf *buf, int *offs)
                eqn_read(r->eqn, buf->buf + ppos);
                return ROFF_IGN;
        }
-       if (r->tbl != NULL && ( ! ctl || buf->buf[pos] == '\0'))
-               return tbl_read(r->tbl, ln, buf->buf, ppos);
+       if (r->tbl != NULL && (ctl == 0 || buf->buf[pos] == '\0')) {
+               tbl_read(r->tbl, ln, buf->buf, ppos);
+               roff_addtbl(r->man, r->tbl);
+               return ROFF_IGN;
+       }
        if ( ! ctl)
                return roff_parsetext(r, buf, pos, offs);
 
@@ -1543,13 +1551,16 @@ roff_parseln(struct roff *r, int ln, struct buf *buf, int *offs)
                        pos++;
                while (buf->buf[pos] == ' ')
                        pos++;
-               return tbl_read(r->tbl, ln, buf->buf, pos);
+               tbl_read(r->tbl, ln, buf->buf, pos);
+               roff_addtbl(r->man, r->tbl);
+               return ROFF_IGN;
        }
 
        /* For now, let high level macros abort .ce mode. */
 
        if (ctl && roffce_node != NULL &&
-           (t == TOKEN_NONE || t == ROFF_EQ || t == ROFF_TS)) {
+           (t == TOKEN_NONE || t == ROFF_Dd || t == ROFF_EQ ||
+            t == ROFF_TH || t == ROFF_TS)) {
                r->man->last = roffce_node;
                r->man->next = ROFF_NEXT_SIBLING;
                roffce_lines = 0;
@@ -1572,23 +1583,23 @@ roff_parseln(struct roff *r, int ln, struct buf *buf, int *offs)
 void
 roff_endparse(struct roff *r)
 {
-
-       if (r->last)
+       if (r->last != NULL)
                mandoc_msg(MANDOCERR_BLK_NOEND, r->parse,
                    r->last->line, r->last->col,
                    roff_name[r->last->tok]);
 
-       if (r->eqn) {
+       if (r->eqn != NULL) {
                mandoc_msg(MANDOCERR_BLK_NOEND, r->parse,
                    r->eqn->node->line, r->eqn->node->pos, "EQ");
                eqn_parse(r->eqn);
                r->eqn = NULL;
        }
 
-       if (r->tbl) {
+       if (r->tbl != NULL) {
                mandoc_msg(MANDOCERR_BLK_NOEND, r->parse,
                    r->tbl->line, r->tbl->pos, "TS");
-               tbl_end(&r->tbl);
+               tbl_end(r->tbl);
+               r->tbl = NULL;
        }
 }
 
@@ -2770,16 +2781,19 @@ roff_Dd(ROFF_ARGS)
 static enum rofferr
 roff_TE(ROFF_ARGS)
 {
-
-       if (NULL == r->tbl)
+       if (r->tbl == NULL) {
                mandoc_msg(MANDOCERR_BLK_NOTOPEN, r->parse,
                    ln, ppos, "TE");
-       else if ( ! tbl_end(&r->tbl)) {
+               return ROFF_IGN;
+       }
+       if (tbl_end(r->tbl) == 0) {
+               r->tbl = NULL;
                free(buf->buf);
                buf->buf = mandoc_strdup(".sp");
                buf->sz = 4;
                return ROFF_REPARSE;
        }
+       r->tbl = NULL;
        return ROFF_IGN;
 }
 
@@ -2867,6 +2881,8 @@ roff_EQ(ROFF_ARGS)
 {
        struct roff_node        *n;
 
+       if (r->man->macroset == MACROSET_MAN)
+               man_breakscope(r->man, ROFF_EQ);
        n = roff_node_alloc(r->man, ln, ppos, ROFFT_EQN, TOKEN_NONE);
        if (ln > r->man->last->line)
                n->flags |= NODE_LINE;
@@ -2907,22 +2923,17 @@ roff_EN(ROFF_ARGS)
 static enum rofferr
 roff_TS(ROFF_ARGS)
 {
-       struct tbl_node *tbl;
-
-       if (r->tbl) {
+       if (r->tbl != NULL) {
                mandoc_msg(MANDOCERR_BLK_BROKEN, r->parse,
                    ln, ppos, "TS breaks TS");
-               tbl_end(&r->tbl);
+               tbl_end(r->tbl);
        }
-
-       tbl = tbl_alloc(ppos, ln, r->parse);
-
+       r->tbl = tbl_alloc(ppos, ln, r->parse);
        if (r->last_tbl)
-               r->last_tbl->next = tbl;
+               r->last_tbl->next = r->tbl;
        else
-               r->first_tbl = r->last_tbl = tbl;
-
-       r->tbl = r->last_tbl = tbl;
+               r->first_tbl = r->tbl;
+       r->last_tbl = r->tbl;
        return ROFF_IGN;
 }
 
@@ -3601,13 +3612,6 @@ roff_freestr(struct roffkv *r)
 
 /* --- accessors and utility functions ------------------------------------ */
 
-const struct tbl_span *
-roff_span(const struct roff *r)
-{
-
-       return r->tbl ? tbl_span(r->tbl) : NULL;
-}
-
 /*
  * Duplicate an input string, making the appropriate character
  * conversations (as stipulated by `tr') along the way.