source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mdocml: Simplify by allowing only one post-handler.
@ 2014-08-02  0:02 schwarze
  0 siblings, 0 replies; only message in thread
From: schwarze @ 2014-08-02  0:02 UTC (permalink / raw)
  To: source

Log Message:
-----------
Simplify by allowing only one post-handler.
Saves 36 static arrays and 10 lines of code 
at the expense of only five new trivial static functions.
No functional change.

Modified Files:
--------------
    mdocml:
        mdoc_validate.c

Revision Data
-------------
Index: mdoc_validate.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_validate.c,v
retrieving revision 1.241
retrieving revision 1.242
diff -Lmdoc_validate.c -Lmdoc_validate.c -u -p -r1.241 -r1.242
--- mdoc_validate.c
+++ mdoc_validate.c
@@ -61,7 +61,7 @@ typedef	int	(*v_post)(POST_ARGS);
 
 struct	valids {
 	v_pre	 pre;
-	v_post	*post;
+	v_post	 post;
 };
 
 static	int	 check_count(struct mdoc *, enum mdoc_type,
@@ -87,12 +87,14 @@ static	int	 hwarn_ge1(POST_ARGS);
 static	int	 post_an(POST_ARGS);
 static	int	 post_at(POST_ARGS);
 static	int	 post_bf(POST_ARGS);
+static	int	 post_bk(POST_ARGS);
 static	int	 post_bl(POST_ARGS);
 static	int	 post_bl_block(POST_ARGS);
 static	int	 post_bl_block_width(POST_ARGS);
 static	int	 post_bl_block_tag(POST_ARGS);
 static	int	 post_bl_head(POST_ARGS);
 static	int	 post_bx(POST_ARGS);
+static	int	 post_d1(POST_ARGS);
 static	int	 post_defaults(POST_ARGS);
 static	int	 post_dd(POST_ARGS);
 static	int	 post_dt(POST_ARGS);
@@ -100,11 +102,14 @@ static	int	 post_en(POST_ARGS);
 static	int	 post_es(POST_ARGS);
 static	int	 post_eoln(POST_ARGS);
 static	int	 post_ex(POST_ARGS);
+static	int	 post_fo(POST_ARGS);
 static	int	 post_hyph(POST_ARGS);
+static	int	 post_hyphtext(POST_ARGS);
 static	int	 post_ignpar(POST_ARGS);
 static	int	 post_it(POST_ARGS);
 static	int	 post_lb(POST_ARGS);
 static	int	 post_literal(POST_ARGS);
+static	int	 post_nd(POST_ARGS);
 static	int	 post_nm(POST_ARGS);
 static	int	 post_ns(POST_ARGS);
 static	int	 post_os(POST_ARGS);
@@ -129,107 +134,70 @@ static	int	 pre_os(PRE_ARGS);
 static	int	 pre_par(PRE_ARGS);
 static	int	 pre_std(PRE_ARGS);
 
-static	v_post	 posts_an[] = { post_an, NULL };
-static	v_post	 posts_at[] = { post_at, post_defaults, NULL };
-static	v_post	 posts_bd[] = { post_literal, hwarn_eq0, bwarn_ge1, NULL };
-static	v_post	 posts_bf[] = { post_bf, NULL };
-static	v_post	 posts_bk[] = { hwarn_eq0, bwarn_ge1, NULL };
-static	v_post	 posts_bl[] = { bwarn_ge1, post_bl, NULL };
-static	v_post	 posts_bx[] = { post_bx, NULL };
-static	v_post	 posts_bool[] = { ebool, NULL };
-static	v_post	 posts_eoln[] = { post_eoln, NULL };
-static	v_post	 posts_defaults[] = { post_defaults, NULL };
-static	v_post	 posts_d1[] = { bwarn_ge1, post_hyph, NULL };
-static	v_post	 posts_dd[] = { post_dd, post_prol, NULL };
-static	v_post	 posts_dl[] = { post_literal, bwarn_ge1, NULL };
-static	v_post	 posts_dt[] = { post_dt, post_prol, NULL };
-static	v_post	 posts_en[] = { post_en, NULL };
-static	v_post	 posts_es[] = { post_es, NULL };
-static	v_post	 posts_ex[] = { post_ex, NULL };
-static	v_post	 posts_fo[] = { hwarn_eq1, bwarn_ge1, NULL };
-static	v_post	 posts_hyph[] = { post_hyph, NULL };
-static	v_post	 posts_hyphtext[] = { ewarn_ge1, post_hyph, NULL };
-static	v_post	 posts_it[] = { post_it, NULL };
-static	v_post	 posts_lb[] = { post_lb, NULL };
-static	v_post	 posts_nd[] = { berr_ge1, post_hyph, NULL };
-static	v_post	 posts_nm[] = { post_nm, NULL };
-static	v_post	 posts_notext[] = { ewarn_eq0, NULL };
-static	v_post	 posts_ns[] = { post_ns, NULL };
-static	v_post	 posts_os[] = { post_os, post_prol, NULL };
-static	v_post	 posts_pp[] = { post_par, ewarn_eq0, NULL };
-static	v_post	 posts_rs[] = { post_rs, NULL };
-static	v_post	 posts_sh[] = { post_ignpar,hwarn_ge1,post_sh,post_hyph,NULL };
-static	v_post	 posts_sp[] = { post_par, ewarn_le1, NULL };
-static	v_post	 posts_ss[] = { post_ignpar, hwarn_ge1, post_hyph, NULL };
-static	v_post	 posts_st[] = { post_st, NULL };
-static	v_post	 posts_text[] = { ewarn_ge1, NULL };
-static	v_post	 posts_text1[] = { ewarn_eq1, NULL };
-static	v_post	 posts_vt[] = { post_vt, NULL };
-
 static	const struct valids mdoc_valids[MDOC_MAX] = {
 	{ NULL, NULL },				/* Ap */
-	{ pre_dd, posts_dd },			/* Dd */
-	{ pre_dt, posts_dt },			/* Dt */
-	{ pre_os, posts_os },			/* Os */
-	{ NULL, posts_sh },			/* Sh */
-	{ NULL, posts_ss },			/* Ss */
-	{ pre_par, posts_pp },			/* Pp */
-	{ pre_display, posts_d1 },		/* D1 */
-	{ pre_literal, posts_dl },		/* Dl */
-	{ pre_bd, posts_bd },			/* Bd */
+	{ pre_dd, post_dd },			/* Dd */
+	{ pre_dt, post_dt },			/* Dt */
+	{ pre_os, post_os },			/* Os */
+	{ NULL, post_sh },			/* Sh */
+	{ NULL, post_ignpar },			/* Ss */
+	{ pre_par, post_par },			/* Pp */
+	{ pre_display, post_d1 },		/* D1 */
+	{ pre_literal, post_literal },		/* Dl */
+	{ pre_bd, post_literal },		/* Bd */
 	{ NULL, NULL },				/* Ed */
-	{ pre_bl, posts_bl },			/* Bl */
+	{ pre_bl, post_bl },			/* Bl */
 	{ NULL, NULL },				/* El */
-	{ pre_par, posts_it },			/* It */
+	{ pre_par, post_it },			/* It */
 	{ NULL, NULL },				/* Ad */
-	{ pre_an, posts_an },			/* An */
-	{ NULL, posts_defaults },		/* Ar */
+	{ pre_an, post_an },			/* An */
+	{ NULL, post_defaults },		/* Ar */
 	{ NULL, NULL },				/* Cd */
 	{ NULL, NULL },				/* Cm */
 	{ NULL, NULL },				/* Dv */
 	{ NULL, NULL },				/* Er */
 	{ NULL, NULL },				/* Ev */
-	{ pre_std, posts_ex },			/* Ex */
+	{ pre_std, post_ex },			/* Ex */
 	{ NULL, NULL },				/* Fa */
-	{ NULL, posts_text },			/* Fd */
+	{ NULL, ewarn_ge1 },			/* Fd */
 	{ NULL, NULL },				/* Fl */
 	{ NULL, NULL },				/* Fn */
 	{ NULL, NULL },				/* Ft */
 	{ NULL, NULL },				/* Ic */
-	{ NULL, posts_text1 },			/* In */
-	{ NULL, posts_defaults },		/* Li */
-	{ NULL, posts_nd },			/* Nd */
-	{ NULL, posts_nm },			/* Nm */
+	{ NULL, ewarn_eq1 },			/* In */
+	{ NULL, post_defaults },		/* Li */
+	{ NULL, post_nd },			/* Nd */
+	{ NULL, post_nm },			/* Nm */
 	{ NULL, NULL },				/* Op */
 	{ pre_obsolete, NULL },			/* Ot */
-	{ NULL, posts_defaults },		/* Pa */
+	{ NULL, post_defaults },		/* Pa */
 	{ pre_std, NULL },			/* Rv */
-	{ NULL, posts_st },			/* St */
+	{ NULL, post_st },			/* St */
 	{ NULL, NULL },				/* Va */
-	{ NULL, posts_vt },			/* Vt */
-	{ NULL, posts_text },			/* Xr */
-	{ NULL, posts_text },			/* %A */
-	{ NULL, posts_hyphtext },		/* %B */ /* FIXME: can be used outside Rs/Re. */
-	{ NULL, posts_text },			/* %D */
-	{ NULL, posts_text },			/* %I */
-	{ NULL, posts_text },			/* %J */
-	{ NULL, posts_hyphtext },		/* %N */
-	{ NULL, posts_hyphtext },		/* %O */
-	{ NULL, posts_text },			/* %P */
-	{ NULL, posts_hyphtext },		/* %R */
-	{ NULL, posts_hyphtext },		/* %T */ /* FIXME: can be used outside Rs/Re. */
-	{ NULL, posts_text },			/* %V */
+	{ NULL, post_vt },			/* Vt */
+	{ NULL, ewarn_ge1 },			/* Xr */
+	{ NULL, ewarn_ge1 },			/* %A */
+	{ NULL, post_hyphtext },		/* %B */ /* FIXME: can be used outside Rs/Re. */
+	{ NULL, ewarn_ge1 },			/* %D */
+	{ NULL, ewarn_ge1 },			/* %I */
+	{ NULL, ewarn_ge1 },			/* %J */
+	{ NULL, post_hyphtext },		/* %N */
+	{ NULL, post_hyphtext },		/* %O */
+	{ NULL, ewarn_ge1 },			/* %P */
+	{ NULL, post_hyphtext },		/* %R */
+	{ NULL, post_hyphtext },		/* %T */ /* FIXME: can be used outside Rs/Re. */
+	{ NULL, ewarn_ge1 },			/* %V */
 	{ NULL, NULL },				/* Ac */
 	{ NULL, NULL },				/* Ao */
 	{ NULL, NULL },				/* Aq */
-	{ NULL, posts_at },			/* At */
+	{ NULL, post_at },			/* At */
 	{ NULL, NULL },				/* Bc */
-	{ NULL, posts_bf },			/* Bf */
+	{ NULL, post_bf },			/* Bf */
 	{ NULL, NULL },				/* Bo */
 	{ NULL, NULL },				/* Bq */
 	{ NULL, NULL },				/* Bsx */
-	{ NULL, posts_bx },			/* Bx */
-	{ NULL, posts_bool },			/* Db */
+	{ NULL, post_bx },			/* Bx */
+	{ NULL, ebool },			/* Db */
 	{ NULL, NULL },				/* Dc */
 	{ NULL, NULL },				/* Do */
 	{ NULL, NULL },				/* Dq */
@@ -239,12 +207,12 @@ static	const struct valids mdoc_valids[M
 	{ NULL, NULL },				/* Eo */
 	{ NULL, NULL },				/* Fx */
 	{ NULL, NULL },				/* Ms */
-	{ NULL, posts_notext },			/* No */
-	{ NULL, posts_ns },			/* Ns */
+	{ NULL, ewarn_eq0 },			/* No */
+	{ NULL, post_ns },			/* Ns */
 	{ NULL, NULL },				/* Nx */
 	{ NULL, NULL },				/* Ox */
 	{ NULL, NULL },				/* Pc */
-	{ NULL, posts_text1 },			/* Pf */
+	{ NULL, ewarn_eq1 },			/* Pf */
 	{ NULL, NULL },				/* Po */
 	{ NULL, NULL },				/* Pq */
 	{ NULL, NULL },				/* Qc */
@@ -252,42 +220,42 @@ static	const struct valids mdoc_valids[M
 	{ NULL, NULL },				/* Qo */
 	{ NULL, NULL },				/* Qq */
 	{ NULL, NULL },				/* Re */
-	{ NULL, posts_rs },			/* Rs */
+	{ NULL, post_rs },			/* Rs */
 	{ NULL, NULL },				/* Sc */
 	{ NULL, NULL },				/* So */
 	{ NULL, NULL },				/* Sq */
-	{ NULL, posts_bool },			/* Sm */
-	{ NULL, posts_hyph },			/* Sx */
+	{ NULL, ebool },			/* Sm */
+	{ NULL, post_hyph },			/* Sx */
 	{ NULL, NULL },				/* Sy */
 	{ NULL, NULL },				/* Tn */
 	{ NULL, NULL },				/* Ux */
 	{ NULL, NULL },				/* Xc */
 	{ NULL, NULL },				/* Xo */
-	{ NULL, posts_fo },			/* Fo */
+	{ NULL, post_fo },			/* Fo */
 	{ NULL, NULL },				/* Fc */
 	{ NULL, NULL },				/* Oo */
 	{ NULL, NULL },				/* Oc */
-	{ NULL, posts_bk },			/* Bk */
+	{ NULL, post_bk },			/* Bk */
 	{ NULL, NULL },				/* Ek */
-	{ NULL, posts_eoln },			/* Bt */
+	{ NULL, post_eoln },			/* Bt */
 	{ NULL, NULL },				/* Hf */
 	{ pre_obsolete, NULL },			/* Fr */
-	{ NULL, posts_eoln },			/* Ud */
-	{ NULL, posts_lb },			/* Lb */
-	{ pre_par, posts_pp },			/* Lp */
+	{ NULL, post_eoln },			/* Ud */
+	{ NULL, post_lb },			/* Lb */
+	{ pre_par, post_par },			/* Lp */
 	{ NULL, NULL },				/* Lk */
-	{ NULL, posts_defaults },		/* Mt */
+	{ NULL, post_defaults },		/* Mt */
 	{ NULL, NULL },				/* Brq */
 	{ NULL, NULL },				/* Bro */
 	{ NULL, NULL },				/* Brc */
-	{ NULL, posts_text },			/* %C */
-	{ pre_obsolete, posts_es },		/* Es */
-	{ pre_obsolete, posts_en },		/* En */
+	{ NULL, ewarn_ge1 },			/* %C */
+	{ pre_obsolete, post_es },		/* Es */
+	{ pre_obsolete, post_en },		/* En */
 	{ NULL, NULL },				/* Dx */
-	{ NULL, posts_text },			/* %Q */
-	{ NULL, posts_pp },			/* br */
-	{ NULL, posts_sp },			/* sp */
-	{ NULL, posts_text1 },			/* %U */
+	{ NULL, ewarn_ge1 },			/* %Q */
+	{ NULL, post_par },			/* br */
+	{ NULL, post_par },			/* sp */
+	{ NULL, ewarn_eq1 },			/* %U */
 	{ NULL, NULL },				/* Ta */
 	{ NULL, NULL },				/* ll */
 };
@@ -365,13 +333,15 @@ mdoc_valid_pre(struct mdoc *mdoc, struct
 int
 mdoc_valid_post(struct mdoc *mdoc)
 {
-	v_post		*p;
+	struct mdoc_node *n;
+	v_post p;
 
-	if (MDOC_VALID & mdoc->last->flags)
+	n = mdoc->last;
+	if (n->flags & MDOC_VALID)
 		return(1);
-	mdoc->last->flags |= MDOC_VALID;
+	n->flags |= MDOC_VALID;
 
-	switch (mdoc->last->type) {
+	switch (n->type) {
 	case MDOC_TEXT:
 		/* FALLTHROUGH */
 	case MDOC_EQN:
@@ -381,16 +351,9 @@ mdoc_valid_post(struct mdoc *mdoc)
 	case MDOC_ROOT:
 		return(post_root(mdoc));
 	default:
-		break;
+		p = mdoc_valids[n->tok].post;
+		return(*p ? (*p)(mdoc) : 1);
 	}
-
-	if (NULL == mdoc_valids[mdoc->last->tok].post)
-		return(1);
-	for (p = mdoc_valids[mdoc->last->tok].post; *p; p++)
-		if ( ! (*p)(mdoc))
-			return(0);
-
-	return(1);
 }
 
 static int
@@ -1037,6 +1000,15 @@ post_eoln(POST_ARGS)
 }
 
 static int
+post_fo(POST_ARGS)
+{
+
+	hwarn_eq1(mdoc);
+	bwarn_ge1(mdoc);
+	return(1);
+}
+
+static int
 post_vt(POST_ARGS)
 {
 	const struct mdoc_node *n;
@@ -1076,9 +1048,29 @@ post_nm(POST_ARGS)
 }
 
 static int
+post_nd(POST_ARGS)
+{
+
+	berr_ge1(mdoc);
+	return(post_hyph(mdoc));
+}
+
+static int
+post_d1(POST_ARGS)
+{
+
+	bwarn_ge1(mdoc);
+	return(post_hyph(mdoc));
+}
+
+static int
 post_literal(POST_ARGS)
 {
 
+	if (mdoc->last->tok == MDOC_Bd)
+		hwarn_eq0(mdoc);
+	bwarn_ge1(mdoc);
+
 	/*
 	 * The `Dl' (note "el" not "one") and `Bd' macros unset the
 	 * MDOC_LITERAL flag as they leave.  Note that `Bd' only sets
@@ -1116,12 +1108,6 @@ post_defaults(POST_ARGS)
 		if ( ! mdoc_word_alloc(mdoc, nn->line, nn->pos, "..."))
 			return(0);
 		break;
-	case MDOC_At:
-		if ( ! mdoc_word_alloc(mdoc, nn->line, nn->pos, "AT&T"))
-			return(0);
-		if ( ! mdoc_word_alloc(mdoc, nn->line, nn->pos, "UNIX"))
-			return(0);
-		break;
 	case MDOC_Li:
 		if ( ! mdoc_word_alloc(mdoc, nn->line, nn->pos, ""))
 			return(0);
@@ -1148,15 +1134,22 @@ post_at(POST_ARGS)
 	const char		*std_att;
 	char			*att;
 
+	n = mdoc->last;
+	if (n->child == NULL) {
+		mdoc->next = MDOC_NEXT_CHILD;
+		if ( ! mdoc_word_alloc(mdoc, n->line, n->pos, "AT&T UNIX"))
+			return(0);
+		mdoc->last = n;
+		return(1);
+	}
+
 	/*
 	 * If we have a child, look it up in the standard keys.  If a
 	 * key exist, use that instead of the child; if it doesn't,
 	 * prefix "AT&T UNIX " to the existing data.
 	 */
 
-	if (NULL == (n = mdoc->last->child))
-		return(1);
-
+	n = n->child;
 	assert(MDOC_TEXT == n->type);
 	if (NULL == (std_att = mdoc_a2att(n->string))) {
 		mandoc_vmsg(MANDOCERR_AT_BAD, mdoc->parse,
@@ -1524,6 +1517,8 @@ post_bl(POST_ARGS)
 		return(1);
 	}
 
+	bwarn_ge1(mdoc);
+
 	nchild = nbody->child;
 	while (NULL != nchild) {
 		if (MDOC_It == nchild->tok || MDOC_Sm == nchild->tok) {
@@ -1581,6 +1576,15 @@ post_bl(POST_ARGS)
 }
 
 static int
+post_bk(POST_ARGS)
+{
+
+	hwarn_eq0(mdoc);
+	bwarn_ge1(mdoc);
+	return(1);
+}
+
+static int
 ebool(struct mdoc *mdoc)
 {
 	struct mdoc_node	*nch;
@@ -1821,6 +1825,14 @@ post_hyph(POST_ARGS)
 }
 
 static int
+post_hyphtext(POST_ARGS)
+{
+
+	ewarn_ge1(mdoc);
+	return(post_hyph(mdoc));
+}
+
+static int
 post_ns(POST_ARGS)
 {
 
@@ -1834,6 +1846,8 @@ static int
 post_sh(POST_ARGS)
 {
 
+	post_ignpar(mdoc);
+
 	if (MDOC_HEAD == mdoc->last->type)
 		return(post_sh_head(mdoc));
 	if (MDOC_BODY == mdoc->last->type)
@@ -2004,6 +2018,9 @@ post_ignpar(POST_ARGS)
 {
 	struct mdoc_node *np;
 
+	hwarn_ge1(mdoc);
+	post_hyph(mdoc);
+
 	if (MDOC_BODY != mdoc->last->type)
 		return(1);
 
@@ -2066,6 +2083,11 @@ post_par(POST_ARGS)
 {
 	struct mdoc_node *np;
 
+	if (mdoc->last->tok == MDOC_sp)
+		ewarn_le1(mdoc);
+	else
+		ewarn_eq0(mdoc);
+
 	if (MDOC_ELEM != mdoc->last->type &&
 	    MDOC_BLOCK != mdoc->last->type)
 		return(1);
@@ -2134,7 +2156,7 @@ post_dd(POST_ARGS)
 	if (NULL == n->child || '\0' == n->child->string[0]) {
 		mdoc->meta.date = mdoc->quick ? mandoc_strdup("") :
 		    mandoc_normdate(mdoc->parse, NULL, n->line, n->pos);
-		return(1);
+		return(post_prol(mdoc));
 	}
 
 	datestr = NULL;
@@ -2146,7 +2168,7 @@ post_dd(POST_ARGS)
 		    datestr, n->line, n->pos);
 		free(datestr);
 	}
-	return(1);
+	return(post_prol(mdoc));
 }
 
 static int
@@ -2190,7 +2212,7 @@ post_dt(POST_ARGS)
 		mdoc->meta.title = mandoc_strdup("UNKNOWN");
 		mdoc->meta.vol = mandoc_strdup("LOCAL");
 		mdoc->meta.msec = mandoc_strdup("1");
-		return(1);
+		return(post_prol(mdoc));
 	}
 
 	/* Handles: `.Dt TITLE'
@@ -2205,7 +2227,7 @@ post_dt(POST_ARGS)
 		/* XXX: make this a macro value. */
 		mdoc->meta.vol = mandoc_strdup("LOCAL");
 		mdoc->meta.msec = mandoc_strdup("1");
-		return(1);
+		return(post_prol(mdoc));
 	}
 
 	/* Handles: `.Dt TITLE SEC'
@@ -2227,7 +2249,7 @@ post_dt(POST_ARGS)
 	}
 
 	if (NULL == (nn = nn->next))
-		return(1);
+		return(post_prol(mdoc));
 
 	/* Handles: `.Dt TITLE SEC VOL'
 	 * title = TITLE,
@@ -2254,7 +2276,7 @@ post_dt(POST_ARGS)
 	/* Ignore any subsequent parameters... */
 	/* FIXME: warn about subsequent parameters. */
 
-	return(1);
+	return(post_prol(mdoc));
 }
 
 static int
@@ -2315,11 +2337,11 @@ post_os(POST_ARGS)
 	mdoc->meta.os = NULL;
 	mdoc_deroff(&mdoc->meta.os, n);
 	if (mdoc->meta.os)
-		return(1);
+		return(post_prol(mdoc));
 
 	if (mdoc->defos) {
 		mdoc->meta.os = mandoc_strdup(mdoc->defos);
-		return(1);
+		return(post_prol(mdoc));
 	}
 
 #ifdef OSNAME
@@ -2336,7 +2358,7 @@ post_os(POST_ARGS)
 	}
 	mdoc->meta.os = mandoc_strdup(defbuf);
 #endif /*!OSNAME*/
-	return(1);
+	return(post_prol(mdoc));
 }
 
 /*
--
 To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2014-08-02  0:02 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-08-02  0:02 mdocml: Simplify by allowing only one post-handler schwarze

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).