=================================================================== RCS file: /cvs/mandoc/roff.c,v retrieving revision 1.234 retrieving revision 1.237 diff -u -p -r1.234 -r1.237 --- mandoc/roff.c 2014/10/20 19:04:45 1.234 +++ mandoc/roff.c 2014/10/28 17:36:19 1.237 @@ -1,4 +1,4 @@ -/* $Id: roff.c,v 1.234 2014/10/20 19:04:45 kristaps Exp $ */ +/* $Id: roff.c,v 1.237 2014/10/28 17:36:19 schwarze Exp $ */ /* * Copyright (c) 2010, 2011, 2012 Kristaps Dzonsons * Copyright (c) 2010-2014 Ingo Schwarze @@ -107,6 +107,7 @@ struct roffreg { struct roff { struct mparse *parse; /* parse point */ + const struct mchars *mchars; /* character table */ struct roffnode *last; /* leaf of stack */ int *rstack; /* stack of inverted `ie' values */ struct roffreg *regtab; /* number registers */ @@ -207,8 +208,6 @@ static const char *roff_getstrn(const struct roff *, static enum rofferr roff_it(ROFF_ARGS); static enum rofferr roff_line_ignore(ROFF_ARGS); static enum rofferr roff_nr(ROFF_ARGS); -static void roff_openeqn(struct roff *, const char *, - int, int, const char *); static enum rofft roff_parse(struct roff *, char *, int *, int, int); static enum rofferr roff_parsetext(char **, size_t *, int, int *); @@ -478,12 +477,13 @@ roff_free(struct roff *r) } struct roff * -roff_alloc(struct mparse *parse, int options) +roff_alloc(struct mparse *parse, const struct mchars *mchars, int options) { struct roff *r; r = mandoc_calloc(1, sizeof(struct roff)); r->parse = parse; + r->mchars = mchars; r->options = options; r->format = options & (MPARSE_MDOC | MPARSE_MAN); r->rstackpos = -1; @@ -510,6 +510,8 @@ roff_res(struct roff *r, char **bufp, size_t *szp, int char *nbuf; /* new buffer to copy bufp to */ 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 */ + 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 */ @@ -553,7 +555,10 @@ roff_res(struct roff *r, char **bufp, size_t *szp, int res = ubuf; break; default: - if (ESCAPE_ERROR == mandoc_escape(&cp, NULL, NULL)) + esc = mandoc_escape(&cp, &stnam, &inaml); + if (esc == ESCAPE_ERROR || + (esc == ESCAPE_SPECIAL && + mchars_spec2cp(r->mchars, stnam, inaml) < 0)) mandoc_vmsg(MANDOCERR_ESC_BAD, r->parse, ln, (int)(stesc - *bufp), "%.*s", (int)(cp - stesc), stesc); @@ -732,7 +737,8 @@ roff_parseln(struct roff *r, int ln, char **bufp, /* Handle in-line equation delimiters. */ - if (r->last_eqn != NULL && r->last_eqn->delim && + if (r->tbl == NULL && + r->last_eqn != NULL && r->last_eqn->delim && (r->eqn == NULL || r->eqn_inline)) { e = roff_eqndelim(r, bufp, szp, pos); if (e == ROFF_REPARSE) @@ -1469,7 +1475,7 @@ roff_getop(const char *v, int *pos, char *res) * or a single signed integer number. */ static int -roff_evalpar(struct roff *r, int ln, +roff_evalpar(struct roff *r, int ln, const char *v, int *pos, int *res) { @@ -1499,7 +1505,7 @@ roff_evalpar(struct roff *r, int ln, * Proceed left to right, there is no concept of precedence. */ static int -roff_evalnum(struct roff *r, int ln, const char *v, +roff_evalnum(struct roff *r, int ln, const char *v, int *pos, int *res, int skipwhite) { int mypos, operand2; @@ -1551,7 +1557,7 @@ roff_evalnum(struct roff *r, int ln, const char *v, break; case '/': if (0 == operand2) { - mandoc_msg(MANDOCERR_DIVZERO, + mandoc_msg(MANDOCERR_DIVZERO, r->parse, ln, *pos, v); *res = 0; break; @@ -1928,15 +1934,13 @@ roff_eqndelim(struct roff *r, char **bufp, size_t *szp return(ROFF_REPARSE); } -static void -roff_openeqn(struct roff *r, const char *name, int line, - int offs, const char *buf) +static enum rofferr +roff_EQ(ROFF_ARGS) { struct eqn_node *e; - int poff; assert(NULL == r->eqn); - e = eqn_alloc(name, offs, line, r->parse); + e = eqn_alloc(ppos, ln, r->parse); if (r->last_eqn) { r->last_eqn->next = e; @@ -1948,17 +1952,10 @@ roff_openeqn(struct roff *r, const char *name, int lin r->eqn = r->last_eqn = e; - if (buf) { - poff = 0; - eqn_read(&r->eqn, line, buf, offs, &poff); - } -} + if ((*bufp)[pos]) + mandoc_vmsg(MANDOCERR_ARG_SKIP, r->parse, ln, pos, + ".EQ %s", *bufp + pos); -static enum rofferr -roff_EQ(ROFF_ARGS) -{ - - roff_openeqn(r, *bufp + pos, ln, ppos, NULL); return(ROFF_IGN); }