=================================================================== RCS file: /cvs/mandoc/Attic/mlg.c,v retrieving revision 1.20 retrieving revision 1.22 diff -u -p -r1.20 -r1.22 --- mandoc/Attic/mlg.c 2008/12/07 22:40:18 1.20 +++ mandoc/Attic/mlg.c 2008/12/08 16:29:57 1.22 @@ -1,4 +1,4 @@ -/* $Id: mlg.c,v 1.20 2008/12/07 22:40:18 kristaps Exp $ */ +/* $Id: mlg.c,v 1.22 2008/12/08 16:29:57 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -64,7 +64,7 @@ static void mlg_roffmsg(void *arg, const char *, const char *); static int mlg_roffhead(void *, const struct tm *, const char *, const char *, - const char *, const char *); + enum roffmsec, const char *); static int mlg_rofftail(void *); static int mlg_roffin(void *, int, int *, const char **); @@ -362,10 +362,10 @@ mlg_exit(struct md_mlg *p, int flush) int c; c = roff_free(p->tree, flush); - free(p); - (*p->cbs.ml_free)(p->data); + free(p); + return(c); } @@ -415,7 +415,7 @@ mlg_alloc(const struct md_args *args, static int mlg_roffhead(void *arg, const struct tm *tm, const char *os, - const char *title, const char *sec, const char *vol) + const char *title, enum roffmsec sec, const char *vol) { struct md_mlg *p; @@ -462,6 +462,8 @@ mlg_literal_special(struct md_mlg *p, int tok, const c if ( ! mlg_begintag(p, MD_NS_INLINE, tok, NULL, more)) return(0); + /* FIXME: must be ml-filtered. */ + lit = ml_literal(tok, argc, argv, more); assert(lit); @@ -510,12 +512,13 @@ mlg_formatted_special(struct md_mlg *p, int tok, { char buf[256], *lit; - /* FIXME: *more must be ml-filtered. */ - if ( ! mlg_begintag(p, MD_NS_INLINE, tok, NULL, more)) return(0); + /* FIXME: must be ml-filtered. */ + lit = ml_literal(tok, argc, argv, more); + assert(lit); assert(*more); (void)snprintf(buf, sizeof(buf), lit, *more++); @@ -540,7 +543,7 @@ mlg_atom_special(struct md_mlg *p, int tok, if ( ! mlg_string(p, start, *more++)) return(0); - assert(NULL == *more); + /*assert(NULL == *more);*/ /* FIXME: ROFF_Sx */ return(mlg_endtag(p, MD_NS_INLINE, tok)); } @@ -787,6 +790,8 @@ mlg_msg(struct md_mlg *p, enum roffmsg lvl, const char *buf, const char *pos, const char *msg) { char *level; + char b[256]; + int i; switch (lvl) { case (ROFF_WARN): @@ -800,12 +805,31 @@ mlg_msg(struct md_mlg *p, enum roffmsg lvl, default: abort(); } - - if (pos) - (void)fprintf(stderr, "%s:%zu: %s: %s (column %zu)\n", - p->rbuf->name, p->rbuf->line, level, - msg, pos - buf); - else - (void)fprintf(stderr, "%s: %s: %s\n", + + if (pos) { + assert(pos >= buf); + if (0 < p->args->verbosity) { + (void)snprintf(b, sizeof(b), + "%s:%zu: %s: %s\n", + p->rbuf->name, p->rbuf->line, + level, msg); + (void)strlcat(b, "Error at: ", sizeof(b)); + (void)strlcat(b, p->rbuf->linebuf, sizeof(b)); + + (void)strlcat(b, "\n ", sizeof(b)); + for (i = 0; i < pos - buf; i++) + (void)strlcat(b, " ", sizeof(b)); + (void)strlcat(b, "^", sizeof(b)); + + } else + (void)snprintf(b, sizeof(b), + "%s:%zu: %s: %s (col %zu)", + p->rbuf->name, p->rbuf->line, + level, msg, pos - buf); + } else + (void)snprintf(b, sizeof(b), "%s: %s: %s", p->rbuf->name, level, msg); + + (void)fprintf(stderr, "%s\n", b); } +