From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from krisdoz.my.domain (kristaps@localhost [127.0.0.1]) by krisdoz.my.domain (8.14.3/8.14.3) with ESMTP id p2KG260D009765 for ; Sun, 20 Mar 2011 12:02:06 -0400 (EDT) Received: (from kristaps@localhost) by krisdoz.my.domain (8.14.3/8.14.3/Submit) id p2KG26Gx019173; Sun, 20 Mar 2011 12:02:06 -0400 (EDT) Date: Sun, 20 Mar 2011 12:02:06 -0400 (EDT) Message-Id: <201103201602.p2KG26Gx019173@krisdoz.my.domain> X-Mailinglist: mdocml-source Reply-To: source@mdocml.bsd.lv MIME-Version: 1.0 From: kristaps@mdocml.bsd.lv To: source@mdocml.bsd.lv Subject: mdocml: Consolidate messages. X-Mailer: activitymail 1.26, http://search.cpan.org/dist/activitymail/ Content-Type: text/plain; charset=utf-8 Log Message: ----------- Consolidate messages. Have all parse-time messages (in libmdoc, libroff, etc., etc.) route into mandoc_msg() and mandoc_vmsg(), for the time being in libmandoc.h. This requires struct mparse to be passed into the allocation routines instead of mandocmsg and a void pointer. Then, move some of the functionality of the old mmsg() into read.c's mparse_mmsg() (check against wlevel and setting of file_status) and use main.c's mmsg() as simply a printing tool. Modified Files: -------------- mdocml: libman.h libmandoc.h libmdoc.h libroff.h main.c man.c man.h man_argv.c man_macro.c man_validate.c mandoc.c mandoc.h mdoc.c mdoc.h mdoc_macro.c mdoc_validate.c read.c roff.c roff.h tbl.c tbl_data.c tbl_layout.c tbl_opts.c Revision Data ------------- Index: tbl.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/tbl.c,v retrieving revision 1.22 retrieving revision 1.23 diff -Ltbl.c -Ltbl.c -u -p -r1.22 -r1.23 --- tbl.c +++ tbl.c @@ -67,15 +67,14 @@ tbl_read(struct tbl_node *tbl, int ln, c } struct tbl_node * -tbl_alloc(int pos, int line, void *data, const mandocmsg msg) +tbl_alloc(int pos, int line, struct mparse *parse) { struct tbl_node *p; p = mandoc_calloc(1, sizeof(struct tbl_node)); p->line = line; p->pos = pos; - p->data = data; - p->msg = msg; + p->parse = parse; p->part = TBL_PART_OPTS; p->opts.tab = '\t'; p->opts.linesize = 12; @@ -126,14 +125,16 @@ void tbl_restart(int line, int pos, struct tbl_node *tbl) { if (TBL_PART_CDATA == tbl->part) - TBL_MSG(tbl, MANDOCERR_TBLBLOCK, tbl->line, tbl->pos); + mandoc_msg(MANDOCERR_TBLBLOCK, tbl->parse, + tbl->line, tbl->pos, NULL); tbl->part = TBL_PART_LAYOUT; tbl->line = line; tbl->pos = pos; if (NULL == tbl->first_span || NULL == tbl->first_span->first) - TBL_MSG(tbl, MANDOCERR_TBLNODATA, tbl->line, tbl->pos); + mandoc_msg(MANDOCERR_TBLNODATA, tbl->parse, + tbl->line, tbl->pos, NULL); } const struct tbl_span * @@ -154,12 +155,14 @@ tbl_end(struct tbl_node *tbl) { if (NULL == tbl->first_span || NULL == tbl->first_span->first) - TBL_MSG(tbl, MANDOCERR_TBLNODATA, tbl->line, tbl->pos); + mandoc_msg(MANDOCERR_TBLNODATA, tbl->parse, + tbl->line, tbl->pos, NULL); if (tbl->last_span) tbl->last_span->flags |= TBL_SPAN_LAST; if (TBL_PART_CDATA == tbl->part) - TBL_MSG(tbl, MANDOCERR_TBLBLOCK, tbl->line, tbl->pos); + mandoc_msg(MANDOCERR_TBLBLOCK, tbl->parse, + tbl->line, tbl->pos, NULL); } Index: mandoc.h =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mandoc.h,v retrieving revision 1.62 retrieving revision 1.63 diff -Lmandoc.h -Lmandoc.h -u -p -r1.62 -r1.63 --- mandoc.h +++ mandoc.h @@ -339,8 +339,8 @@ enum mparset { MPARSE_MAN /* assume -man */ }; -typedef void (*mandocmsg)(enum mandocerr, void *, - int, int, const char *); +typedef void (*mandocmsg)(enum mandocerr, enum mandoclevel, + const char *, int, int, const char *); typedef int (*mevt_open)(void *, const char *); typedef void (*mevt_close)(void *, const char *); @@ -353,8 +353,8 @@ __BEGIN_DECLS void mparse_free(struct mparse *); void mparse_reset(struct mparse *); struct mparse *mparse_alloc(enum mparset, mevt_open, - mevt_close, mandocmsg, void *); -void mparse_setstatus(struct mparse *, enum mandoclevel); + mevt_close, + enum mandoclevel, mandocmsg, void *); enum mandoclevel mparse_readfd(struct mparse *, int, const char *); void mparse_result(struct mparse *, struct mdoc **, struct man **); Index: libman.h =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/libman.h,v retrieving revision 1.46 retrieving revision 1.47 diff -Llibman.h -Llibman.h -u -p -r1.46 -r1.47 --- libman.h +++ libman.h @@ -25,8 +25,7 @@ enum man_next { }; struct man { - void *data; /* private application data */ - mandocmsg msg; /* output message handler */ + struct mparse *parse; /* parse pointer */ int flags; /* parse flags */ #define MAN_HALT (1 << 0) /* badness happened: die */ #define MAN_ELINE (1 << 1) /* Next-line element scope. */ @@ -64,9 +63,9 @@ extern const struct man_macro *const man __BEGIN_DECLS #define man_pmsg(m, l, p, t) \ - (*(m)->msg)((t), (m)->data, (l), (p), NULL) + mandoc_msg((t), (m)->parse, (l), (p), NULL) #define man_nmsg(m, n, t) \ - (*(m)->msg)((t), (m)->data, (n)->line, (n)->pos, NULL) + mandoc_msg((t), (m)->parse, (n)->line, (n)->pos, NULL) int man_word_alloc(struct man *, int, int, const char *); int man_block_alloc(struct man *, int, int, enum mant); int man_head_alloc(struct man *, int, int, enum mant); @@ -81,8 +80,6 @@ int man_args(struct man *, int, int * #define ARGS_EOLN (0) #define ARGS_WORD (1) #define ARGS_QWORD (1) -void man_vmsg(struct man *, enum mandocerr, - int, int, const char *, ...); int man_valid_post(struct man *); int man_valid_pre(struct man *, struct man_node *); int man_unscope(struct man *, Index: main.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/main.c,v retrieving revision 1.154 retrieving revision 1.155 diff -Lmain.c -Lmain.c -u -p -r1.154 -r1.155 --- main.c +++ main.c @@ -75,16 +75,6 @@ static const char * const mandoclevels[M "SYSERR" }; -static const enum mandocerr mandoclimits[MANDOCLEVEL_MAX] = { - MANDOCERR_OK, - MANDOCERR_WARNING, - MANDOCERR_WARNING, - MANDOCERR_ERROR, - MANDOCERR_FATAL, - MANDOCERR_MAX, - MANDOCERR_MAX -}; - static const char * const mandocerrs[MANDOCERR_MAX] = { "ok", @@ -195,8 +185,8 @@ static const char * const mandocerrs[MAN static void evt_close(void *, const char *); static int evt_open(void *, const char *); static int moptions(enum mparset *, char *); -static void mmsg(enum mandocerr, void *, - int, int, const char *); +static void mmsg(enum mandocerr, enum mandoclevel, + const char *, int, int, const char *); static void parse(struct curparse *, int, const char *, enum mandoclevel *); static int toptions(struct curparse *, char *); @@ -253,7 +243,7 @@ main(int argc, char *argv[]) /* NOTREACHED */ } - curp.mp = mparse_alloc(type, evt_open, evt_close, mmsg, &curp); + curp.mp = mparse_alloc(type, evt_open, evt_close, curp.wlevel, mmsg, &curp); argc -= optind; argv += optind; @@ -501,27 +491,16 @@ woptions(struct curparse *curp, char *ar } static void -mmsg(enum mandocerr t, void *arg, int ln, int col, const char *msg) +mmsg(enum mandocerr t, enum mandoclevel lvl, + const char *file, int line, int col, const char *msg) { - struct curparse *cp; - enum mandoclevel level; - level = MANDOCLEVEL_FATAL; - while (t < mandoclimits[level]) - /* LINTED */ - level--; - - cp = (struct curparse *)arg; - if (level < cp->wlevel) - return; - - fprintf(stderr, "%s:%d:%d: %s: %s", cp->file, ln, col + 1, - mandoclevels[level], mandocerrs[t]); + fprintf(stderr, "%s:%d:%d: %s: %s", + file, line, col + 1, + mandoclevels[lvl], mandocerrs[t]); if (msg) fprintf(stderr, ": %s", msg); fputc('\n', stderr); - - mparse_setstatus(cp->mp, level); } Index: tbl_data.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/tbl_data.c,v retrieving revision 1.23 retrieving revision 1.24 diff -Ltbl_data.c -Ltbl_data.c -u -p -r1.23 -r1.24 --- tbl_data.c +++ tbl_data.c @@ -64,7 +64,8 @@ data(struct tbl_node *tbl, struct tbl_sp */ if (NULL == cp) { - TBL_MSG(tbl, MANDOCERR_TBLEXTRADAT, ln, *pos); + mandoc_msg(MANDOCERR_TBLEXTRADAT, + tbl->parse, ln, *pos, NULL); /* Skip to the end... */ while (p[*pos]) (*pos)++; @@ -130,7 +131,8 @@ data(struct tbl_node *tbl, struct tbl_sp TBL_CELL_DHORIZ == dat->layout->pos || TBL_CELL_DOWN == dat->layout->pos) if (TBL_DATA_DATA == dat->pos && '\0' != *dat->string) - TBL_MSG(tbl, MANDOCERR_TBLIGNDATA, ln, sv); + mandoc_msg(MANDOCERR_TBLIGNDATA, + tbl->parse, ln, sv, NULL); return(1); } @@ -172,7 +174,8 @@ tbl_cdata(struct tbl_node *tbl, int ln, dat->string = mandoc_strdup(p); if (TBL_CELL_DOWN == dat->layout->pos) - TBL_MSG(tbl, MANDOCERR_TBLIGNDATA, ln, pos); + mandoc_msg(MANDOCERR_TBLIGNDATA, + tbl->parse, ln, pos, NULL); return(0); } @@ -210,7 +213,7 @@ tbl_data(struct tbl_node *tbl, int ln, c pos = 0; if ('\0' == p[pos]) { - TBL_MSG(tbl, MANDOCERR_TBL, ln, pos); + mandoc_msg(MANDOCERR_TBL, tbl->parse, ln, pos, NULL); return(0); } Index: mdoc_validate.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_validate.c,v retrieving revision 1.163 retrieving revision 1.164 diff -Lmdoc_validate.c -Lmdoc_validate.c -u -p -r1.163 -r1.164 --- mdoc_validate.c +++ mdoc_validate.c @@ -446,7 +446,7 @@ check_count(struct mdoc *m, enum mdoc_ty } t = lvl == CHECK_WARN ? MANDOCERR_ARGCWARN : MANDOCERR_ARGCOUNT; - mdoc_vmsg(m, t, m->last->line, m->last->pos, + mandoc_vmsg(t, m->parse, m->last->line, m->last->pos, "want %s%d children (have %d)", p, val, m->last->nchild); return(1); @@ -581,10 +581,9 @@ check_parent(PRE_ARGS, enum mdoct tok, e (t == n->parent->type)) return(1); - mdoc_vmsg(mdoc, MANDOCERR_SYNTCHILD, - n->line, n->pos, "want parent %s", - MDOC_ROOT == t ? "" : - mdoc_macronames[tok]); + mandoc_vmsg(MANDOCERR_SYNTCHILD, mdoc->parse, n->line, + n->pos, "want parent %s", MDOC_ROOT == t ? + "" : mdoc_macronames[tok]); return(0); } @@ -1332,7 +1331,8 @@ post_it(POST_ARGS) else er = MANDOCERR_SYNTARGCOUNT; - mdoc_vmsg(mdoc, er, mdoc->last->line, mdoc->last->pos, + mandoc_vmsg(er, mdoc->parse, mdoc->last->line, + mdoc->last->pos, "columns == %d (have %d)", cols, i); return(MANDOCERR_ARGCOUNT == er); default: @@ -2001,16 +2001,16 @@ post_dd(POST_ARGS) n = mdoc->last; if (NULL == n->child || '\0' == n->child->string[0]) { - mdoc->meta.date = mandoc_normdate(NULL, - mdoc->msg, mdoc->data, n->line, n->pos); + mdoc->meta.date = mandoc_normdate + (mdoc->parse, NULL, n->line, n->pos); return(1); } if ( ! concat(mdoc, buf, n->child, DATESIZE)) return(0); - mdoc->meta.date = mandoc_normdate(buf, - mdoc->msg, mdoc->data, n->line, n->pos); + mdoc->meta.date = mandoc_normdate + (mdoc->parse, buf, n->line, n->pos); return(1); } Index: man.h =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/man.h,v retrieving revision 1.54 retrieving revision 1.55 diff -Lman.h -Lman.h -u -p -r1.54 -r1.55 --- man.h +++ man.h @@ -117,7 +117,7 @@ __BEGIN_DECLS struct man; void man_free(struct man *); -struct man *man_alloc(struct regset *, void *, mandocmsg); +struct man *man_alloc(struct regset *, struct mparse *); void man_reset(struct man *); int man_parseln(struct man *, int, char *, int); int man_endparse(struct man *); Index: mdoc.h =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc.h,v retrieving revision 1.118 retrieving revision 1.119 diff -Lmdoc.h -Lmdoc.h -u -p -r1.118 -r1.119 --- mdoc.h +++ mdoc.h @@ -424,7 +424,7 @@ __BEGIN_DECLS struct mdoc; void mdoc_free(struct mdoc *); -struct mdoc *mdoc_alloc(struct regset *, void *, mandocmsg); +struct mdoc *mdoc_alloc(struct regset *, struct mparse *); void mdoc_reset(struct mdoc *); int mdoc_parseln(struct mdoc *, int, char *, int); const struct mdoc_node *mdoc_node(const struct mdoc *); Index: man_argv.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/man_argv.c,v retrieving revision 1.5 retrieving revision 1.6 diff -Lman_argv.c -Lman_argv.c -u -p -r1.5 -r1.6 --- man_argv.c +++ man_argv.c @@ -39,6 +39,6 @@ man_args(struct man *m, int line, int *p if ('\0' == *start) return(ARGS_EOLN); - *v = mandoc_getarg(v, m->msg, m->data, line, pos); + *v = mandoc_getarg(m->parse, v, line, pos); return('"' == *start ? ARGS_QWORD : ARGS_WORD); } Index: man_validate.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/man_validate.c,v retrieving revision 1.64 retrieving revision 1.65 diff -Lman_validate.c -Lman_validate.c -u -p -r1.64 -r1.65 --- man_validate.c +++ man_validate.c @@ -196,8 +196,8 @@ check_root(CHKARGS) m->meta.title = mandoc_strdup("unknown"); m->meta.msec = mandoc_strdup("1"); - m->meta.date = mandoc_normdate(NULL, - m->msg, m->data, n->line, n->pos); + m->meta.date = mandoc_normdate + (m->parse, NULL, n->line, n->pos); } return(1); @@ -247,7 +247,7 @@ check_##name(CHKARGS) \ { \ if (n->nchild ineq (x)) \ return(1); \ - man_vmsg(m, MANDOCERR_ARGCOUNT, n->line, n->pos, \ + mandoc_vmsg(MANDOCERR_ARGCOUNT, m->parse, n->line, n->pos, \ "line arguments %s %d (have %d)", \ #ineq, (x), n->nchild); \ return(1); \ @@ -299,14 +299,17 @@ check_ft(CHKARGS) } if (0 == ok) { - man_vmsg(m, MANDOCERR_BADFONT, - n->line, n->pos, "%s", cp); + mandoc_vmsg + (MANDOCERR_BADFONT, m->parse, + n->line, n->pos, "%s", cp); *cp = '\0'; } if (1 < n->nchild) - man_vmsg(m, MANDOCERR_ARGCOUNT, n->line, n->pos, - "want one child (have %d)", n->nchild); + mandoc_vmsg + (MANDOCERR_ARGCOUNT, m->parse, n->line, + n->pos, "want one child (have %d)", + n->nchild); return(1); } @@ -426,8 +429,8 @@ post_TH(CHKARGS) n = n->next; if (n) pos = n->pos; - m->meta.date = mandoc_normdate(n ? n->string : NULL, - m->msg, m->data, line, pos); + m->meta.date = mandoc_normdate + (m->parse, n ? n->string : NULL, line, pos); /* TITLE MSEC DATE ->SOURCE<- VOL */ Index: mandoc.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mandoc.c,v retrieving revision 1.41 retrieving revision 1.42 diff -Lmandoc.c -Lmandoc.c -u -p -r1.41 -r1.42 --- mandoc.c +++ mandoc.c @@ -296,7 +296,7 @@ mandoc_strdup(const char *ptr) * or to the null byte terminating the argument line. */ char * -mandoc_getarg(char **cpp, mandocmsg msg, void *data, int ln, int *pos) +mandoc_getarg(struct mparse *parse, char **cpp, int ln, int *pos) { char *start, *cp; int quoted, pairs, white; @@ -343,8 +343,8 @@ mandoc_getarg(char **cpp, mandocmsg msg, } /* Quoted argument without a closing quote. */ - if (1 == quoted && msg) - (*msg)(MANDOCERR_BADQUOTE, data, ln, *pos, NULL); + if (1 == quoted) + mandoc_msg(MANDOCERR_BADQUOTE, parse, ln, *pos, NULL); /* Null-terminate this argument and move to the next one. */ if (pairs) @@ -357,8 +357,8 @@ mandoc_getarg(char **cpp, mandocmsg msg, *pos += (int)(cp - start) + (quoted ? 1 : 0); *cpp = cp; - if ('\0' == *cp && msg && (white || ' ' == cp[-1])) - (*msg)(MANDOCERR_EOLNSPACE, data, ln, *pos, NULL); + if ('\0' == *cp && (white || ' ' == cp[-1])) + mandoc_msg(MANDOCERR_EOLNSPACE, parse, ln, *pos, NULL); return(start); } @@ -416,20 +416,20 @@ fail: } char * -mandoc_normdate(char *in, mandocmsg msg, void *data, int ln, int pos) +mandoc_normdate(struct mparse *parse, char *in, int ln, int pos) { char *out; time_t t; if (NULL == in || '\0' == *in || 0 == strcmp(in, "$" "Mdocdate$")) { - (*msg)(MANDOCERR_NODATE, data, ln, pos, NULL); + mandoc_msg(MANDOCERR_NODATE, parse, ln, pos, NULL); time(&t); } else if (!a2time(&t, "$" "Mdocdate: %b %d %Y $", in) && !a2time(&t, "%b %d, %Y", in) && !a2time(&t, "%Y-%m-%d", in)) { - (*msg)(MANDOCERR_BADDATE, data, ln, pos, NULL); + mandoc_msg(MANDOCERR_BADDATE, parse, ln, pos, NULL); t = 0; } out = t ? time2a(t) : NULL; Index: libmdoc.h =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/libmdoc.h,v retrieving revision 1.68 retrieving revision 1.69 diff -Llibmdoc.h -Llibmdoc.h -u -p -r1.68 -r1.69 --- libmdoc.h +++ libmdoc.h @@ -25,9 +25,8 @@ enum mdoc_next { }; struct mdoc { - void *data; /* private application data */ - mandocmsg msg; /* message callback */ - int flags; + struct mparse *parse; /* parse pointer */ + int flags; /* parse flags */ #define MDOC_HALT (1 << 0) /* error in parse: halt */ #define MDOC_LITERAL (1 << 1) /* in a literal scope */ #define MDOC_PBODY (1 << 2) /* in the document body */ @@ -86,11 +85,9 @@ extern const struct mdoc_macro *const md __BEGIN_DECLS #define mdoc_pmsg(m, l, p, t) \ - (*(m)->msg)((t), (m)->data, (l), (p), NULL) + mandoc_msg((t), (m)->parse, (l), (p), NULL) #define mdoc_nmsg(m, n, t) \ - (*(m)->msg)((t), (m)->data, (n)->line, (n)->pos, NULL) -void mdoc_vmsg(struct mdoc *, enum mandocerr, - int, int, const char *, ...); + mandoc_msg((t), (m)->parse, (n)->line, (n)->pos, NULL) int mdoc_macro(MACRO_PROT_ARGS); int mdoc_word_alloc(struct mdoc *, int, int, const char *); Index: man.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/man.c,v retrieving revision 1.103 retrieving revision 1.104 diff -Lman.c -Lman.c -u -p -r1.103 -r1.104 --- man.c +++ man.c @@ -95,15 +95,14 @@ man_free(struct man *man) struct man * -man_alloc(struct regset *regs, void *data, mandocmsg msg) +man_alloc(struct regset *regs, struct mparse *parse) { struct man *p; p = mandoc_calloc(1, sizeof(struct man)); man_hash_init(); - p->data = data; - p->msg = msg; + p->parse = parse; p->regs = regs; man_alloc1(p); @@ -521,7 +520,8 @@ man_pmacro(struct man *m, int ln, char * tok = (j > 0 && j < 4) ? man_hash_find(mac) : MAN_MAX; if (MAN_MAX == tok) { - man_vmsg(m, MANDOCERR_MACRO, ln, ppos, "%s", buf + ppos - 1); + mandoc_vmsg(MANDOCERR_MACRO, m->parse, ln, + ppos, "%s", buf + ppos - 1); return(1); } @@ -554,8 +554,8 @@ man_pmacro(struct man *m, int ln, char * if (MAN_NSCOPED & man_macros[n->tok].flags) n = n->parent; - man_vmsg(m, MANDOCERR_LINESCOPE, n->line, n->pos, - "%s", man_macronames[n->tok]); + mandoc_vmsg(MANDOCERR_LINESCOPE, m->parse, n->line, + n->pos, "%s", man_macronames[n->tok]); man_node_delete(m, n); m->flags &= ~MAN_ELINE; @@ -620,21 +620,6 @@ err: /* Error out. */ m->flags |= MAN_HALT; return(0); } - - -void -man_vmsg(struct man *man, enum mandocerr t, - int ln, int pos, const char *fmt, ...) -{ - char buf[256]; - va_list ap; - - va_start(ap, fmt); - vsnprintf(buf, sizeof(buf) - 1, fmt, ap); - va_end(ap); - (*man->msg)(t, man->data, ln, pos, buf); -} - /* * Unlink a node from its context. If "m" is provided, the last parse Index: roff.h =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/roff.h,v retrieving revision 1.24 retrieving revision 1.25 diff -Lroff.h -Lroff.h -u -p -r1.24 -r1.25 --- roff.h +++ roff.h @@ -34,7 +34,7 @@ __BEGIN_DECLS struct roff; void roff_free(struct roff *); -struct roff *roff_alloc(struct regset *, void *, mandocmsg); +struct roff *roff_alloc(struct regset *, struct mparse *); void roff_reset(struct roff *); enum rofferr roff_parseln(struct roff *, int, char **, size_t *, int, int *); Index: mdoc.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc.c,v retrieving revision 1.184 retrieving revision 1.185 diff -Lmdoc.c -Lmdoc.c -u -p -r1.184 -r1.185 --- mdoc.c +++ mdoc.c @@ -192,14 +192,13 @@ mdoc_free(struct mdoc *mdoc) * Allocate volatile and non-volatile parse resources. */ struct mdoc * -mdoc_alloc(struct regset *regs, void *data, mandocmsg msg) +mdoc_alloc(struct regset *regs, struct mparse *parse) { struct mdoc *p; p = mandoc_calloc(1, sizeof(struct mdoc)); - p->msg = msg; - p->data = data; + p->parse = parse; p->regs = regs; mdoc_hash_init(); @@ -302,22 +301,6 @@ mdoc_parseln(struct mdoc *m, int ln, cha mdoc_ptext(m, ln, buf, offs)); } - -void -mdoc_vmsg(struct mdoc *mdoc, enum mandocerr t, - int ln, int pos, const char *fmt, ...) -{ - char buf[256]; - va_list ap; - - va_start(ap, fmt); - vsnprintf(buf, sizeof(buf) - 1, fmt, ap); - va_end(ap); - - (*mdoc->msg)(t, mdoc->data, ln, pos, buf); -} - - int mdoc_macro(MACRO_PROT_ARGS) { @@ -345,8 +328,8 @@ mdoc_macro(MACRO_PROT_ARGS) if (NULL == m->meta.os) m->meta.os = mandoc_strdup("LOCAL"); if (NULL == m->meta.date) - m->meta.date = mandoc_normdate(NULL, - m->msg, m->data, line, ppos); + m->meta.date = mandoc_normdate + (m->parse, NULL, line, ppos); m->flags |= MDOC_PBODY; } @@ -849,7 +832,8 @@ mdoc_pmacro(struct mdoc *m, int ln, char tok = (j > 1 || j < 4) ? mdoc_hash_find(mac) : MDOC_MAX; if (MDOC_MAX == tok) { - mdoc_vmsg(m, MANDOCERR_MACRO, ln, sv, "%s", buf + sv - 1); + mandoc_vmsg(MANDOCERR_MACRO, m->parse, + ln, sv, "%s", buf + sv - 1); return(1); } Index: roff.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/roff.c,v retrieving revision 1.127 retrieving revision 1.128 diff -Lroff.c -Lroff.c -u -p -r1.127 -r1.128 --- roff.c +++ roff.c @@ -84,9 +84,8 @@ struct roffstr { }; struct roff { + struct mparse *parse; /* parse point */ struct roffnode *last; /* leaf of stack */ - mandocmsg msg; /* err/warn/fatal messages */ - void *data; /* privdata for messages */ enum roffrule rstack[RSTACK_MAX]; /* stack of !`ie' rules */ int rstackpos; /* position in rstack */ struct regset *regs; /* read/writable registers */ @@ -361,14 +360,13 @@ roff_free(struct roff *r) struct roff * -roff_alloc(struct regset *regs, void *data, const mandocmsg msg) +roff_alloc(struct regset *regs, struct mparse *parse) { struct roff *r; r = mandoc_calloc(1, sizeof(struct roff)); r->regs = regs; - r->msg = msg; - r->data = data; + r->parse = parse; r->rstackpos = -1; roff_hash_init(); @@ -555,18 +553,18 @@ roff_endparse(struct roff *r) { if (r->last) - (*r->msg)(MANDOCERR_SCOPEEXIT, r->data, + mandoc_msg(MANDOCERR_SCOPEEXIT, r->parse, r->last->line, r->last->col, NULL); if (r->eqn) { - (*r->msg)(MANDOCERR_SCOPEEXIT, r->data, + mandoc_msg(MANDOCERR_SCOPEEXIT, r->parse, r->eqn->eqn.line, r->eqn->eqn.pos, NULL); eqn_end(r->eqn); r->eqn = NULL; } if (r->tbl) { - (*r->msg)(MANDOCERR_SCOPEEXIT, r->data, + mandoc_msg(MANDOCERR_SCOPEEXIT, r->parse, r->tbl->line, r->tbl->pos, NULL); tbl_end(r->tbl); r->tbl = NULL; @@ -639,7 +637,7 @@ roff_cblock(ROFF_ARGS) */ if (NULL == r->last) { - (*r->msg)(MANDOCERR_NOSCOPE, r->data, ln, ppos, NULL); + mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL); return(ROFF_IGN); } @@ -658,12 +656,12 @@ roff_cblock(ROFF_ARGS) case (ROFF_ig): break; default: - (*r->msg)(MANDOCERR_NOSCOPE, r->data, ln, ppos, NULL); + mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL); return(ROFF_IGN); } if ((*bufp)[pos]) - (*r->msg)(MANDOCERR_ARGSLOST, r->data, ln, pos, NULL); + mandoc_msg(MANDOCERR_ARGSLOST, r->parse, ln, pos, NULL); roffnode_pop(r); roffnode_cleanscope(r); @@ -690,7 +688,7 @@ roff_ccond(ROFF_ARGS) { if (NULL == r->last) { - (*r->msg)(MANDOCERR_NOSCOPE, r->data, ln, ppos, NULL); + mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL); return(ROFF_IGN); } @@ -702,17 +700,17 @@ roff_ccond(ROFF_ARGS) case (ROFF_if): break; default: - (*r->msg)(MANDOCERR_NOSCOPE, r->data, ln, ppos, NULL); + mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL); return(ROFF_IGN); } if (r->last->endspan > -1) { - (*r->msg)(MANDOCERR_NOSCOPE, r->data, ln, ppos, NULL); + mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL); return(ROFF_IGN); } if ((*bufp)[pos]) - (*r->msg)(MANDOCERR_ARGSLOST, r->data, ln, pos, NULL); + mandoc_msg(MANDOCERR_ARGSLOST, r->parse, ln, pos, NULL); roffnode_pop(r); roffnode_cleanscope(r); @@ -732,7 +730,7 @@ roff_block(ROFF_ARGS) if (ROFF_ig != tok) { if ('\0' == (*bufp)[pos]) { - (*r->msg)(MANDOCERR_NOARGS, r->data, ln, ppos, NULL); + mandoc_msg(MANDOCERR_NOARGS, r->parse, ln, ppos, NULL); return(ROFF_IGN); } @@ -746,7 +744,7 @@ roff_block(ROFF_ARGS) if (ROFF_de == tok) name = *bufp + pos; else - (*r->msg)(MANDOCERR_REQUEST, r->data, ln, ppos, + mandoc_msg(MANDOCERR_REQUEST, r->parse, ln, ppos, roffs[tok].name); while ((*bufp)[pos] && ' ' != (*bufp)[pos]) @@ -796,7 +794,7 @@ roff_block(ROFF_ARGS) r->last->end[(int)sz] = '\0'; if ((*bufp)[pos]) - (*r->msg)(MANDOCERR_ARGSLOST, r->data, ln, pos, NULL); + mandoc_msg(MANDOCERR_ARGSLOST, r->parse, ln, pos, NULL); return(ROFF_IGN); } @@ -977,7 +975,7 @@ roff_line_ignore(ROFF_ARGS) { if (ROFF_it == tok) - (*r->msg)(MANDOCERR_REQUEST, r->data, ln, ppos, "it"); + mandoc_msg(MANDOCERR_REQUEST, r->parse, ln, ppos, "it"); return(ROFF_IGN); } @@ -992,7 +990,7 @@ roff_cond(ROFF_ARGS) /* Stack overflow! */ if (ROFF_ie == tok && r->rstackpos == RSTACK_MAX - 1) { - (*r->msg)(MANDOCERR_MEM, r->data, ln, ppos, NULL); + mandoc_msg(MANDOCERR_MEM, r->parse, ln, ppos, NULL); return(ROFF_ERR); } @@ -1023,7 +1021,7 @@ roff_cond(ROFF_ARGS) */ if ('\0' == (*bufp)[pos] && sv != pos) { - (*r->msg)(MANDOCERR_NOARGS, r->data, ln, ppos, NULL); + mandoc_msg(MANDOCERR_NOARGS, r->parse, ln, ppos, NULL); return(ROFF_IGN); } @@ -1150,7 +1148,7 @@ roff_TE(ROFF_ARGS) { if (NULL == r->tbl) - (*r->msg)(MANDOCERR_NOSCOPE, r->data, ln, ppos, NULL); + mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL); else tbl_end(r->tbl); @@ -1164,7 +1162,7 @@ roff_T_(ROFF_ARGS) { if (NULL == r->tbl) - (*r->msg)(MANDOCERR_NOSCOPE, r->data, ln, ppos, NULL); + mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL); else tbl_restart(ppos, ln, r->tbl); @@ -1194,7 +1192,7 @@ static enum rofferr roff_EN(ROFF_ARGS) { - (*r->msg)(MANDOCERR_NOSCOPE, r->data, ln, ppos, NULL); + mandoc_msg(MANDOCERR_NOSCOPE, r->parse, ln, ppos, NULL); return(ROFF_IGN); } @@ -1205,11 +1203,11 @@ roff_TS(ROFF_ARGS) struct tbl_node *t; if (r->tbl) { - (*r->msg)(MANDOCERR_SCOPEBROKEN, r->data, ln, ppos, NULL); + mandoc_msg(MANDOCERR_SCOPEBROKEN, r->parse, ln, ppos, NULL); tbl_end(r->tbl); } - t = tbl_alloc(ppos, ln, r->data, r->msg); + t = tbl_alloc(ppos, ln, r->parse); if (r->last_tbl) r->last_tbl->next = t; @@ -1226,7 +1224,7 @@ roff_so(ROFF_ARGS) { char *name; - (*r->msg)(MANDOCERR_SO, r->data, ln, ppos, NULL); + mandoc_msg(MANDOCERR_SO, r->parse, ln, ppos, NULL); /* * Handle `so'. Be EXTREMELY careful, as we shouldn't be @@ -1237,7 +1235,7 @@ roff_so(ROFF_ARGS) name = *bufp + pos; if ('/' == *name || strstr(name, "../") || strstr(name, "/..")) { - (*r->msg)(MANDOCERR_SOPATH, r->data, ln, pos, NULL); + mandoc_msg(MANDOCERR_SOPATH, r->parse, ln, pos, NULL); return(ROFF_ERR); } @@ -1260,7 +1258,7 @@ roff_userdef(ROFF_ARGS) cp = *bufp + pos; for (i = 0; i < 9; i++) arg[i] = '\0' == *cp ? "" : - mandoc_getarg(&cp, r->msg, r->data, ln, &pos); + mandoc_getarg(r->parse, &cp, ln, &pos); /* * Expand macro arguments. @@ -1316,7 +1314,7 @@ roff_getname(struct roff *r, char **cpp, cp++; if ('\\' == *cp) continue; - (*r->msg)(MANDOCERR_NAMESC, r->data, ln, pos, NULL); + mandoc_msg(MANDOCERR_NAMESC, r->parse, ln, pos, NULL); *cp = '\0'; name = cp; } Index: libroff.h =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/libroff.h,v retrieving revision 1.19 retrieving revision 1.20 diff -Llibroff.h -Llibroff.h -u -p -r1.19 -r1.20 --- libroff.h +++ libroff.h @@ -27,8 +27,7 @@ enum tbl_part { }; struct tbl_node { - mandocmsg msg; /* status messages */ - void *data; /* privdata for messages */ + struct mparse *parse; /* parse point */ int pos; /* invocation column */ int line; /* invocation line */ enum tbl_part part; @@ -48,10 +47,7 @@ struct eqn_node { struct eqn_node *next; }; -#define TBL_MSG(tblp, type, line, col) \ - (*(tblp)->msg)((type), (tblp)->data, (line), (col), NULL) - -struct tbl_node *tbl_alloc(int, int, void *, mandocmsg); +struct tbl_node *tbl_alloc(int, int, struct mparse *); void tbl_restart(int, int, struct tbl_node *); void tbl_free(struct tbl_node *); void tbl_reset(struct tbl_node *); Index: tbl_opts.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/tbl_opts.c,v retrieving revision 1.9 retrieving revision 1.10 diff -Ltbl_opts.c -Ltbl_opts.c -u -p -r1.9 -r1.10 --- tbl_opts.c +++ tbl_opts.c @@ -20,6 +20,7 @@ #include #include "mandoc.h" +#include "libmandoc.h" #include "libroff.h" enum tbl_ident { @@ -88,7 +89,8 @@ arg(struct tbl_node *tbl, int ln, const /* Arguments always begin with a parenthesis. */ if ('(' != p[*pos]) { - TBL_MSG(tbl, MANDOCERR_TBL, ln, *pos); + mandoc_msg(MANDOCERR_TBL, tbl->parse, + ln, *pos, NULL); return(0); } @@ -103,12 +105,14 @@ arg(struct tbl_node *tbl, int ln, const switch (key) { case (KEY_DELIM): if ('\0' == p[(*pos)++]) { - TBL_MSG(tbl, MANDOCERR_TBL, ln, *pos - 1); + mandoc_msg(MANDOCERR_TBL, tbl->parse, + ln, *pos - 1, NULL); return(0); } if ('\0' == p[(*pos)++]) { - TBL_MSG(tbl, MANDOCERR_TBL, ln, *pos - 1); + mandoc_msg(MANDOCERR_TBL, tbl->parse, + ln, *pos - 1, NULL); return(0); } break; @@ -116,7 +120,8 @@ arg(struct tbl_node *tbl, int ln, const if ('\0' != (tbl->opts.tab = p[(*pos)++])) break; - TBL_MSG(tbl, MANDOCERR_TBL, ln, *pos - 1); + mandoc_msg(MANDOCERR_TBL, tbl->parse, + ln, *pos - 1, NULL); return(0); case (KEY_LINESIZE): for (i = 0; i < KEY_MAXNUMSZ && p[*pos]; i++, (*pos)++) { @@ -131,13 +136,14 @@ arg(struct tbl_node *tbl, int ln, const break; } - (*tbl->msg)(MANDOCERR_TBL, tbl->data, ln, *pos, NULL); + mandoc_msg(MANDOCERR_TBL, tbl->parse, ln, *pos, NULL); return(0); case (KEY_DPOINT): if ('\0' != (tbl->opts.decimal = p[(*pos)++])) break; - TBL_MSG(tbl, MANDOCERR_TBL, ln, *pos - 1); + mandoc_msg(MANDOCERR_TBL, tbl->parse, + ln, *pos - 1, NULL); return(0); default: abort(); @@ -149,7 +155,7 @@ arg(struct tbl_node *tbl, int ln, const if (')' == p[(*pos)++]) return(1); - TBL_MSG(tbl, MANDOCERR_TBL, ln, *pos - 1); + mandoc_msg(MANDOCERR_TBL, tbl->parse, ln, *pos - 1, NULL); return(0); } @@ -196,7 +202,7 @@ again: /* /* Exit if buffer is empty (or overrun). */ if (KEY_MAXNAME == i || 0 == i) { - TBL_MSG(tbl, MANDOCERR_TBL, ln, *pos); + mandoc_msg(MANDOCERR_TBL, tbl->parse, ln, *pos, NULL); return; } @@ -235,7 +241,7 @@ again: /* */ if (KEY_MAXKEYS == i) - TBL_MSG(tbl, MANDOCERR_TBLOPT, ln, sv); + mandoc_msg(MANDOCERR_TBLOPT, tbl->parse, ln, sv, NULL); goto again; /* NOTREACHED */ Index: mdoc_macro.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_macro.c,v retrieving revision 1.103 retrieving revision 1.104 diff -Lmdoc_macro.c -Lmdoc_macro.c -u -p -r1.103 -r1.104 --- mdoc_macro.c +++ mdoc_macro.c @@ -513,9 +513,9 @@ make_pending(struct mdoc_node *broken, e taker->pending = broken->pending; } broken->pending = breaker; - mdoc_vmsg(m, MANDOCERR_SCOPENEST, line, ppos, - "%s breaks %s", mdoc_macronames[tok], - mdoc_macronames[broken->tok]); + mandoc_vmsg(MANDOCERR_SCOPENEST, m->parse, line, ppos, + "%s breaks %s", mdoc_macronames[tok], + mdoc_macronames[broken->tok]); return(1); } @@ -541,9 +541,10 @@ rew_sub(enum mdoc_type t, struct mdoc *m case (REWIND_THIS): break; case (REWIND_FORCE): - mdoc_vmsg(m, MANDOCERR_SCOPEBROKEN, line, ppos, - "%s breaks %s", mdoc_macronames[tok], - mdoc_macronames[n->tok]); + mandoc_vmsg(MANDOCERR_SCOPEBROKEN, m->parse, + line, ppos, "%s breaks %s", + mdoc_macronames[tok], + mdoc_macronames[n->tok]); /* FALLTHROUGH */ case (REWIND_MORE): n = n->parent; @@ -1298,7 +1299,7 @@ blk_part_imp(MACRO_PROT_ARGS) * crufty use of `Op' breakage. */ if (n != body) - mdoc_vmsg(m, MANDOCERR_SCOPENEST, line, ppos, + mandoc_vmsg(MANDOCERR_SCOPENEST, m->parse, line, ppos, "%s broken", mdoc_macronames[tok]); if (n && ! rew_sub(MDOC_BODY, m, tok, line, ppos)) Index: tbl_layout.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/tbl_layout.c,v retrieving revision 1.16 retrieving revision 1.17 diff -Ltbl_layout.c -Ltbl_layout.c -u -p -r1.16 -r1.17 --- tbl_layout.c +++ tbl_layout.c @@ -100,7 +100,8 @@ mod: (*pos)++; goto mod; } - TBL_MSG(tbl, MANDOCERR_TBLLAYOUT, ln, *pos); + mandoc_msg(MANDOCERR_TBLLAYOUT, + tbl->parse, ln, *pos, NULL); return(0); } @@ -117,7 +118,8 @@ mod: /* No greater than 4 digits. */ if (4 == i) { - TBL_MSG(tbl, MANDOCERR_TBLLAYOUT, ln, *pos); + mandoc_msg(MANDOCERR_TBLLAYOUT, tbl->parse, + ln, *pos, NULL); return(0); } @@ -156,7 +158,8 @@ mod: (*pos)--; break; default: - TBL_MSG(tbl, MANDOCERR_TBLLAYOUT, ln, *pos - 1); + mandoc_msg(MANDOCERR_TBLLAYOUT, tbl->parse, + ln, *pos - 1, NULL); return(0); } @@ -171,7 +174,8 @@ mod: break; } - TBL_MSG(tbl, MANDOCERR_TBLLAYOUT, ln, *pos - 1); + mandoc_msg(MANDOCERR_TBLLAYOUT, tbl->parse, + ln, *pos - 1, NULL); return(0); } @@ -189,7 +193,8 @@ cell(struct tbl_node *tbl, struct tbl_ro break; if (KEYS_MAX == i) { - TBL_MSG(tbl, MANDOCERR_TBLLAYOUT, ln, *pos); + mandoc_msg(MANDOCERR_TBLLAYOUT, tbl->parse, + ln, *pos, NULL); return(0); } @@ -205,7 +210,8 @@ cell(struct tbl_node *tbl, struct tbl_ro if (TBL_CELL_SPAN == c) { if (NULL == rp->first) { - TBL_MSG(tbl, MANDOCERR_TBLLAYOUT, ln, *pos); + mandoc_msg(MANDOCERR_TBLLAYOUT, tbl->parse, + ln, *pos, NULL); return(0); } else if (rp->last) switch (rp->last->pos) { @@ -213,7 +219,8 @@ cell(struct tbl_node *tbl, struct tbl_ro case (TBL_CELL_DVERT): case (TBL_CELL_HORIZ): case (TBL_CELL_DHORIZ): - TBL_MSG(tbl, MANDOCERR_TBLLAYOUT, ln, *pos); + mandoc_msg(MANDOCERR_TBLLAYOUT, tbl->parse, + ln, *pos, NULL); return(0); default: break; @@ -226,7 +233,7 @@ cell(struct tbl_node *tbl, struct tbl_ro */ if (TBL_CELL_DOWN == c && rp == tbl->first_row) { - TBL_MSG(tbl, MANDOCERR_TBLLAYOUT, ln, *pos); + mandoc_msg(MANDOCERR_TBLLAYOUT, tbl->parse, ln, *pos, NULL); return(0); } @@ -244,7 +251,7 @@ cell(struct tbl_node *tbl, struct tbl_ro if (rp->last && (TBL_CELL_VERT == c || TBL_CELL_DVERT == c) && (TBL_CELL_VERT == rp->last->pos || TBL_CELL_DVERT == rp->last->pos)) { - TBL_MSG(tbl, MANDOCERR_TBLLAYOUT, ln, *pos - 1); + mandoc_msg(MANDOCERR_TBLLAYOUT, tbl->parse, ln, *pos - 1, NULL); return(0); } @@ -285,7 +292,8 @@ cell: if ('.' == p[*pos]) { tbl->part = TBL_PART_DATA; if (NULL == tbl->first_row) - TBL_MSG(tbl, MANDOCERR_TBLNOLAYOUT, ln, *pos); + mandoc_msg(MANDOCERR_TBLNOLAYOUT, tbl->parse, + ln, *pos, NULL); (*pos)++; return; } Index: read.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/read.c,v retrieving revision 1.2 retrieving revision 1.3 diff -Lread.c -Lread.c -u -p -r1.2 -r1.3 --- read.c +++ read.c @@ -21,12 +21,14 @@ #include #include #include +#include #include #include #include #include #include "mandoc.h" +#include "libmandoc.h" #include "mdoc.h" #include "man.h" #include "roff.h" @@ -44,6 +46,7 @@ struct buf { struct mparse { enum mandoclevel file_status; /* status of current parse */ + enum mandoclevel wlevel; /* ignore messages below this */ int line; /* line number in the file */ enum mparset inttype; /* which parser to use */ struct man *pman; /* persistent man parser */ @@ -57,7 +60,7 @@ struct mparse { void *arg; /* argument to mmsg */ mevt_open evt_open; /* file-open event */ mevt_close evt_close; /* file-close event */ - const char *svfile; + const char *file; }; static void resize_buf(struct buf *, size_t); @@ -68,6 +71,16 @@ static void pdesc(struct mparse *, con static int read_whole_file(const char *, int, struct buf *, int *); static void mparse_end(struct mparse *); +static const enum mandocerr mandoclimits[MANDOCLEVEL_MAX] = { + MANDOCERR_OK, + MANDOCERR_WARNING, + MANDOCERR_WARNING, + MANDOCERR_ERROR, + MANDOCERR_FATAL, + MANDOCERR_MAX, + MANDOCERR_MAX +}; + static void resize_buf(struct buf *buf, size_t initial) { @@ -103,15 +116,13 @@ pset(const char *buf, int pos, struct mp switch (curp->inttype) { case (MPARSE_MDOC): if (NULL == curp->pmdoc) - curp->pmdoc = mdoc_alloc - (&curp->regs, curp->arg, curp->mmsg); + curp->pmdoc = mdoc_alloc(&curp->regs, curp); assert(curp->pmdoc); curp->mdoc = curp->pmdoc; return; case (MPARSE_MAN): if (NULL == curp->pman) - curp->pman = man_alloc - (&curp->regs, curp->arg, curp->mmsg); + curp->pman = man_alloc(&curp->regs, curp); assert(curp->pman); curp->man = curp->pman; return; @@ -121,16 +132,14 @@ pset(const char *buf, int pos, struct mp if (pos >= 3 && 0 == memcmp(buf, ".Dd", 3)) { if (NULL == curp->pmdoc) - curp->pmdoc = mdoc_alloc - (&curp->regs, curp->arg, curp->mmsg); + curp->pmdoc = mdoc_alloc(&curp->regs, curp); assert(curp->pmdoc); curp->mdoc = curp->pmdoc; return; } if (NULL == curp->pman) - curp->pman = man_alloc - (&curp->regs, curp->arg, curp->mmsg); + curp->pman = man_alloc(&curp->regs, curp); assert(curp->pman); curp->man = curp->pman; } @@ -195,7 +204,7 @@ mparse_buf_r(struct mparse *curp, struct if ( ! (isascii(c) && (isgraph(c) || isblank(c)))) { - curp->mmsg(MANDOCERR_BADCHAR, curp->arg, + mandoc_msg(MANDOCERR_BADCHAR, curp, curp->line, pos, "ignoring byte"); i++; continue; @@ -282,7 +291,7 @@ rerun: if (REPARSE_LIMIT >= ++curp->reparse_count) mparse_buf_r(curp, ln, 0); else - curp->mmsg(MANDOCERR_ROFFLOOP, curp->arg, + mandoc_msg(MANDOCERR_ROFFLOOP, curp, curp->line, pos, NULL); pos = 0; continue; @@ -491,7 +500,7 @@ mparse_end(struct mparse *curp) } #if 0 - /* NOTE a parser may not have been assigned, yet. */ + /* FIXME: NOTE a parser may not have been assigned, yet. */ if ( ! (curp->man || curp->mdoc)) { /* FIXME: make into an mandoc.h error. */ @@ -521,8 +530,8 @@ mparse_readfd_r(struct mparse *curp, int return; } - svfile = curp->svfile; - curp->svfile = file; + svfile = curp->file; + curp->file = file; pdesc(curp, file, fd); @@ -532,8 +541,8 @@ mparse_readfd_r(struct mparse *curp, int if (STDIN_FILENO != fd && -1 == close(fd)) perror(file); - (*curp->evt_close)(curp->arg, svfile); - curp->svfile = svfile; + (*curp->evt_close)(curp->arg, file); + curp->file = svfile; } enum mandoclevel @@ -544,29 +553,22 @@ mparse_readfd(struct mparse *curp, int f return(curp->file_status); } -void -mparse_setstatus(struct mparse *curp, enum mandoclevel lvl) -{ - - if (curp->file_status < lvl) - curp->file_status = lvl; -} - struct mparse * mparse_alloc(enum mparset inttype, mevt_open eopen, - mevt_close eclose, mandocmsg mmsg, void *arg) + mevt_close eclose, enum mandoclevel wlevel, mandocmsg mmsg, void *arg) { struct mparse *curp; curp = mandoc_calloc(1, sizeof(struct mparse)); + curp->wlevel = wlevel; curp->mmsg = mmsg; curp->arg = arg; curp->inttype = inttype; curp->evt_open = eopen; curp->evt_close = eclose; - curp->roff = roff_alloc(&curp->regs, arg, mmsg); + curp->roff = roff_alloc(&curp->regs, curp); return(curp); } @@ -608,4 +610,37 @@ mparse_result(struct mparse *curp, struc *mdoc = curp->mdoc; *man = curp->man; +} + +void +mandoc_vmsg(enum mandocerr t, struct mparse *m, + int ln, int pos, const char *fmt, ...) +{ + char buf[256]; + va_list ap; + + va_start(ap, fmt); + vsnprintf(buf, sizeof(buf) - 1, fmt, ap); + va_end(ap); + + mandoc_msg(t, m, ln, pos, buf); +} + +void +mandoc_msg(enum mandocerr er, struct mparse *m, + int ln, int col, const char *msg) +{ + enum mandoclevel level; + + level = MANDOCLEVEL_FATAL; + while (er < mandoclimits[level]) + level--; + + if (level < m->wlevel) + return; + + (*m->mmsg)(er, level, m->file, ln, col, msg); + + if (m->file_status < level) + m->file_status = level; } Index: libmandoc.h =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/libmandoc.h,v retrieving revision 1.12 retrieving revision 1.13 diff -Llibmandoc.h -Llibmandoc.h -u -p -r1.12 -r1.13 --- libmandoc.h +++ libmandoc.h @@ -19,12 +19,16 @@ __BEGIN_DECLS -int mandoc_special(char *); -char *mandoc_strdup(const char *); -char *mandoc_getarg(char **, mandocmsg, void *, int, int *); -char *mandoc_normdate(char *, mandocmsg, void *, int, int); -int mandoc_eos(const char *, size_t, int); -int mandoc_hyph(const char *, const char *); +void mandoc_msg(enum mandocerr, struct mparse *, + int, int, const char *); +void mandoc_vmsg(enum mandocerr, struct mparse *, + int, int, const char *, ...); +int mandoc_special(char *); +char *mandoc_strdup(const char *); +char *mandoc_getarg(struct mparse *, char **, int, int *); +char *mandoc_normdate(struct mparse *, char *, int, int); +int mandoc_eos(const char *, size_t, int); +int mandoc_hyph(const char *, const char *); __END_DECLS Index: man_macro.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/man_macro.c,v retrieving revision 1.56 retrieving revision 1.57 diff -Lman_macro.c -Lman_macro.c -u -p -r1.56 -r1.57 --- man_macro.c +++ man_macro.c @@ -24,6 +24,7 @@ #include #include "mandoc.h" +#include "libmandoc.h" #include "libman.h" enum rew { -- To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv