diff options
author | 2011-01-04 22:28:17 +0000 | |
---|---|---|
committer | 2011-01-04 22:28:17 +0000 | |
commit | 2791bd1c99baed97baf79feee97899256995b5a6 (patch) | |
tree | 50f04f74700b9a5b5602a363f3872a3788017c6e /usr.bin/mandoc/man.c | |
parent | Add support for Memory Mapped Configuration space access. This gives us (diff) | |
download | wireguard-openbsd-2791bd1c99baed97baf79feee97899256995b5a6.tar.xz wireguard-openbsd-2791bd1c99baed97baf79feee97899256995b5a6.zip |
Merge kristaps@' cleaner tbl integration, removing mine;
there are still a few bugs, but fixing these will be easier in tree.
Diffstat (limited to 'usr.bin/mandoc/man.c')
-rw-r--r-- | usr.bin/mandoc/man.c | 103 |
1 files changed, 60 insertions, 43 deletions
diff --git a/usr.bin/mandoc/man.c b/usr.bin/mandoc/man.c index c0c6e34d119..2f534e1d9d1 100644 --- a/usr.bin/mandoc/man.c +++ b/usr.bin/mandoc/man.c @@ -1,6 +1,6 @@ -/* $Id: man.c,v 1.51 2011/01/01 17:38:11 schwarze Exp $ */ +/* $Id: man.c,v 1.52 2011/01/04 22:28:17 schwarze Exp $ */ /* - * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv> + * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -26,10 +26,6 @@ #include "libman.h" #include "libmandoc.h" -#include "out.h" -#include "term.h" -#include "tbl.h" - const char *const __man_macronames[MAN_MAX] = { "br", "TH", "SH", "SS", "TP", "LP", "PP", "P", @@ -39,7 +35,7 @@ const char *const __man_macronames[MAN_MAX] = { "RI", "na", "sp", "nf", "fi", "RE", "RS", "DT", "UC", "PD", "AT", "in", - "TS", "TE", "ft", + "ft" }; const char * const *man_macronames = __man_macronames; @@ -48,6 +44,8 @@ static struct man_node *man_node_alloc(int, int, enum man_type, enum mant); static int man_node_append(struct man *, struct man_node *); +static int man_span_alloc(struct man *, + const struct tbl_span *); static void man_node_free(struct man_node *); static void man_node_unlink(struct man *, struct man_node *); @@ -55,6 +53,7 @@ static int man_ptext(struct man *, int, char *, int); static int man_pmacro(struct man *, int, char *, int); static void man_free1(struct man *); static void man_alloc1(struct man *); +static int man_descope(struct man *, int, int); const struct man_node * @@ -124,22 +123,10 @@ man_endparse(struct man *m) int man_parseln(struct man *m, int ln, char *buf, int offs) { - struct man_node *n; if (MAN_HALT & m->flags) return(0); - n = m->last; - - if (n && MAN_TS == n->tok && MAN_BODY == n->type && - strncmp(buf+offs, ".TE", 3)) { - n = n->parent; - if ( ! tbl_read(n->data.TS, "man tbl parser", - ln, buf+offs, strlen(buf+offs))) - man_nmsg(m, n, MANDOCERR_TBL); - return(1); - } - return(('.' == buf[offs] || '\'' == buf[offs]) ? man_pmacro(m, ln, buf, offs) : man_ptext(m, ln, buf, offs)); @@ -224,6 +211,8 @@ man_node_append(struct man *man, struct man_node *p) man->last = p; switch (p->type) { + case (MAN_TBL): + /* FALLTHROUGH */ case (MAN_TEXT): if ( ! man_valid_post(man)) return(0); @@ -301,6 +290,21 @@ man_block_alloc(struct man *m, int line, int pos, enum mant tok) return(1); } +static int +man_span_alloc(struct man *m, const struct tbl_span *span) +{ + struct man_node *n; + + /* FIXME: grab from span */ + n = man_node_alloc(0, 0, MAN_TBL, MAN_MAX); + n->span = span; + + if ( ! man_node_append(m, n)) + return(0); + + m->next = MAN_NEXT_SIBLING; + return(1); +} int man_word_alloc(struct man *m, int line, int pos, const char *word) @@ -335,8 +339,6 @@ man_node_free(struct man_node *p) if (p->string) free(p->string); - if (p->data.TS) - tbl_free(p->data.TS); free(p); } @@ -353,6 +355,40 @@ man_node_delete(struct man *m, struct man_node *p) } +int +man_addspan(struct man *m, const struct tbl_span *sp) +{ + + if ( ! man_span_alloc(m, sp)) + return(0); + return(man_descope(m, 0, 0)); +} + +static int +man_descope(struct man *m, int line, int offs) +{ + /* + * Co-ordinate what happens with having a next-line scope open: + * first close out the element scope (if applicable), then close + * out the block scope (also if applicable). + */ + + if (MAN_ELINE & m->flags) { + m->flags &= ~MAN_ELINE; + if ( ! man_unscope(m, m->last->parent, MANDOCERR_MAX)) + return(0); + } + + if ( ! (MAN_BLINE & m->flags)) + return(1); + m->flags &= ~MAN_BLINE; + + if ( ! man_unscope(m, m->last->parent, MANDOCERR_MAX)) + return(0); + return(man_body_alloc(m, line, offs, m->last->tok)); +} + + static int man_ptext(struct man *m, int line, char *buf, int offs) { @@ -372,7 +408,7 @@ man_ptext(struct man *m, int line, char *buf, int offs) if (MAN_LITERAL & m->flags) { if ( ! man_word_alloc(m, line, offs, buf + offs)) return(0); - goto descope; + return(man_descope(m, line, offs)); } /* Pump blank lines directly into the backend. */ @@ -384,7 +420,7 @@ man_ptext(struct man *m, int line, char *buf, int offs) /* Allocate a blank entry. */ if ( ! man_word_alloc(m, line, offs, "")) return(0); - goto descope; + return(man_descope(m, line, offs)); } /* @@ -421,26 +457,7 @@ man_ptext(struct man *m, int line, char *buf, int offs) if (mandoc_eos(buf, (size_t)i, 0)) m->last->flags |= MAN_EOS; -descope: - /* - * Co-ordinate what happens with having a next-line scope open: - * first close out the element scope (if applicable), then close - * out the block scope (also if applicable). - */ - - if (MAN_ELINE & m->flags) { - m->flags &= ~MAN_ELINE; - if ( ! man_unscope(m, m->last->parent, MANDOCERR_MAX)) - return(0); - } - - if ( ! (MAN_BLINE & m->flags)) - return(1); - m->flags &= ~MAN_BLINE; - - if ( ! man_unscope(m, m->last->parent, MANDOCERR_MAX)) - return(0); - return(man_body_alloc(m, line, offs, m->last->tok)); + return(man_descope(m, line, offs)); } |