+static int
+post_bf(struct mdoc *mdoc)
+{
+ char *p;
+ struct mdoc_node *head;
+
+ if (MDOC_BLOCK != mdoc->last->type)
+ return(1);
+ assert(MDOC_Bf == mdoc->last->tok);
+ head = mdoc->last->data.block.head;
+ assert(head);
+
+ if (0 == mdoc->last->data.block.argc) {
+ if (head->child) {
+ assert(MDOC_TEXT == head->child->type);
+ p = head->child->data.text.string;
+ if (xstrcmp(p, "Em"))
+ return(1);
+ else if (xstrcmp(p, "Li"))
+ return(1);
+ else if (xstrcmp(p, "Sm"))
+ return(1);
+ return(mdoc_nerr(mdoc, head->child, "invalid font mode"));
+ }
+ return(mdoc_err(mdoc, "macro expects an argument or parameter"));
+ }
+ if (head->child)
+ return(mdoc_err(mdoc, "macro expects an argument or parameter"));
+ if (1 == mdoc->last->data.block.argc)
+ return(1);
+ return(mdoc_err(mdoc, "macro expects an argument or parameter"));
+}
+
+
+static int
+post_nm(struct mdoc *mdoc)
+{
+
+ assert(MDOC_ELEM == mdoc->last->type);
+ assert(MDOC_Nm == mdoc->last->tok);
+ if (mdoc->last->child)
+ return(1);
+ if (mdoc->meta.name)
+ return(1);
+ return(mdoc_err(mdoc, "macro `%s' has not been invoked with a name",
+ mdoc_macronames[MDOC_Nm]));
+}
+
+
+static int
+post_xr(struct mdoc *mdoc)
+{
+ struct mdoc_node *n;
+
+ assert(MDOC_ELEM == mdoc->last->type);
+ assert(MDOC_Xr == mdoc->last->tok);
+ assert(mdoc->last->child);
+ assert(MDOC_TEXT == mdoc->last->child->type);
+
+ if (NULL == (n = mdoc->last->child->next))
+ return(1);
+ assert(MDOC_TEXT == n->type);
+ if (MSEC_DEFAULT != mdoc_atomsec(n->data.text.string))
+ return(1);
+ return(mdoc_nerr(mdoc, n, "invalid manual section"));
+}
+
+
+static int
+post_at(struct mdoc *mdoc)
+{
+
+ assert(MDOC_ELEM == mdoc->last->type);
+ assert(MDOC_At == mdoc->last->tok);
+
+ if (NULL == mdoc->last->child)
+ return(1);
+ assert(MDOC_TEXT == mdoc->last->child->type);
+
+ if (ATT_DEFAULT != mdoc_atoatt(mdoc->last->child->data.text.string))
+ return(1);
+ return(mdoc_err(mdoc, "macro expects a valid AT&T version symbol"));
+}
+
+
+static int
+post_an(struct mdoc *mdoc)
+{
+
+ assert(MDOC_ELEM == mdoc->last->type);
+ assert(MDOC_An == mdoc->last->tok);
+
+ if (0 != mdoc->last->data.elem.argc) {
+ if (NULL == mdoc->last->child)
+ return(1);
+ return(mdoc_err(mdoc, "macro expects either argument or parameters"));
+ }
+
+ if (mdoc->last->child)
+ return(1);
+ return(mdoc_err(mdoc, "macro expects either argument or parameters"));
+}
+
+
+static int
+post_ex(struct mdoc *mdoc)
+{
+
+ assert(MDOC_ELEM == mdoc->last->type);
+ assert(MDOC_Ex == mdoc->last->tok);
+
+ if (0 == mdoc->last->data.elem.argc) {
+ if (mdoc->last->child)
+ return(1);
+ return(mdoc_err(mdoc, "macro expects `%s' or a single child",
+ mdoc_argnames[MDOC_Std]));
+ }
+ if (mdoc->last->child)
+ return(mdoc_err(mdoc, "macro expects `%s' or a single child",
+ mdoc_argnames[MDOC_Std]));
+ if (1 != mdoc->last->data.elem.argc)
+ return(mdoc_err(mdoc, "macro expects `%s' or a single child",
+ mdoc_argnames[MDOC_Std]));
+ if (MDOC_Std != mdoc->last->data.elem.argv[0].arg)
+ return(mdoc_err(mdoc, "macro expects `%s' or a single child",
+ mdoc_argnames[MDOC_Std]));
+ return(1);
+}
+
+