From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from localhost (fantadrom.bsd.lv [local]) by fantadrom.bsd.lv (OpenSMTPD) with ESMTPA id 03466675 for ; Sat, 8 Jul 2017 09:51:35 -0500 (EST) Date: Sat, 8 Jul 2017 09:51:35 -0500 (EST) Message-Id: <13728157169238020927.enqueue@fantadrom.bsd.lv> X-Mailinglist: mandoc-source Reply-To: source@mandoc.bsd.lv MIME-Version: 1.0 From: schwarze@mandoc.bsd.lv To: source@mandoc.bsd.lv Subject: mandoc: 1. X-Mailer: activitymail 1.26, http://search.cpan.org/dist/activitymail/ Content-Type: text/plain; charset=utf-8 Log Message: ----------- 1. Eliminate struct eqn, instead use the existing members of struct roff_node which is allocated for each equation anyway. 2. Do not keep a list of equation parsers, one parser is enough. Minus fifty lines of code, no functional change. Modified Files: -------------- mandoc: eqn.c eqn_html.c eqn_term.c html.h libmandoc.h libroff.h mandoc.h mandoc_headers.3 read.c roff.c roff.h roff_int.h term.h tree.c Revision Data ------------- Index: read.c =================================================================== RCS file: /home/cvs/mandoc/mandoc/read.c,v retrieving revision 1.189 retrieving revision 1.190 diff -Lread.c -Lread.c -u -p -r1.189 -r1.190 --- read.c +++ read.c @@ -540,14 +540,11 @@ rerun: * currently open parse. Since we only get here if * there does exist data (see tbl_data.c), we're * guaranteed that something's been allocated. - * Do the same for ROFF_EQN. */ if (rr == ROFF_TBL) while ((span = roff_span(curp->roff)) != NULL) roff_addtbl(curp->man, span); - else if (rr == ROFF_EQN) - roff_addeqn(curp->man, roff_eqn(curp->roff)); else if ((curp->man->macroset == MACROSET_MDOC ? mdoc_parseln(curp->man, curp->line, ln.buf, of) : man_parseln(curp->man, curp->line, ln.buf, of)) == 2) Index: libmandoc.h =================================================================== RCS file: /home/cvs/mandoc/mandoc/libmandoc.h,v retrieving revision 1.68 retrieving revision 1.69 diff -Llibmandoc.h -Llibmandoc.h -u -p -r1.68 -r1.69 --- libmandoc.h +++ libmandoc.h @@ -24,7 +24,6 @@ enum rofferr { ROFF_SO, /* include another file */ ROFF_IGN, /* ignore current line */ ROFF_TBL, /* a table row was successfully parsed */ - ROFF_EQN /* an equation was successfully parsed */ }; struct buf { @@ -35,7 +34,6 @@ struct buf { struct mparse; struct tbl_span; -struct eqn; struct roff; struct roff_man; @@ -77,4 +75,3 @@ int roff_getcontrol(const struct roff int roff_getformat(const struct roff *); const struct tbl_span *roff_span(const struct roff *); -const struct eqn *roff_eqn(const struct roff *); Index: roff.h =================================================================== RCS file: /home/cvs/mandoc/mandoc/roff.h,v retrieving revision 1.57 retrieving revision 1.58 diff -Lroff.h -Lroff.h -u -p -r1.57 -r1.58 --- roff.h +++ roff.h @@ -499,7 +499,7 @@ struct roff_node { union mdoc_data *norm; /* Normalized arguments. */ char *string; /* TEXT */ const struct tbl_span *span; /* TBL */ - const struct eqn *eqn; /* EQN */ + struct eqn_box *eqn; /* EQN */ int line; /* Input file line number. */ int pos; /* Input file column number. */ int flags; Index: libroff.h =================================================================== RCS file: /home/cvs/mandoc/mandoc/libroff.h,v retrieving revision 1.40 retrieving revision 1.41 diff -Llibroff.h -Llibroff.h -u -p -r1.40 -r1.41 --- libroff.h +++ libroff.h @@ -38,9 +38,8 @@ struct tbl_node { }; struct eqn_node { - struct eqn eqn; /* syntax tree of this equation */ struct mparse *parse; /* main parser, for error reporting */ - struct eqn_node *next; /* singly linked list of equations */ + struct roff_node *node; /* syntax tree of this equation */ struct eqn_def *defs; /* array of definitions */ char *data; /* source code of this equation */ char *start; /* first byte of the current token */ @@ -73,8 +72,9 @@ void tbl_data(struct tbl_node *, int, int tbl_cdata(struct tbl_node *, int, const char *, int); const struct tbl_span *tbl_span(struct tbl_node *); int tbl_end(struct tbl_node **); -struct eqn_node *eqn_alloc(int, int, struct mparse *); -enum rofferr eqn_end(struct eqn_node **); +struct eqn_node *eqn_alloc(struct mparse *); +void eqn_box_free(struct eqn_box *); void eqn_free(struct eqn_node *); -enum rofferr eqn_read(struct eqn_node **, int, - const char *, int, int *); +void eqn_parse(struct eqn_node *); +void eqn_read(struct eqn_node *, const char *); +void eqn_reset(struct eqn_node *); Index: eqn.c =================================================================== RCS file: /home/cvs/mandoc/mandoc/eqn.c,v retrieving revision 1.75 retrieving revision 1.76 diff -Leqn.c -Leqn.c -u -p -r1.75 -r1.76 --- eqn.c +++ eqn.c @@ -27,8 +27,9 @@ #include #include -#include "mandoc.h" #include "mandoc_aux.h" +#include "mandoc.h" +#include "roff.h" #include "libmandoc.h" #include "libroff.h" @@ -284,76 +285,48 @@ enum parse_mode { }; static struct eqn_box *eqn_box_alloc(struct eqn_node *, struct eqn_box *); -static void eqn_box_free(struct eqn_box *); static struct eqn_box *eqn_box_makebinary(struct eqn_node *, struct eqn_box *); static void eqn_def(struct eqn_node *); static struct eqn_def *eqn_def_find(struct eqn_node *); static void eqn_delim(struct eqn_node *); static enum eqn_tok eqn_next(struct eqn_node *, enum parse_mode); -static enum rofferr eqn_parse(struct eqn_node *, struct eqn_box *); static void eqn_undef(struct eqn_node *); -enum rofferr -eqn_read(struct eqn_node **epp, int ln, - const char *p, int pos, int *offs) +struct eqn_node * +eqn_alloc(struct mparse *parse) { - size_t sz; - struct eqn_node *ep; - enum rofferr er; - - ep = *epp; - - /* - * If we're the terminating mark, unset our equation status and - * validate the full equation. - */ + struct eqn_node *ep; - if (0 == strncmp(p, ".EN", 3)) { - er = eqn_end(epp); - p += 3; - while (' ' == *p || '\t' == *p) - p++; - if ('\0' == *p) - return er; - mandoc_vmsg(MANDOCERR_ARG_SKIP, ep->parse, - ln, pos, "EN %s", p); - return er; - } - - /* - * Build up the full string, replacing all newlines with regular - * whitespace. - */ - - sz = strlen(p + pos) + 1; - ep->data = mandoc_realloc(ep->data, ep->sz + sz + 1); - - /* First invocation: nil terminate the string. */ - - if (0 == ep->sz) - *ep->data = '\0'; - - ep->sz += sz; - strlcat(ep->data, p + pos, ep->sz + 1); - strlcat(ep->data, " ", ep->sz + 1); - return ROFF_IGN; + ep = mandoc_calloc(1, sizeof(*ep)); + ep->parse = parse; + ep->gsize = EQN_DEFSIZE; + return ep; } -struct eqn_node * -eqn_alloc(int pos, int line, struct mparse *parse) +void +eqn_reset(struct eqn_node *ep) { - struct eqn_node *p; - - p = mandoc_calloc(1, sizeof(struct eqn_node)); + free(ep->data); + ep->data = ep->start = ep->end = NULL; + ep->sz = ep->toksz = 0; +} - p->parse = parse; - p->eqn.ln = line; - p->eqn.pos = pos; - p->gsize = EQN_DEFSIZE; +void +eqn_read(struct eqn_node *ep, const char *p) +{ + char *cp; - return p; + if (ep->data == NULL) { + ep->sz = strlen(p); + ep->data = mandoc_strdup(p); + } else { + ep->sz = mandoc_asprintf(&cp, "%s %s", ep->data, p); + free(ep->data); + ep->data = cp; + } + ep->sz += 1; } /* @@ -427,7 +400,7 @@ eqn_next(struct eqn_node *ep, enum parse ep->start++; /* Skip opening quote. */ if (ep->end == NULL) { mandoc_msg(MANDOCERR_ARG_QUOTE, ep->parse, - ep->eqn.ln, ep->eqn.pos, NULL); + ep->node->line, ep->node->pos, NULL); ep->end = strchr(ep->start, '\0'); } } else { @@ -448,7 +421,7 @@ eqn_next(struct eqn_node *ep, enum parse break; if (++lim > EQN_NEST_MAX) { mandoc_msg(MANDOCERR_ROFFLOOP, ep->parse, - ep->eqn.ln, ep->eqn.pos, NULL); + ep->node->line, ep->node->pos, NULL); return EQN_TOK_EOF; } @@ -492,7 +465,7 @@ eqn_next(struct eqn_node *ep, enum parse return EQN_TOK__MAX; } -static void +void eqn_box_free(struct eqn_box *bp) { @@ -570,7 +543,7 @@ eqn_delim(struct eqn_node *ep) { if (ep->end[0] == '\0' || ep->end[1] == '\0') { mandoc_msg(MANDOCERR_REQ_EMPTY, ep->parse, - ep->eqn.ln, ep->eqn.pos, "delim"); + ep->node->line, ep->node->pos, "delim"); if (ep->end[0] != '\0') ep->end++; } else if (strncmp(ep->end, "off", 3) == 0) { @@ -597,7 +570,7 @@ eqn_undef(struct eqn_node *ep) if (eqn_next(ep, MODE_NOSUB) == EQN_TOK_EOF) { mandoc_msg(MANDOCERR_REQ_EMPTY, ep->parse, - ep->eqn.ln, ep->eqn.pos, "undef"); + ep->node->line, ep->node->pos, "undef"); return; } if ((def = eqn_def_find(ep)) == NULL) @@ -616,7 +589,7 @@ eqn_def(struct eqn_node *ep) if (eqn_next(ep, MODE_NOSUB) == EQN_TOK_EOF) { mandoc_msg(MANDOCERR_REQ_EMPTY, ep->parse, - ep->eqn.ln, ep->eqn.pos, "define"); + ep->node->line, ep->node->pos, "define"); return; } @@ -645,7 +618,7 @@ eqn_def(struct eqn_node *ep) if (eqn_next(ep, MODE_QUOTED) == EQN_TOK_EOF) { mandoc_vmsg(MANDOCERR_REQ_EMPTY, ep->parse, - ep->eqn.ln, ep->eqn.pos, "define %s", def->key); + ep->node->line, ep->node->pos, "define %s", def->key); free(def->key); free(def->val); def->key = def->val = NULL; @@ -657,19 +630,17 @@ eqn_def(struct eqn_node *ep) def->valsz = ep->toksz; } -/* - * Recursively parse an eqn(7) expression. - */ -static enum rofferr -eqn_parse(struct eqn_node *ep, struct eqn_box *parent) +void +eqn_parse(struct eqn_node *ep) { - struct eqn_box *cur, *nbox, *split; + struct eqn_box *cur, *nbox, *parent, *split; const char *cp, *cpn; char *p; enum eqn_tok tok; enum { CCL_LET, CCL_DIG, CCL_PUN } ccl, ccln; int size; + parent = ep->node->eqn; assert(parent != NULL); /* @@ -678,7 +649,7 @@ eqn_parse(struct eqn_node *ep, struct eq */ if (ep->data == NULL) - return ROFF_IGN; + return; ep->start = ep->end = ep->data + strspn(ep->data, " ^~"); @@ -696,7 +667,7 @@ next_tok: if (eqn_next(ep, MODE_NOSUB) == EQN_TOK_EOF || eqn_next(ep, MODE_QUOTED) == EQN_TOK_EOF) mandoc_msg(MANDOCERR_REQ_EMPTY, ep->parse, - ep->eqn.ln, ep->eqn.pos, "tdefine"); + ep->node->line, ep->node->pos, "tdefine"); break; case EQN_TOK_DELIM: eqn_delim(ep); @@ -704,7 +675,7 @@ next_tok: case EQN_TOK_GFONT: if (eqn_next(ep, MODE_SUB) == EQN_TOK_EOF) mandoc_msg(MANDOCERR_REQ_EMPTY, ep->parse, - ep->eqn.ln, ep->eqn.pos, eqn_toks[tok]); + ep->node->line, ep->node->pos, eqn_toks[tok]); break; case EQN_TOK_MARK: case EQN_TOK_LINEUP: @@ -720,7 +691,7 @@ next_tok: case EQN_TOK_DOTDOT: if (parent->last == NULL) { mandoc_msg(MANDOCERR_EQN_NOBOX, ep->parse, - ep->eqn.ln, ep->eqn.pos, eqn_toks[tok]); + ep->node->line, ep->node->pos, eqn_toks[tok]); cur = eqn_box_alloc(ep, parent); cur->type = EQN_TEXT; cur->text = mandoc_strdup(""); @@ -765,7 +736,7 @@ next_tok: case EQN_TOK_UP: if (eqn_next(ep, MODE_SUB) == EQN_TOK_EOF) mandoc_msg(MANDOCERR_REQ_EMPTY, ep->parse, - ep->eqn.ln, ep->eqn.pos, eqn_toks[tok]); + ep->node->line, ep->node->pos, eqn_toks[tok]); break; case EQN_TOK_FAT: case EQN_TOK_ROMAN: @@ -803,13 +774,13 @@ next_tok: /* Accept two values: integral size and a single. */ if (eqn_next(ep, MODE_SUB) == EQN_TOK_EOF) { mandoc_msg(MANDOCERR_REQ_EMPTY, ep->parse, - ep->eqn.ln, ep->eqn.pos, eqn_toks[tok]); + ep->node->line, ep->node->pos, eqn_toks[tok]); break; } size = mandoc_strntoi(ep->start, ep->toksz, 10); if (-1 == size) { mandoc_msg(MANDOCERR_IT_NONUM, ep->parse, - ep->eqn.ln, ep->eqn.pos, eqn_toks[tok]); + ep->node->line, ep->node->pos, eqn_toks[tok]); break; } if (EQN_TOK_GSIZE == tok) { @@ -834,7 +805,7 @@ next_tok: */ if (parent->last == NULL) { mandoc_msg(MANDOCERR_EQN_NOBOX, ep->parse, - ep->eqn.ln, ep->eqn.pos, eqn_toks[tok]); + ep->node->line, ep->node->pos, eqn_toks[tok]); cur = eqn_box_alloc(ep, parent); cur->type = EQN_TEXT; cur->text = mandoc_strdup(""); @@ -901,7 +872,7 @@ next_tok: */ if (parent->last == NULL) { mandoc_msg(MANDOCERR_EQN_NOBOX, ep->parse, - ep->eqn.ln, ep->eqn.pos, eqn_toks[tok]); + ep->node->line, ep->node->pos, eqn_toks[tok]); cur = eqn_box_alloc(ep, parent); cur->type = EQN_TEXT; cur->text = mandoc_strdup(""); @@ -928,15 +899,15 @@ next_tok: break; if (cur == NULL) { mandoc_msg(MANDOCERR_BLK_NOTOPEN, ep->parse, - ep->eqn.ln, ep->eqn.pos, eqn_toks[tok]); + ep->node->line, ep->node->pos, eqn_toks[tok]); break; } parent = cur; if (EQN_TOK_RIGHT == tok) { if (eqn_next(ep, MODE_SUB) == EQN_TOK_EOF) { mandoc_msg(MANDOCERR_REQ_EMPTY, - ep->parse, ep->eqn.ln, - ep->eqn.pos, eqn_toks[tok]); + ep->parse, ep->node->line, + ep->node->pos, eqn_toks[tok]); break; } /* Handling depends on right/left. */ @@ -971,7 +942,7 @@ next_tok: if (EQN_TOK_LEFT == tok && eqn_next(ep, MODE_SUB) == EQN_TOK_EOF) { mandoc_msg(MANDOCERR_REQ_EMPTY, ep->parse, - ep->eqn.ln, ep->eqn.pos, eqn_toks[tok]); + ep->node->line, ep->node->pos, eqn_toks[tok]); break; } parent = eqn_box_alloc(ep, parent); @@ -1005,7 +976,7 @@ next_tok: break; if (cur == NULL) { mandoc_msg(MANDOCERR_IT_STRAY, ep->parse, - ep->eqn.ln, ep->eqn.pos, eqn_toks[tok]); + ep->node->line, ep->node->pos, eqn_toks[tok]); break; } parent = eqn_box_alloc(ep, cur); @@ -1019,11 +990,7 @@ next_tok: parent->expectargs = 1; break; case EQN_TOK_EOF: - /* - * End of file! - * TODO: make sure we're not in an open subexpression. - */ - return ROFF_EQN; + return; case EQN_TOK__MAX: case EQN_TOK_FUNC: case EQN_TOK_QUOTED: @@ -1120,25 +1087,10 @@ next_tok: goto next_tok; } -enum rofferr -eqn_end(struct eqn_node **epp) -{ - struct eqn_node *ep; - - ep = *epp; - *epp = NULL; - - ep->eqn.root = mandoc_calloc(1, sizeof(struct eqn_box)); - ep->eqn.root->expectargs = UINT_MAX; - return eqn_parse(ep, ep->eqn.root); -} - void eqn_free(struct eqn_node *p) { int i; - - eqn_box_free(p->eqn.root); for (i = 0; i < (int)p->defsz; i++) { free(p->defs[i].key); Index: eqn_term.c =================================================================== RCS file: /home/cvs/mandoc/mandoc/eqn_term.c,v retrieving revision 1.12 retrieving revision 1.13 diff -Leqn_term.c -Leqn_term.c -u -p -r1.12 -r1.13 --- eqn_term.c +++ eqn_term.c @@ -40,10 +40,10 @@ static void eqn_box(struct termp *, cons void -term_eqn(struct termp *p, const struct eqn *ep) +term_eqn(struct termp *p, const struct eqn_box *bp) { - eqn_box(p, ep->root); + eqn_box(p, bp); p->flags &= ~TERMP_NOSPACE; } Index: tree.c =================================================================== RCS file: /home/cvs/mandoc/mandoc/tree.c,v retrieving revision 1.76 retrieving revision 1.77 diff -Ltree.c -Ltree.c -u -p -r1.76 -r1.77 --- tree.c +++ tree.c @@ -202,7 +202,7 @@ print_mdoc(const struct roff_node *n, in } if (n->eqn) - print_box(n->eqn->root->first, indent + 4); + print_box(n->eqn->first, indent + 4); if (n->child) print_mdoc(n->child, indent + (n->type == ROFFT_BLOCK ? 2 : 4)); @@ -287,7 +287,7 @@ print_man(const struct roff_node *n, int } if (n->eqn) - print_box(n->eqn->root->first, indent + 4); + print_box(n->eqn->first, indent + 4); if (n->child) print_man(n->child, indent + (n->type == ROFFT_BLOCK ? 2 : 4)); Index: mandoc.h =================================================================== RCS file: /home/cvs/mandoc/mandoc/mandoc.h,v retrieving revision 1.244 retrieving revision 1.245 diff -Lmandoc.h -Lmandoc.h -u -p -r1.244 -r1.245 --- mandoc.h +++ mandoc.h @@ -402,17 +402,6 @@ struct eqn_box { }; /* - * An equation consists of a tree of expressions starting at a given - * line and position. - */ -struct eqn { - char *name; /* identifier (or NULL) */ - struct eqn_box *root; /* root mathematical expression */ - int ln; /* invocation line */ - int pos; /* invocation position */ -}; - -/* * Parse options. */ #define MPARSE_MDOC 1 /* assume -mdoc */ Index: roff_int.h =================================================================== RCS file: /home/cvs/mandoc/mandoc/roff_int.h,v retrieving revision 1.7 retrieving revision 1.8 diff -Lroff_int.h -Lroff_int.h -u -p -r1.7 -r1.8 --- roff_int.h +++ roff_int.h @@ -25,7 +25,6 @@ void roff_elem_alloc(struct roff_man struct roff_node *roff_block_alloc(struct roff_man *, int, int, int); struct roff_node *roff_head_alloc(struct roff_man *, int, int, int); struct roff_node *roff_body_alloc(struct roff_man *, int, int, int); -void roff_addeqn(struct roff_man *, const struct eqn *); void roff_addtbl(struct roff_man *, const struct tbl_span *); void roff_node_unlink(struct roff_man *, struct roff_node *); void roff_node_free(struct roff_node *); Index: term.h =================================================================== RCS file: /home/cvs/mandoc/mandoc/term.h,v retrieving revision 1.129 retrieving revision 1.130 diff -Lterm.h -Lterm.h -u -p -r1.129 -r1.130 --- term.h +++ term.h @@ -36,7 +36,7 @@ enum termfont { TERMFONT__MAX }; -struct eqn; +struct eqn_box; struct roff_meta; struct roff_node; struct tbl_span; @@ -126,7 +126,7 @@ const char *ascii_uc2str(int); void roff_term_pre(struct termp *, const struct roff_node *); -void term_eqn(struct termp *, const struct eqn *); +void term_eqn(struct termp *, const struct eqn_box *); void term_tbl(struct termp *, const struct tbl_span *); void term_free(struct termp *); void term_setcol(struct termp *, size_t); Index: html.h =================================================================== RCS file: /home/cvs/mandoc/mandoc/html.h,v retrieving revision 1.86 retrieving revision 1.87 diff -Lhtml.h -Lhtml.h -u -p -r1.86 -r1.87 --- html.h +++ html.h @@ -115,7 +115,7 @@ struct html { struct roff_node; struct tbl_span; -struct eqn; +struct eqn_box; void roff_html_pre(struct html *, const struct roff_node *); @@ -127,7 +127,7 @@ void print_stagq(struct html *, const void print_text(struct html *, const char *); void print_tblclose(struct html *); void print_tbl(struct html *, const struct tbl_span *); -void print_eqn(struct html *, const struct eqn *); +void print_eqn(struct html *, const struct eqn_box *); void print_paragraph(struct html *); void print_endline(struct html *); Index: eqn_html.c =================================================================== RCS file: /home/cvs/mandoc/mandoc/eqn_html.c,v retrieving revision 1.15 retrieving revision 1.16 diff -Leqn_html.c -Leqn_html.c -u -p -r1.15 -r1.16 --- eqn_html.c +++ eqn_html.c @@ -227,14 +227,14 @@ out: } void -print_eqn(struct html *p, const struct eqn *ep) +print_eqn(struct html *p, const struct eqn_box *bp) { struct tag *t; t = print_otag(p, TAG_MATH, "c", "eqn"); p->flags |= HTML_NONOSPACE; - eqn_box(p, ep->root); + eqn_box(p, bp); p->flags &= ~HTML_NONOSPACE; print_tagq(p, t); Index: mandoc_headers.3 =================================================================== RCS file: /home/cvs/mandoc/mandoc/mandoc_headers.3,v retrieving revision 1.16 retrieving revision 1.17 diff -Lmandoc_headers.3 -Lmandoc_headers.3 -u -p -r1.16 -r1.17 --- mandoc_headers.3 +++ mandoc_headers.3 @@ -101,7 +101,6 @@ Provides .Vt struct tbl_dat , .Vt struct tbl_span , .Vt struct eqn_box , -.Vt struct eqn , the function prototype typedef .Fn mandocmsg , the function @@ -267,8 +266,6 @@ from for function prototypes. Uses the types .Vt struct tbl_span -and -.Vt struct eqn from .Pa mandoc.h and @@ -292,8 +289,6 @@ because the latter two are needed by .Qq Pa roff.c . .Pp Uses the types -.Vt struct eqn -and .Vt struct tbl_span from .Pa mandoc.h , @@ -378,7 +373,7 @@ for for .Vt struct tbl_* and -.Vt struct eqn , +.Vt struct eqn_box , and .Qq Pa libmandoc.h for @@ -462,7 +457,7 @@ from Uses .Vt struct tbl_span and -.Vt struct eqn +.Vt struct eqn_box from .Pa mandoc.h and @@ -503,7 +498,7 @@ and many HTML formatting functions. Uses .Vt struct tbl_span and -.Vt struct eqn +.Vt struct eqn_box from .Pa mandoc.h and Index: roff.c =================================================================== RCS file: /home/cvs/mandoc/mandoc/roff.c,v retrieving revision 1.318 retrieving revision 1.319 diff -Lroff.c -Lroff.c -u -p -r1.318 -r1.319 --- roff.c +++ roff.c @@ -98,9 +98,8 @@ struct roff { struct tbl_node *first_tbl; /* first table parsed */ struct tbl_node *last_tbl; /* last table parsed */ struct tbl_node *tbl; /* current table being parsed */ - struct eqn_node *last_eqn; /* last equation parsed */ - struct eqn_node *first_eqn; /* first equation parsed */ - struct eqn_node *eqn; /* current equation being parsed */ + struct eqn_node *last_eqn; /* equation parser */ + struct eqn_node *eqn; /* active equation parser */ int eqn_inline; /* current equation is inline */ int options; /* parse options */ int rstacksz; /* current size limit of rstack */ @@ -695,7 +694,6 @@ static void roff_free1(struct roff *r) { struct tbl_node *tbl; - struct eqn_node *e; int i; while (NULL != (tbl = r->first_tbl)) { @@ -704,11 +702,9 @@ roff_free1(struct roff *r) } r->first_tbl = r->last_tbl = r->tbl = NULL; - while (NULL != (e = r->first_eqn)) { - r->first_eqn = e->next; - eqn_free(e); - } - r->first_eqn = r->last_eqn = r->eqn = NULL; + if (r->last_eqn != NULL) + eqn_free(r->last_eqn); + r->last_eqn = r->eqn = NULL; while (r->last) roffnode_pop(r); @@ -984,19 +980,6 @@ roff_body_alloc(struct roff_man *man, in } void -roff_addeqn(struct roff_man *man, const struct eqn *eqn) -{ - struct roff_node *n; - - n = roff_node_alloc(man, eqn->ln, eqn->pos, ROFFT_EQN, TOKEN_NONE); - n->eqn = eqn; - if (eqn->ln > man->last->line) - n->flags |= NODE_LINE; - roff_node_append(man, n); - man->next = ROFF_NEXT_SIBLING; -} - -void roff_addtbl(struct roff_man *man, const struct tbl_span *tbl) { struct roff_node *n; @@ -1055,6 +1038,8 @@ roff_node_free(struct roff_node *n) mdoc_argv_free(n->args); if (n->type == ROFFT_BLOCK || n->type == ROFFT_ELEM) free(n->norm); + if (n->eqn != NULL) + eqn_box_free(n->eqn); free(n->string); free(n); } @@ -1512,8 +1497,10 @@ roff_parseln(struct roff *r, int ln, str return e; assert(e == ROFF_CONT); } - if (r->eqn != NULL) - return eqn_read(&r->eqn, ln, buf->buf, ppos, offs); + if (r->eqn != NULL && strncmp(buf->buf + ppos, ".EN", 3)) { + 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 ( ! ctl) @@ -1593,8 +1580,9 @@ roff_endparse(struct roff *r) if (r->eqn) { mandoc_msg(MANDOCERR_BLK_NOEND, r->parse, - r->eqn->eqn.ln, r->eqn->eqn.pos, "EQ"); - eqn_end(&r->eqn); + r->eqn->node->line, r->eqn->node->pos, "EQ"); + eqn_parse(r->eqn); + r->eqn = NULL; } if (r->tbl) { @@ -2877,20 +2865,23 @@ roff_eqndelim(struct roff *r, struct buf static enum rofferr roff_EQ(ROFF_ARGS) { - struct eqn_node *e; - - assert(r->eqn == NULL); - e = eqn_alloc(ppos, ln, r->parse); + struct roff_node *n; - if (r->last_eqn) { - r->last_eqn->next = e; - e->delim = r->last_eqn->delim; - e->odelim = r->last_eqn->odelim; - e->cdelim = r->last_eqn->cdelim; - } else - r->first_eqn = r->last_eqn = e; + n = roff_node_alloc(r->man, ln, ppos, ROFFT_EQN, TOKEN_NONE); + if (ln > r->man->last->line) + n->flags |= NODE_LINE; + n->eqn = mandoc_calloc(1, sizeof(*n->eqn)); + n->eqn->expectargs = UINT_MAX; + roff_node_append(r->man, n); + r->man->next = ROFF_NEXT_SIBLING; - r->eqn = r->last_eqn = e; + assert(r->eqn == NULL); + if (r->last_eqn == NULL) + r->last_eqn = eqn_alloc(r->parse); + else + eqn_reset(r->last_eqn); + r->eqn = r->last_eqn; + r->eqn->node = n; if (buf->buf[pos] != '\0') mandoc_vmsg(MANDOCERR_ARG_SKIP, r->parse, ln, pos, @@ -2902,8 +2893,14 @@ roff_EQ(ROFF_ARGS) static enum rofferr roff_EN(ROFF_ARGS) { - - mandoc_msg(MANDOCERR_BLK_NOTOPEN, r->parse, ln, ppos, "EN"); + if (r->eqn != NULL) { + eqn_parse(r->eqn); + r->eqn = NULL; + } else + mandoc_msg(MANDOCERR_BLK_NOTOPEN, r->parse, ln, ppos, "EN"); + if (buf->buf[pos] != '\0') + mandoc_vmsg(MANDOCERR_ARG_SKIP, r->parse, ln, pos, + "EN %s", buf->buf + pos); return ROFF_IGN; } @@ -3608,13 +3605,6 @@ roff_span(const struct roff *r) { return r->tbl ? tbl_span(r->tbl) : NULL; -} - -const struct eqn * -roff_eqn(const struct roff *r) -{ - - return r->last_eqn ? &r->last_eqn->eqn : NULL; } /* -- To unsubscribe send an email to source+unsubscribe@mandoc.bsd.lv