=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/man.c,v retrieving revision 1.51 retrieving revision 1.52 diff -u -r1.51 -r1.52 --- src/usr.bin/mandoc/man.c 2011/01/01 17:38:11 1.51 +++ src/usr.bin/mandoc/man.c 2011/01/04 22:28:17 1.52 @@ -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 + * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * * 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 @@ "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 @@ 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_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 @@ 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->last = p; switch (p->type) { + case (MAN_TBL): + /* FALLTHROUGH */ case (MAN_TEXT): if ( ! man_valid_post(man)) return(0); @@ -301,7 +290,22 @@ 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 @@ if (p->string) free(p->string); - if (p->data.TS) - tbl_free(p->data.TS); free(p); } @@ -353,7 +355,41 @@ } +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) { int i; @@ -372,7 +408,7 @@ 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 @@ /* 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 @@ 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)); }