=================================================================== RCS file: /cvs/mandoc/eqn.c,v retrieving revision 1.42 retrieving revision 1.46 diff -u -p -r1.42 -r1.46 --- mandoc/eqn.c 2014/04/23 21:06:41 1.42 +++ mandoc/eqn.c 2014/09/28 11:32:08 1.46 @@ -1,4 +1,4 @@ -/* $Id: eqn.c,v 1.42 2014/04/23 21:06:41 schwarze Exp $ */ +/* $Id: eqn.c,v 1.46 2014/09/28 11:32:08 kristaps Exp $ */ /* * Copyright (c) 2011 Kristaps Dzonsons * @@ -14,10 +14,10 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif +#include + #include #include #include @@ -198,6 +198,7 @@ static const struct eqnstr eqnposs[EQNPOS__MAX] = { { "", 0 }, /* EQNPOS_NONE */ { "over", 4 }, /* EQNPOS_OVER */ { "sup", 3 }, /* EQNPOS_SUP */ + { NULL, 0 }, /* EQNPOS_SUPSUB */ { "sub", 3 }, /* EQNPOS_SUB */ { "to", 2 }, /* EQNPOS_TO */ { "from", 4 }, /* EQNPOS_FROM */ @@ -300,7 +301,8 @@ eqn_read(struct eqn_node **epp, int ln, p++; if ('\0' == *p) return(er); - mandoc_msg(MANDOCERR_ARGSLOST, ep->parse, ln, pos, NULL); + mandoc_vmsg(MANDOCERR_ARG_SKIP, ep->parse, + ln, pos, "EN %s", p); return(er); } @@ -568,14 +570,30 @@ eqn_box(struct eqn_node *ep, struct eqn_box *last) return(EQN_OK); } + /* + * Positional elements (e.g., over, sub, sup, ...). + */ for (i = 0; i < (int)EQNPOS__MAX; i++) { - if ( ! EQNSTREQ(&eqnposs[i], start, sz)) + /* Some elements don't have names (are virtual). */ + if (NULL == eqnposs[i].name) continue; + else if ( ! EQNSTREQ(&eqnposs[i], start, sz)) + continue; if (NULL == last->last) { EQN_MSG(MANDOCERR_EQNSYNT, ep); return(EQN_ERR); } - last->last->pos = (enum eqn_post)i; + /* + * If we encounter x sub y sup z, then according to the + * eqn manual, we regard this as x subsup y z. + */ + if (EQNPOS_SUP == i && + NULL != last->last->prev && + EQNPOS_SUB == last->last->prev->pos) + last->last->prev->pos = EQNPOS_SUBSUP; + else + last->last->pos = (enum eqn_post)i; + if (EQN_EOF == (c = eqn_box(ep, last))) { EQN_MSG(MANDOCERR_EQNEOF, ep); return(EQN_ERR); @@ -664,10 +682,11 @@ eqn_box_alloc(struct eqn_node *ep, struct eqn_box *par bp->parent = parent; bp->size = ep->gsize; - if (NULL == parent->first) - parent->first = bp; - else + if (NULL != parent->first) { parent->last->next = bp; + bp->prev = parent->last; + } else + parent->first = bp; parent->last = bp; return(bp); @@ -767,7 +786,7 @@ again: ep->cur++; } else { if (q) - EQN_MSG(MANDOCERR_BADQUOTE, ep); + EQN_MSG(MANDOCERR_ARG_QUOTE, ep); next = strchr(start, '\0'); *sz = (size_t)(next - start); ep->cur += *sz;