aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/roff.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2010-08-20 01:02:07 +0000
committerIngo Schwarze <schwarze@openbsd.org>2010-08-20 01:02:07 +0000
commita1567e8417f169edf6c71532dc11bfa763ac444b (patch)
tree9acbfb9862a556c0d41f4af58c78fafc856128c1 /roff.c
parent6f04dff21d0fded19bbcaefed07c6e35138b590f (diff)
downloadmandoc-a1567e8417f169edf6c71532dc11bfa763ac444b.tar.gz
mandoc-a1567e8417f169edf6c71532dc11bfa763ac444b.tar.zst
mandoc-a1567e8417f169edf6c71532dc11bfa763ac444b.zip
Implement a simple, consistent user interface for error handling.
We now have sufficient practical experience to know what we want, so this is intended to be final: - provide -Wlevel (warning, error or fatal) to select what you care about - provide -Wstop to stop after parsing a file with warnings you care about - provide consistent exit status codes for those warnings you care about - fully document what warnings, errors and fatal errors mean - remove all other cruft from the user interface, less is more: - remove all -f knobs along with the whole -f option - remove the old -Werror because calling warnings "fatal" is silly - always finish parsing each file, unless fatal errors prevent that This commit also includes a couple of related simplifications behind the scenes regarding error handling. Feedback and OK kristaps@; Joerg Sonnenberger (NetBSD) and Sascha Wildner (DragonFly BSD) agree with the general direction.
Diffstat (limited to 'roff.c')
-rw-r--r--roff.c34
1 files changed, 9 insertions, 25 deletions
diff --git a/roff.c b/roff.c
index c21cc025..cb962277 100644
--- a/roff.c
+++ b/roff.c
@@ -1,4 +1,4 @@
-/* $Id: roff.c,v 1.97 2010/07/27 19:56:50 kristaps Exp $ */
+/* $Id: roff.c,v 1.98 2010/08/20 01:02:07 schwarze Exp $ */
/*
* Copyright (c) 2010 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
@@ -168,7 +168,7 @@ static void roff_free1(struct roff *);
static enum rofft roff_hash_find(const char *);
static void roff_hash_init(void);
static void roffnode_cleanscope(struct roff *);
-static int roffnode_push(struct roff *,
+static void roffnode_push(struct roff *,
enum rofft, int, int);
static void roffnode_pop(struct roff *);
static enum rofft roff_parse(const char *, int *);
@@ -258,16 +258,12 @@ roffnode_pop(struct roff *r)
* Push a roff node onto the instruction stack. This must later be
* removed with roffnode_pop().
*/
-static int
+static void
roffnode_push(struct roff *r, enum rofft tok, int line, int col)
{
struct roffnode *p;
- if (NULL == (p = calloc(1, sizeof(struct roffnode)))) {
- (*r->msg)(MANDOCERR_MEM, r->data, line, col, NULL);
- return(0);
- }
-
+ p = mandoc_calloc(1, sizeof(struct roffnode));
p->tok = tok;
p->parent = r->last;
p->line = line;
@@ -275,7 +271,6 @@ roffnode_push(struct roff *r, enum rofft tok, int line, int col)
p->rule = p->parent ? p->parent->rule : ROFFRULE_DENY;
r->last = p;
- return(1);
}
@@ -307,15 +302,11 @@ roff_free(struct roff *r)
struct roff *
-roff_alloc(struct regset *regs, const mandocmsg msg, void *data)
+roff_alloc(struct regset *regs, void *data, const mandocmsg msg)
{
struct roff *r;
- if (NULL == (r = calloc(1, sizeof(struct roff)))) {
- (*msg)(MANDOCERR_MEM, data, 0, 0, NULL);
- return(0);
- }
-
+ r = mandoc_calloc(1, sizeof(struct roff));
r->regs = regs;
r->msg = msg;
r->data = data;
@@ -650,8 +641,7 @@ roff_block(ROFF_ARGS)
pos++;
}
- if ( ! roffnode_push(r, tok, ln, ppos))
- return(ROFF_ERR);
+ roffnode_push(r, tok, ln, ppos);
if ('\0' == (*bufp)[pos])
return(ROFF_IGN);
@@ -673,12 +663,7 @@ roff_block(ROFF_ARGS)
if (1 == sz && '.' == (*bufp)[sv])
return(ROFF_IGN);
- r->last->end = malloc(sz + 1);
-
- if (NULL == r->last->end) {
- (*r->msg)(MANDOCERR_MEM, r->data, ln, pos, NULL);
- return(ROFF_ERR);
- }
+ r->last->end = mandoc_malloc(sz + 1);
memcpy(r->last->end, *bufp + sv, sz);
r->last->end[(int)sz] = '\0';
@@ -905,8 +890,7 @@ roff_cond(ROFF_ARGS)
return(ROFF_ERR);
}
- if ( ! roffnode_push(r, tok, ln, ppos))
- return(ROFF_ERR);
+ roffnode_push(r, tok, ln, ppos);
r->last->rule = rule;