371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov/* $Id: mdoc_validate.c,v 1.301 2016/01/08 17:48:09 schwarze Exp $ */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore/*
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * Copyright (c) 2010-2016 Ingo Schwarze <schwarze@openbsd.org>
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov * Copyright (c) 2010 Joerg Sonnenberger <joerg@netbsd.org>
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore *
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * Permission to use, copy, modify, and distribute this software for any
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * purpose with or without fee is hereby granted, provided that the above
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * copyright notice and this permission notice appear in all copies.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore *
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore#include "config.h"
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov#include <sys/types.h>
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore#ifndef OSNAME
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore#include <sys/utsname.h>
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore#endif
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore#include <assert.h>
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore#include <ctype.h>
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore#include <limits.h>
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore#include <stdio.h>
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore#include <stdlib.h>
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore#include <string.h>
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore#include <time.h>
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov#include "mandoc_aux.h"
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov#include "mandoc.h"
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov#include "roff.h"
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov#include "mdoc.h"
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore#include "libmandoc.h"
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov#include "roff_int.h"
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov#include "libmdoc.h"
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore/* FIXME: .Bl -diag can't have non-text children in HEAD. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov#define POST_ARGS struct roff_man *mdoc
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amoreenum check_ineq {
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore CHECK_LT,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore CHECK_GT,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore CHECK_EQ
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore};
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovtypedef void (*v_post)(POST_ARGS);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic void check_text(struct roff_man *, int, int, char *);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic void check_argv(struct roff_man *,
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *, struct mdoc_argv *);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic void check_args(struct roff_man *, struct roff_node *);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic int child_an(const struct roff_node *);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic size_t macro2len(int);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void rewrite_macro2len(char **);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_an(POST_ARGS);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic void post_an_norm(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_at(POST_ARGS);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic void post_bd(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_bf(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_bk(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_bl(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_bl_block(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_bl_block_tag(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_bl_head(POST_ARGS);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic void post_bl_norm(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_bx(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_defaults(POST_ARGS);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic void post_display(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_dd(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_dt(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_en(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_es(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_eoln(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_ex(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_fa(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_fn(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_fname(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_fo(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_hyph(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_ignpar(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_it(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_lb(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_nd(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_nm(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_ns(POST_ARGS);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic void post_obsolete(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_os(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_par(POST_ARGS);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic void post_prevpar(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_root(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_rs(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_sh(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_sh_head(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_sh_name(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_sh_see_also(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_sh_authors(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_sm(POST_ARGS);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void post_st(POST_ARGS);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic void post_std(POST_ARGS);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic v_post mdoc_valids[MDOC_MAX] = {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ap */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_dd, /* Dd */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_dt, /* Dt */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_os, /* Os */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_sh, /* Sh */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_ignpar, /* Ss */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_par, /* Pp */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_display, /* D1 */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_display, /* Dl */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_display, /* Bd */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ed */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_bl, /* Bl */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* El */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_it, /* It */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ad */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_an, /* An */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_defaults, /* Ar */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Cd */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Cm */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Dv */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Er */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ev */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_ex, /* Ex */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_fa, /* Fa */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Fd */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Fl */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_fn, /* Fn */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ft */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ic */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* In */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_defaults, /* Li */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_nd, /* Nd */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_nm, /* Nm */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Op */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_obsolete, /* Ot */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_defaults, /* Pa */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_std, /* Rv */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_st, /* St */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Va */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Vt */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Xr */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* %A */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_hyph, /* %B */ /* FIXME: can be used outside Rs/Re. */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* %D */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* %I */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* %J */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_hyph, /* %N */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_hyph, /* %O */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* %P */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_hyph, /* %R */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_hyph, /* %T */ /* FIXME: can be used outside Rs/Re. */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* %V */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ac */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ao */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Aq */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_at, /* At */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Bc */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_bf, /* Bf */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Bo */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Bq */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Bsx */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_bx, /* Bx */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_obsolete, /* Db */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Dc */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Do */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Dq */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ec */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ef */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Em */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Eo */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Fx */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ms */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* No */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_ns, /* Ns */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Nx */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ox */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Pc */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Pf */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Po */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Pq */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Qc */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ql */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Qo */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Qq */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Re */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_rs, /* Rs */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Sc */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* So */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Sq */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_sm, /* Sm */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_hyph, /* Sx */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Sy */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Tn */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ux */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Xc */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Xo */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_fo, /* Fo */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Fc */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Oo */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Oc */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_bk, /* Bk */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ek */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_eoln, /* Bt */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Hf */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_obsolete, /* Fr */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_eoln, /* Ud */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_lb, /* Lb */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_par, /* Lp */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Lk */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_defaults, /* Mt */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Brq */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Bro */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Brc */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* %C */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_es, /* Es */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_en, /* En */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Dx */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* %Q */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_par, /* br */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_par, /* sp */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* %U */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ta */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* ll */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore};
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore#define RSORD_MAX 14 /* Number of `Rs' blocks. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic const int rsord[RSORD_MAX] = {
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC__A,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC__T,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC__B,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC__I,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC__J,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC__R,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC__N,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC__V,
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore MDOC__U,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC__P,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC__Q,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore MDOC__C,
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore MDOC__D,
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore MDOC__O
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore};
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorestatic const char * const secnames[SEC__MAX] = {
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore NULL,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore "NAME",
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore "LIBRARY",
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore "SYNOPSIS",
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore "DESCRIPTION",
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov "CONTEXT",
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore "IMPLEMENTATION NOTES",
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore "RETURN VALUES",
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore "ENVIRONMENT",
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore "FILES",
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore "EXIT STATUS",
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore "EXAMPLES",
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore "DIAGNOSTICS",
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore "COMPATIBILITY",
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore "ERRORS",
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore "SEE ALSO",
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore "STANDARDS",
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore "HISTORY",
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore "AUTHORS",
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore "CAVEATS",
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore "BUGS",
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore "SECURITY CONSIDERATIONS",
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore NULL
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore};
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovvoid
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovmdoc_node_validate(struct roff_man *mdoc)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *n;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov v_post *p;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n = mdoc->last;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->last = mdoc->last->child;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov while (mdoc->last != NULL) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc_node_validate(mdoc);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (mdoc->last == n)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->last = mdoc->last->child;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov else
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->last = mdoc->last->next;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov }
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->last = n;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->next = ROFF_NEXT_SIBLING;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore switch (n->type) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov case ROFFT_TEXT:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (n->sec != SEC_SYNOPSIS || n->parent->tok != MDOC_Fd)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov check_text(mdoc, n->line, n->pos, n->string);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov case ROFFT_EQN:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov case ROFFT_TBL:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov case ROFFT_ROOT:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov post_root(mdoc);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore default:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov check_args(mdoc, mdoc->last);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /*
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov * Closing delimiters are not special at the
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov * beginning of a block, opening delimiters
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov * are not special at the end.
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (n->child != NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->child->flags &= ~MDOC_DELIMC;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (n->last != NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->last->flags &= ~MDOC_DELIMO;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* Call the macro's postprocessor. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov p = mdoc_valids + n->tok;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (*p)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov (*p)(mdoc);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (mdoc->last == n)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc_state(mdoc, n);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorestatic void
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovcheck_args(struct roff_man *mdoc, struct roff_node *n)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore int i;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if (NULL == n->args)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore return;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore assert(n->args->argc);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore for (i = 0; i < (int)n->args->argc; i++)
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore check_argv(mdoc, n, &n->args->argv[i]);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorestatic void
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovcheck_argv(struct roff_man *mdoc, struct roff_node *n, struct mdoc_argv *v)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore int i;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore for (i = 0; i < (int)v->sz; i++)
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore check_text(mdoc, v->line, v->pos, v->value[i]);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorestatic void
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovcheck_text(struct roff_man *mdoc, int ln, int pos, char *p)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore char *cp;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore if (MDOC_LITERAL & mdoc->flags)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore return;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore for (cp = p; NULL != (p = strchr(p, '\t')); p++)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_FI_TAB, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov ln, pos + (int)(p - cp), NULL);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovpost_bl_norm(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *n;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov struct mdoc_argv *argv, *wa;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov int i;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov enum mdocargt mdoclt;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore enum mdoc_list lt;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n = mdoc->last->parent;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n->norm->Bl.type = LIST__NONE;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /*
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * First figure out which kind of list to use: bind ourselves to
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * the first mentioned list type and warn about any remaining
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * ones. If we find no list type, we default to LIST_item.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov wa = (n->args == NULL) ? NULL : n->args->argv;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoclt = MDOC_ARG_MAX;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore for (i = 0; n->args && i < (int)n->args->argc; i++) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov argv = n->args->argv + i;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore lt = LIST__NONE;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov switch (argv->arg) {
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /* Set list types. */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Bullet:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore lt = LIST_bullet;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Dash:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore lt = LIST_dash;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Enum:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore lt = LIST_enum;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Hyphen:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore lt = LIST_hyphen;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Item:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore lt = LIST_item;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Tag:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore lt = LIST_tag;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Diag:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore lt = LIST_diag;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Hang:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore lt = LIST_hang;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Ohang:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore lt = LIST_ohang;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Inset:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore lt = LIST_inset;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Column:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore lt = LIST_column;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /* Set list arguments. */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Compact:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (n->norm->Bl.comp)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_ARG_REP,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, argv->line,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov argv->pos, "Bl -compact");
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->norm->Bl.comp = 1;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Width:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov wa = argv;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (0 == argv->sz) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_ARG_EMPTY,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, argv->line,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov argv->pos, "Bl -width");
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->norm->Bl.width = "0n";
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (NULL != n->norm->Bl.width)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_ARG_REP,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, argv->line,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov argv->pos, "Bl -width %s",
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov argv->value[0]);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov rewrite_macro2len(argv->value);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->norm->Bl.width = argv->value[0];
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Offset:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (0 == argv->sz) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_ARG_EMPTY,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, argv->line,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov argv->pos, "Bl -offset");
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (NULL != n->norm->Bl.offs)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_ARG_REP,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, argv->line,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov argv->pos, "Bl -offset %s",
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov argv->value[0]);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov rewrite_macro2len(argv->value);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->norm->Bl.offs = argv->value[0];
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore default:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore continue;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (LIST__NONE == lt)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov continue;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoclt = argv->arg;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /* Check: multiple list types. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (LIST__NONE != n->norm->Bl.type) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_BL_REP,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, n->line, n->pos,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov "Bl -%s", mdoc_argnames[argv->arg]);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov continue;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /* The list type should come first. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (n->norm->Bl.width ||
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->norm->Bl.offs ||
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->norm->Bl.comp)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_BL_LATETYPE,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, n->line, n->pos, "Bl -%s",
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc_argnames[n->args->argv[0].arg]);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->norm->Bl.type = lt;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (LIST_column == lt) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->norm->Bl.ncols = argv->sz;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->norm->Bl.cols = (void *)argv->value;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /* Allow lists to default to LIST_item. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if (LIST__NONE == n->norm->Bl.type) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_BL_NOTYPE, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->line, n->pos, "Bl");
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore n->norm->Bl.type = LIST_item;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /*
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * Validate the width field. Some list types don't need width
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * types and should be warned about them. Others should have it
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore * and must also be warned. Yet others have a default and need
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore * no warning.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore switch (n->norm->Bl.type) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case LIST_tag:
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore if (NULL == n->norm->Bl.width)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_BL_NOWIDTH, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->line, n->pos, "Bl -tag");
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case LIST_column:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case LIST_diag:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case LIST_ohang:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case LIST_inset:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case LIST_item:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if (n->norm->Bl.width)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_BL_SKIPW, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov wa->line, wa->pos, "Bl -%s",
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc_argnames[mdoclt]);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case LIST_bullet:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case LIST_dash:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case LIST_hyphen:
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore if (NULL == n->norm->Bl.width)
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore n->norm->Bl.width = "2n";
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case LIST_enum:
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore if (NULL == n->norm->Bl.width)
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore n->norm->Bl.width = "3n";
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore break;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore default:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovpost_bd(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *n;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov struct mdoc_argv *argv;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov int i;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov enum mdoc_disp dt;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n = mdoc->last;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore for (i = 0; n->args && i < (int)n->args->argc; i++) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov argv = n->args->argv + i;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore dt = DISP__NONE;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov switch (argv->arg) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Centred:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov dt = DISP_centered;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Ragged:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore dt = DISP_ragged;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Unfilled:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore dt = DISP_unfilled;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Filled:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore dt = DISP_filled;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Literal:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore dt = DISP_literal;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_File:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_BD_FILE, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->line, n->pos, NULL);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Offset:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (0 == argv->sz) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_ARG_EMPTY,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, argv->line,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov argv->pos, "Bd -offset");
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (NULL != n->norm->Bd.offs)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_ARG_REP,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, argv->line,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov argv->pos, "Bd -offset %s",
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov argv->value[0]);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov rewrite_macro2len(argv->value);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->norm->Bd.offs = argv->value[0];
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Compact:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (n->norm->Bd.comp)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_ARG_REP,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, argv->line,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov argv->pos, "Bd -compact");
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->norm->Bd.comp = 1;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore default:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore abort();
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (DISP__NONE == dt)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov continue;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (DISP__NONE == n->norm->Bd.type)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore n->norm->Bd.type = dt;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov else
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_BD_REP,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, n->line, n->pos,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov "Bd -%s", mdoc_argnames[argv->arg]);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if (DISP__NONE == n->norm->Bd.type) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_BD_NOTYPE, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->line, n->pos, "Bd");
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore n->norm->Bd.type = DISP_ragged;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovpost_an_norm(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *n;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov struct mdoc_argv *argv;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov size_t i;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n = mdoc->last;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (n->args == NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov for (i = 1; i < n->args->argc; i++) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov argv = n->args->argv + i;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_AN_REP,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, argv->line, argv->pos,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov "An -%s", mdoc_argnames[argv->arg]);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov }
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov argv = n->args->argv;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (argv->arg == MDOC_Split)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore n->norm->An.auth = AUTH_split;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov else if (argv->arg == MDOC_Nosplit)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore n->norm->An.auth = AUTH_nosplit;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore else
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore abort();
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovpost_std(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *n;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n = mdoc->last;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (n->args && n->args->argc == 1)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (n->args->argv[0].arg == MDOC_Std)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_ARG_STD, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->line, n->pos, mdoc_macronames[n->tok]);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovpost_obsolete(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *n;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n = mdoc->last;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (n->type == ROFFT_ELEM || n->type == ROFFT_BLOCK)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_MACRO_OBS, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->line, n->pos, mdoc_macronames[n->tok]);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorepost_bf(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *np, *nch;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /*
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * Unlike other data pointers, these are "housed" by the HEAD
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * element, which contains the goods.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore np = mdoc->last;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (np->type != ROFFT_HEAD)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov assert(np->parent->type == ROFFT_BLOCK);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov assert(np->parent->tok == MDOC_Bf);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* Check the number of arguments. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nch = np->child;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (np->parent->args == NULL) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (nch == NULL) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_BF_NOFONT, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov np->line, np->pos, "Bf");
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov }
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nch = nch->next;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (nch != NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_ARG_EXCESS, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nch->line, nch->pos, "Bf ... %s", nch->string);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /* Extract argument into data. */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (np->parent->args != NULL) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov switch (np->parent->args->argv[0].arg) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov case MDOC_Emphasis:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore np->norm->Bf.font = FONT_Em;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov break;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov case MDOC_Literal:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore np->norm->Bf.font = FONT_Li;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov break;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov case MDOC_Symbolic:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore np->norm->Bf.font = FONT_Sy;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov break;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov default:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore abort();
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov }
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /* Extract parameter into data. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if ( ! strcmp(np->child->string, "Em"))
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore np->norm->Bf.font = FONT_Em;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov else if ( ! strcmp(np->child->string, "Li"))
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore np->norm->Bf.font = FONT_Li;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov else if ( ! strcmp(np->child->string, "Sy"))
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore np->norm->Bf.font = FONT_Sy;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov else
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_BF_BADFONT, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov np->child->line, np->child->pos,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov "Bf %s", np->child->string);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorepost_lb(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *n;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov const char *stdlibname;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov char *libname;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n = mdoc->last->child;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov assert(n->type == ROFFT_TEXT);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (NULL == (stdlibname = mdoc_a2lib(n->string)))
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_asprintf(&libname,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov "library \\(Lq%s\\(Rq", n->string);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov else
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov libname = mandoc_strdup(stdlibname);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov free(n->string);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->string = libname;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovpost_eoln(POST_ARGS)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov const struct roff_node *n;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n = mdoc->last;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (n->child != NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_ARG_SKIP,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, n->line, n->pos,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov "%s %s", mdoc_macronames[n->tok],
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->child->string);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovpost_fname(POST_ARGS)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov const struct roff_node *n;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov const char *cp;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov size_t pos;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n = mdoc->last->child;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov pos = strcspn(n->string, "()");
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov cp = n->string + pos;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if ( ! (cp[0] == '\0' || (cp[0] == '(' && cp[1] == '*')))
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_FN_PAREN, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->line, n->pos + pos, n->string);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovpost_fn(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov post_fname(mdoc);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov post_fa(mdoc);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovpost_fo(POST_ARGS)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov const struct roff_node *n;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n = mdoc->last;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (n->type != ROFFT_HEAD)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (n->child == NULL) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_FO_NOHEAD, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->line, n->pos, "Fo");
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov }
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (n->child != n->last) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_ARG_EXCESS, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->child->next->line, n->child->next->pos,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov "Fo ... %s", n->child->next->string);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov while (n->child != n->last)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov roff_node_delete(mdoc, n->last);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov }
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov post_fname(mdoc);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov}
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovpost_fa(POST_ARGS)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov const struct roff_node *n;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov const char *cp;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov for (n = mdoc->last->child; n != NULL; n = n->next) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov for (cp = n->string; *cp != '\0'; cp++) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* Ignore callbacks and alterations. */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (*cp == '(' || *cp == '{')
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (*cp != ',')
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov continue;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_FA_COMMA, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->line, n->pos + (cp - n->string),
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->string);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov }
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov }
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov}
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorepost_nm(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *n;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n = mdoc->last;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (n->last != NULL &&
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov (n->last->tok == MDOC_Pp ||
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->last->tok == MDOC_Lp))
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc_node_relink(mdoc, n->last);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (mdoc->meta.name != NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov deroff(&mdoc->meta.name, n);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (mdoc->meta.name == NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_NM_NONAME, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->line, n->pos, "Nm");
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovpost_nd(POST_ARGS)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *n;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n = mdoc->last;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (n->type != ROFFT_BODY)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (n->child == NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_ND_EMPTY, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->line, n->pos, "Nd");
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov post_hyph(mdoc);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov}
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovpost_display(POST_ARGS)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *n, *np;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n = mdoc->last;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov switch (n->type) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov case ROFFT_BODY:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (n->end != ENDBODY_NOT)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov break;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (n->child == NULL)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mandoc_msg(MANDOCERR_BLK_EMPTY, mdoc->parse,
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n->line, n->pos, mdoc_macronames[n->tok]);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov else if (n->tok == MDOC_D1)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_hyph(mdoc);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov break;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov case ROFFT_BLOCK:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (n->tok == MDOC_Bd) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (n->args == NULL) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mandoc_msg(MANDOCERR_BD_NOARG,
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->parse, n->line, n->pos, "Bd");
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->next = ROFF_NEXT_SIBLING;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov while (n->body->child != NULL)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc_node_relink(mdoc,
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n->body->child);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov roff_node_delete(mdoc, n);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov break;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov }
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_bd(mdoc);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_prevpar(mdoc);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov }
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov for (np = n->parent; np != NULL; np = np->parent) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (np->type == ROFFT_BLOCK && np->tok == MDOC_Bd) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mandoc_vmsg(MANDOCERR_BD_NEST,
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->parse, n->line, n->pos,
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov "%s in Bd", mdoc_macronames[n->tok]);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov break;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov }
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov }
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov break;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov default:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov break;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorepost_defaults(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *nn;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /*
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * The `Ar' defaults to "file ..." if no value is provided as an
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * argument; the `Mt' and `Pa' macros use "~"; the `Li' just
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * gets an empty string.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (mdoc->last->child != NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore nn = mdoc->last;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore switch (nn->tok) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Ar:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->next = ROFF_NEXT_CHILD;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov roff_word_alloc(mdoc, nn->line, nn->pos, "file");
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov roff_word_alloc(mdoc, nn->line, nn->pos, "...");
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Pa:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Mt:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->next = ROFF_NEXT_CHILD;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov roff_word_alloc(mdoc, nn->line, nn->pos, "~");
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore default:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore abort();
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore mdoc->last = nn;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorepost_at(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *n;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov const char *std_att;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov char *att;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n = mdoc->last;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (n->child == NULL) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->next = ROFF_NEXT_CHILD;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov roff_word_alloc(mdoc, n->line, n->pos, "AT&T UNIX");
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->last = n;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /*
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * If we have a child, look it up in the standard keys. If a
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * key exist, use that instead of the child; if it doesn't,
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * prefix "AT&T UNIX " to the existing data.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n = n->child;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov assert(n->type == ROFFT_TEXT);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if ((std_att = mdoc_a2att(n->string)) == NULL) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_AT_BAD, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->line, n->pos, "At %s", n->string);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_asprintf(&att, "AT&T UNIX %s", n->string);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov } else
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov att = mandoc_strdup(std_att);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov free(n->string);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->string = att;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorepost_an(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *np, *nch;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_an_norm(mdoc);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore np = mdoc->last;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nch = np->child;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (np->norm->An.auth == AUTH__NONE) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (nch == NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov np->line, np->pos, "An");
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov } else if (nch != NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_ARG_EXCESS, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nch->line, nch->pos, "An ... %s", nch->string);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov}
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovpost_en(POST_ARGS)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov{
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_obsolete(mdoc);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (mdoc->last->type == ROFFT_BLOCK)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->last->norm->Es = mdoc->last_es;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovpost_es(POST_ARGS)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov{
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_obsolete(mdoc);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->last_es = mdoc->last;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov}
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorepost_it(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *nbl, *nit, *nch;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore int i, cols;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore enum mdoc_list lt;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_prevpar(mdoc);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nit = mdoc->last;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (nit->type != ROFFT_BLOCK)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nbl = nit->parent->parent;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov lt = nbl->norm->Bl.type;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore switch (lt) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case LIST_tag:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case LIST_hang:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case LIST_ohang:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case LIST_inset:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case LIST_diag:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (nit->head->child == NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_IT_NOHEAD,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, nit->line, nit->pos,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov "Bl -%s It",
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc_argnames[nbl->args->argv[0].arg]);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case LIST_bullet:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case LIST_dash:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case LIST_enum:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case LIST_hyphen:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (nit->body == NULL || nit->body->child == NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_IT_NOBODY,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, nit->line, nit->pos,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov "Bl -%s It",
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc_argnames[nbl->args->argv[0].arg]);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /* FALLTHROUGH */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case LIST_item:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (nit->head->child != NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_ARG_SKIP,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, nit->line, nit->pos,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov "It %s", nit->head->child->string);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case LIST_column:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov cols = (int)nbl->norm->Bl.ncols;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov assert(nit->head->child == NULL);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov i = 0;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov for (nch = nit->child; nch != NULL; nch = nch->next)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (nch->type == ROFFT_BODY)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore i++;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (i < cols || i > cols + 1)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_BL_COL,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, nit->line, nit->pos,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov "%d columns, %d cells", cols, i);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov default:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov abort();
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovpost_bl_block(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *n, *ni, *nc;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_prevpar(mdoc);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /*
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * These are fairly complicated, so we've broken them into two
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * functions. post_bl_block_tag() is called when a -tag is
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * specified, but no -width (it must be guessed). The second
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * when a -width is specified (macro indicators must be
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * rewritten into real lengths).
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore n = mdoc->last;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (n->norm->Bl.type == LIST_tag &&
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n->norm->Bl.width == NULL) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov post_bl_block_tag(mdoc);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov assert(n->norm->Bl.width != NULL);
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov for (ni = n->body->child; ni != NULL; ni = ni->next) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (ni->body == NULL)
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore continue;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore nc = ni->body->last;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov while (nc != NULL) {
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore switch (nc->tok) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Pp:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Lp:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_br:
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore break;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore default:
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore nc = NULL;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore continue;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore }
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (ni->next == NULL) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_PAR_MOVE,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, nc->line, nc->pos,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc_macronames[nc->tok]);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc_node_relink(mdoc, nc);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov } else if (n->norm->Bl.comp == 0 &&
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n->norm->Bl.type != LIST_column) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_PAR_SKIP,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, nc->line, nc->pos,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov "%s before It",
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc_macronames[nc->tok]);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov roff_node_delete(mdoc, nc);
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore } else
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore break;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore nc = ni->body->last;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore }
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov/*
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov * If the argument of -offset or -width is a macro,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov * replace it with the associated default width.
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovvoid
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovrewrite_macro2len(char **arg)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore size_t width;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov int tok;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (*arg == NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov else if ( ! strcmp(*arg, "Ds"))
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore width = 6;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov else if ((tok = mdoc_hash_find(*arg)) == TOKEN_NONE)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov else
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov width = macro2len(tok);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov free(*arg);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_asprintf(arg, "%zun", width);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorepost_bl_block_tag(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *n, *nn;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore size_t sz, ssz;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore int i;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov char buf[24];
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /*
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * Calculate the -width for a `Bl -tag' list if it hasn't been
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * provided. Uses the first head macro. NOTE AGAIN: this is
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * ONLY if the -width argument has NOT been provided. See
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov * rewrite_macro2len() for converting the -width string.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore sz = 10;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore n = mdoc->last;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov for (nn = n->body->child; nn != NULL; nn = nn->next) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (nn->tok != MDOC_It)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore continue;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov assert(nn->type == ROFFT_BLOCK);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore nn = nn->head->child;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if (nn == NULL)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (nn->type == ROFFT_TEXT) {
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore sz = strlen(nn->string) + 1;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if (0 != (ssz = macro2len(nn->tok)))
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore sz = ssz;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /* Defaults to ten ens. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov (void)snprintf(buf, sizeof(buf), "%un", (unsigned int)sz);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /*
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * We have to dynamically add this to the macro's argument list.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * We're guaranteed that a MDOC_Width doesn't already exist.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov assert(n->args != NULL);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore i = (int)(n->args->argc)++;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->args->argv = mandoc_reallocarray(n->args->argv,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->args->argc, sizeof(struct mdoc_argv));
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore n->args->argv[i].arg = MDOC_Width;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore n->args->argv[i].line = n->line;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore n->args->argv[i].pos = n->pos;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore n->args->argv[i].sz = 1;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore n->args->argv[i].value = mandoc_malloc(sizeof(char *));
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore n->args->argv[i].value[0] = mandoc_strdup(buf);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /* Set our width! */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore n->norm->Bl.width = n->args->argv[i].value[0];
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovpost_bl_head(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *nbl, *nh, *nch, *nnext;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov struct mdoc_argv *argv;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore int i, j;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_bl_norm(mdoc);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov nh = mdoc->last;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (nh->norm->Bl.type != LIST_column) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if ((nch = nh->child) == NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_ARG_EXCESS, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nch->line, nch->pos, "Bl ... %s", nch->string);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov while (nch != NULL) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov roff_node_delete(mdoc, nch);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nch = nh->child;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov }
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /*
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov * Append old-style lists, where the column width specifiers
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * trail as macro parameters, to the new-style ("normal-form")
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * lists where they're argument values following -column.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (nh->child == NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nbl = nh->parent;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov for (j = 0; j < (int)nbl->args->argc; j++)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (nbl->args->argv[j].arg == MDOC_Column)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov assert(j < (int)nbl->args->argc);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /*
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * Accommodate for new-style groff column syntax. Shuffle the
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * child nodes, all of which must be TEXT, as arguments for the
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * column field. Then, delete the head children.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov argv = nbl->args->argv + j;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov i = argv->sz;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov for (nch = nh->child; nch != NULL; nch = nch->next)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov argv->sz++;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov argv->value = mandoc_reallocarray(argv->value,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov argv->sz, sizeof(char *));
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nh->norm->Bl.ncols = argv->sz;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nh->norm->Bl.cols = (void *)argv->value;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov for (nch = nh->child; nch != NULL; nch = nnext) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov argv->value[i++] = nch->string;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nch->string = NULL;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nnext = nch->next;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov roff_node_delete(NULL, nch);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nh->child = NULL;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorepost_bl(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *nparent, *nprev; /* of the Bl block */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *nblock, *nbody; /* of the Bl */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *nchild, *nnext; /* of the Bl body */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore nbody = mdoc->last;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore switch (nbody->type) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov case ROFFT_BLOCK:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov post_bl_block(mdoc);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov case ROFFT_HEAD:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov post_bl_head(mdoc);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov case ROFFT_BODY:
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore break;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore default:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore }
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (nbody->end != ENDBODY_NOT)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore nchild = nbody->child;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (nchild == NULL) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_BLK_EMPTY, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nbody->line, nbody->pos, "Bl");
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov }
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov while (nchild != NULL) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (nchild->tok == MDOC_It ||
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov (nchild->tok == MDOC_Sm &&
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nchild->next != NULL &&
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nchild->next->tok == MDOC_It)) {
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore nchild = nchild->next;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore continue;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_BL_MOVE, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nchild->line, nchild->pos,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc_macronames[nchild->tok]);
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore /*
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore * Move the node out of the Bl block.
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore * First, collect all required node pointers.
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore */
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore nblock = nbody->parent;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore nprev = nblock->prev;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore nparent = nblock->parent;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore nnext = nchild->next;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore /*
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore * Unlink this child.
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore */
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov assert(nchild->prev == NULL);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov nbody->child = nnext;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (nnext == NULL)
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore nbody->last = NULL;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov else
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore nnext->prev = NULL;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore /*
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore * Relink this child.
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore */
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore nchild->parent = nparent;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore nchild->prev = nprev;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore nchild->next = nblock;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore nblock->prev = nchild;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (nprev == NULL)
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore nparent->child = nchild;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore else
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore nprev->next = nchild;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore nchild = nnext;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov}
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovpost_bk(POST_ARGS)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *n;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n = mdoc->last;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (n->type == ROFFT_BLOCK && n->body->child == NULL) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_BLK_EMPTY,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, n->line, n->pos, "Bk");
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov roff_node_delete(mdoc, n);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovpost_sm(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *nch;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nch = mdoc->last->child;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (nch == NULL) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->flags ^= MDOC_SMOFF;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov assert(nch->type == ROFFT_TEXT);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if ( ! strcmp(nch->string, "on")) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->flags &= ~MDOC_SMOFF;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore }
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if ( ! strcmp(nch->string, "off")) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->flags |= MDOC_SMOFF;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_SM_BAD,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, nch->line, nch->pos,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov "%s %s", mdoc_macronames[mdoc->last->tok], nch->string);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc_node_relink(mdoc, nch);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorepost_root(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *n;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* Add missing prologue data. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (mdoc->meta.date == NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->meta.date = mdoc->quick ?
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_strdup("") :
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_normdate(mdoc->parse, NULL, 0, 0);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (mdoc->meta.title == NULL) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_DT_NOTITLE,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, 0, 0, "EOF");
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->meta.title = mandoc_strdup("UNTITLED");
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (mdoc->meta.vol == NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->meta.vol = mandoc_strdup("LOCAL");
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (mdoc->meta.os == NULL) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_OS_MISSING,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, 0, 0, NULL);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->meta.os = mandoc_strdup("");
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* Check that we begin with a proper `Sh'. */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n = mdoc->first->child;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov while (n != NULL && n->tok != TOKEN_NONE &&
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc_macros[n->tok].flags & MDOC_PROLOGUE)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n = n->next;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (n == NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_DOC_EMPTY, mdoc->parse, 0, 0, NULL);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov else if (n->tok != MDOC_Sh)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_SEC_BEFORE, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->line, n->pos, mdoc_macronames[n->tok]);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorepost_st(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *n, *nch;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore const char *p;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n = mdoc->last;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nch = n->child;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov assert(nch->type == ROFFT_TEXT);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if ((p = mdoc_a2st(nch->string)) == NULL) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_ST_BAD, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nch->line, nch->pos, "St %s", nch->string);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov roff_node_delete(mdoc, n);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore } else {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov free(nch->string);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nch->string = mandoc_strdup(p);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorepost_rs(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *np, *nch, *next, *prev;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore int i, j;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov np = mdoc->last;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (np->type != ROFFT_BODY)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (np->child == NULL) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_RS_EMPTY, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov np->line, np->pos, "Rs");
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /*
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * The full `Rs' block needs special handling to order the
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * sub-elements according to `rsord'. Pick through each element
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov * and correctly order it. This is an insertion sort.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore next = NULL;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov for (nch = np->child->next; nch != NULL; nch = next) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* Determine order number of this child. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore for (i = 0; i < RSORD_MAX; i++)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (rsord[i] == nch->tok)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (i == RSORD_MAX) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_RS_BAD,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, nch->line, nch->pos,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc_macronames[nch->tok]);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov i = -1;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov } else if (nch->tok == MDOC__J || nch->tok == MDOC__B)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov np->norm->Rs.quote_T++;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /*
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov * Remove this child from the chain. This somewhat
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * repeats roff_node_unlink(), but since we're
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * just re-ordering, there's no need for the
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * full unlink process.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if ((next = nch->next) != NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov next->prev = nch->prev;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if ((prev = nch->prev) != NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov prev->next = nch->next;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nch->prev = nch->next = NULL;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /*
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * Scan back until we reach a node that's
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov * to be ordered before this child.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore for ( ; prev ; prev = prev->prev) {
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /* Determine order of `prev'. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore for (j = 0; j < RSORD_MAX; j++)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if (rsord[j] == prev->tok)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (j == RSORD_MAX)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov j = -1;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if (j <= i)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /*
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov * Set this child back into its correct place
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov * in front of the `prev' node.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nch->prev = prev;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (prev == NULL) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov np->child->prev = nch;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nch->next = np->child;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov np->child = nch;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore } else {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (prev->next)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov prev->next->prev = nch;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nch->next = prev->next;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov prev->next = nch;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore/*
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore * For some arguments of some macros,
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore * convert all breakable hyphens into ASCII_HYPH.
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amorepost_hyph(POST_ARGS)
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *nch;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore char *cp;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov for (nch = mdoc->last->child; nch != NULL; nch = nch->next) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (nch->type != ROFFT_TEXT)
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore continue;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore cp = nch->string;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (*cp == '\0')
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore continue;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov while (*(++cp) != '\0')
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (*cp == '-' &&
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore isalpha((unsigned char)cp[-1]) &&
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore isalpha((unsigned char)cp[1]))
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore *cp = ASCII_HYPH;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore }
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore}
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorepost_ns(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (mdoc->last->flags & MDOC_LINE)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_NS_SKIP, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->last->line, mdoc->last->pos, NULL);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorepost_sh(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov post_ignpar(mdoc);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov switch (mdoc->last->type) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov case ROFFT_HEAD:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov post_sh_head(mdoc);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov break;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov case ROFFT_BODY:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov switch (mdoc->lastsec) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case SEC_NAME:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov post_sh_name(mdoc);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case SEC_SEE_ALSO:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov post_sh_see_also(mdoc);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case SEC_AUTHORS:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov post_sh_authors(mdoc);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov default:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov }
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov default:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovpost_sh_name(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *n;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov int hasnm, hasnd;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov hasnm = hasnd = 0;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov for (n = mdoc->last->child; n != NULL; n = n->next) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov switch (n->tok) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Nm:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov hasnm = 1;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Nd:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov hasnd = 1;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (n->next != NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_NAMESEC_ND,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, n->line, n->pos, NULL);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov break;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov case TOKEN_NONE:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (hasnm)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* FALLTHROUGH */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov default:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_NAMESEC_BAD, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->line, n->pos, mdoc_macronames[n->tok]);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if ( ! hasnm)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_NAMESEC_NONM, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->last->line, mdoc->last->pos, NULL);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if ( ! hasnd)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_NAMESEC_NOND, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->last->line, mdoc->last->pos, NULL);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov}
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovpost_sh_see_also(POST_ARGS)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov const struct roff_node *n;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov const char *name, *sec;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov const char *lastname, *lastsec, *lastpunct;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov int cmp;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n = mdoc->last->child;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov lastname = lastsec = lastpunct = NULL;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov while (n != NULL) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (n->tok != MDOC_Xr ||
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n->child == NULL ||
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n->child->next == NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* Process one .Xr node. */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov name = n->child->string;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov sec = n->child->next->string;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (lastsec != NULL) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (lastpunct[0] != ',' || lastpunct[1] != '\0')
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_XR_PUNCT,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, n->line, n->pos,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov "%s before %s(%s)", lastpunct,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov name, sec);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov cmp = strcmp(lastsec, sec);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (cmp > 0)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_XR_ORDER,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, n->line, n->pos,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov "%s(%s) after %s(%s)", name,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov sec, lastname, lastsec);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov else if (cmp == 0 &&
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov strcasecmp(lastname, name) > 0)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_XR_ORDER,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, n->line, n->pos,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov "%s after %s", name, lastname);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov }
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov lastname = name;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov lastsec = sec;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* Process the following node. */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n = n->next;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (n == NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (n->tok == MDOC_Xr) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov lastpunct = "none";
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore continue;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov }
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (n->type != ROFFT_TEXT)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov for (name = n->string; *name != '\0'; name++)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (isalpha((const unsigned char)*name))
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov lastpunct = n->string;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (n->next == NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_XR_PUNCT, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->line, n->pos, "%s after %s(%s)",
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov lastpunct, lastname, lastsec);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n = n->next;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic int
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovchild_an(const struct roff_node *n)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov{
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov for (n = n->child; n != NULL; n = n->next)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if ((n->tok == MDOC_An && n->child != NULL) || child_an(n))
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 1;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 0;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovpost_sh_authors(POST_ARGS)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov{
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if ( ! child_an(mdoc->last))
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_AN_MISSING, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->last->line, mdoc->last->pos, NULL);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov}
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorepost_sh_head(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov const char *goodsec;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov enum roff_sec sec;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /*
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * Process a new section. Sections are either "named" or
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * "custom". Custom sections are user-defined, while named ones
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * follow a conventional order and may only appear in certain
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * manual sections.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov sec = mdoc->last->sec;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /* The NAME should be first. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if (SEC_NAME != sec && SEC_NONE == mdoc->lastnamed)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_NAMESEC_FIRST, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->last->line, mdoc->last->pos,
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov "Sh %s", secnames[sec]);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /* The SYNOPSIS gets special attention in other areas. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (sec == SEC_SYNOPSIS) {
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore roff_setreg(mdoc->roff, "nS", 1, '=');
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore mdoc->flags |= MDOC_SYNOPSIS;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore } else {
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore roff_setreg(mdoc->roff, "nS", 0, '=');
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore mdoc->flags &= ~MDOC_SYNOPSIS;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /* Mark our last section. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore mdoc->lastsec = sec;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /* We don't care about custom sections after this. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (sec == SEC_CUSTOM)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /*
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * Check whether our non-custom section is being repeated or is
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * out of order.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if (sec == mdoc->lastnamed)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_SEC_REP, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->last->line, mdoc->last->pos,
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov "Sh %s", secnames[sec]);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if (sec < mdoc->lastnamed)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_SEC_ORDER, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->last->line, mdoc->last->pos,
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov "Sh %s", secnames[sec]);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /* Mark the last named section. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore mdoc->lastnamed = sec;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /* Check particular section/manual conventions. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (mdoc->meta.msec == NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov goodsec = NULL;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore switch (sec) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case SEC_ERRORS:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (*mdoc->meta.msec == '4')
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov goodsec = "2, 3, 4, 9";
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /* FALLTHROUGH */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case SEC_RETURN_VALUES:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case SEC_LIBRARY:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if (*mdoc->meta.msec == '2')
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if (*mdoc->meta.msec == '3')
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (NULL == goodsec)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov goodsec = "2, 3, 9";
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* FALLTHROUGH */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case SEC_CONTEXT:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if (*mdoc->meta.msec == '9')
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (NULL == goodsec)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov goodsec = "9";
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_SEC_MSEC, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->last->line, mdoc->last->pos,
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov "Sh %s for %s only", secnames[sec], goodsec);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore default:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorepost_ignpar(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *np;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov switch (mdoc->last->type) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov case ROFFT_HEAD:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov post_hyph(mdoc);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov case ROFFT_BODY:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov default:
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if ((np = mdoc->last->child) != NULL)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (np->tok == MDOC_Pp || np->tok == MDOC_Lp) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_PAR_SKIP,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, np->line, np->pos,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov "%s after %s", mdoc_macronames[np->tok],
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc_macronames[mdoc->last->tok]);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov roff_node_delete(mdoc, np);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if ((np = mdoc->last->last) != NULL)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (np->tok == MDOC_Pp || np->tok == MDOC_Lp) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_PAR_SKIP, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov np->line, np->pos, "%s at the end of %s",
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc_macronames[np->tok],
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc_macronames[mdoc->last->tok]);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov roff_node_delete(mdoc, np);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovpost_prevpar(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *n;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n = mdoc->last;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (NULL == n->prev)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (n->type != ROFFT_ELEM && n->type != ROFFT_BLOCK)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /*
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * Don't allow prior `Lp' or `Pp' prior to a paragraph-type
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * block: `Lp', `Pp', or non-compact `Bd' or `Bl'.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (n->prev->tok != MDOC_Pp &&
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n->prev->tok != MDOC_Lp &&
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n->prev->tok != MDOC_br)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (n->tok == MDOC_Bl && n->norm->Bl.comp)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (n->tok == MDOC_Bd && n->norm->Bd.comp)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (n->tok == MDOC_It && n->parent->norm->Bl.comp)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_PAR_SKIP, mdoc->parse,
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n->prev->line, n->prev->pos,
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov "%s before %s", mdoc_macronames[n->prev->tok],
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc_macronames[n->tok]);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov roff_node_delete(mdoc, n->prev);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amorepost_par(POST_ARGS)
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *np;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov np = mdoc->last;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (np->tok != MDOC_br && np->tok != MDOC_sp)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_prevpar(mdoc);
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (np->tok == MDOC_sp) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (np->child != NULL && np->child->next != NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_ARG_EXCESS, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov np->child->next->line, np->child->next->pos,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov "sp ... %s", np->child->next->string);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov } else if (np->child != NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_ARG_SKIP,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, np->line, np->pos, "%s %s",
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc_macronames[np->tok], np->child->string);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if ((np = mdoc->last->prev) == NULL) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov np = mdoc->last->parent;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (np->tok != MDOC_Sh && np->tok != MDOC_Ss)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov } else if (np->tok != MDOC_Pp && np->tok != MDOC_Lp &&
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov (mdoc->last->tok != MDOC_br ||
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov (np->tok != MDOC_sp && np->tok != MDOC_br)))
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_PAR_SKIP, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->last->line, mdoc->last->pos,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov "%s after %s", mdoc_macronames[mdoc->last->tok],
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc_macronames[np->tok]);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov roff_node_delete(mdoc, mdoc->last);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorepost_dd(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *n;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov char *datestr;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n = mdoc->last;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (mdoc->meta.date != NULL) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mandoc_msg(MANDOCERR_PROLOG_REP, mdoc->parse,
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n->line, n->pos, "Dd");
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore free(mdoc->meta.date);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov } else if (mdoc->flags & MDOC_PBODY)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mandoc_msg(MANDOCERR_PROLOG_LATE, mdoc->parse,
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n->line, n->pos, "Dd");
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov else if (mdoc->meta.title != NULL)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mandoc_msg(MANDOCERR_PROLOG_ORDER, mdoc->parse,
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n->line, n->pos, "Dd after Dt");
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov else if (mdoc->meta.os != NULL)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mandoc_msg(MANDOCERR_PROLOG_ORDER, mdoc->parse,
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n->line, n->pos, "Dd after Os");
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (n->child == NULL || n->child->string[0] == '\0') {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->meta.date = mdoc->quick ? mandoc_strdup("") :
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_normdate(mdoc->parse, NULL, n->line, n->pos);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov goto out;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov datestr = NULL;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov deroff(&datestr, n);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (mdoc->quick)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->meta.date = datestr;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov else {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->meta.date = mandoc_normdate(mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov datestr, n->line, n->pos);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov free(datestr);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovout:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov roff_node_delete(mdoc, n);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorepost_dt(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *nn, *n;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore const char *cp;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore char *p;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore n = mdoc->last;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (mdoc->flags & MDOC_PBODY) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mandoc_msg(MANDOCERR_DT_LATE, mdoc->parse,
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n->line, n->pos, "Dt");
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov goto out;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov }
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (mdoc->meta.title != NULL)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mandoc_msg(MANDOCERR_PROLOG_REP, mdoc->parse,
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n->line, n->pos, "Dt");
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov else if (mdoc->meta.os != NULL)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mandoc_msg(MANDOCERR_PROLOG_ORDER, mdoc->parse,
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n->line, n->pos, "Dt after Os");
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov free(mdoc->meta.title);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov free(mdoc->meta.msec);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov free(mdoc->meta.vol);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov free(mdoc->meta.arch);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->meta.title = NULL;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->meta.msec = NULL;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->meta.vol = NULL;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->meta.arch = NULL;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* Mandatory first argument: title. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nn = n->child;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (nn == NULL || *nn->string == '\0') {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_DT_NOTITLE,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, n->line, n->pos, "Dt");
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->meta.title = mandoc_strdup("UNTITLED");
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov } else {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->meta.title = mandoc_strdup(nn->string);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* Check that all characters are uppercase. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov for (p = nn->string; *p != '\0'; p++)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (islower((unsigned char)*p)) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_TITLE_CASE,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, nn->line,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nn->pos + (p - nn->string),
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov "Dt %s", nn->string);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov break;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* Mandatory second argument: section.�*/
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (nn != NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nn = nn->next;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (nn == NULL) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_MSEC_MISSING,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->parse, n->line, n->pos,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov "Dt %s", mdoc->meta.title);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore mdoc->meta.vol = mandoc_strdup("LOCAL");
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov goto out; /* msec and arch remain NULL. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->meta.msec = mandoc_strdup(nn->string);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* Infer volume title from section number. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore cp = mandoc_a2msec(nn->string);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (cp == NULL) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_MSEC_BAD, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nn->line, nn->pos, "Dt ... %s", nn->string);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore mdoc->meta.vol = mandoc_strdup(nn->string);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov } else
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->meta.vol = mandoc_strdup(cp);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* Optional third argument: architecture. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if ((nn = nn->next) == NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov goto out;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov for (p = nn->string; *p != '\0'; p++)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov *p = tolower((unsigned char)*p);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->meta.arch = mandoc_strdup(nn->string);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /* Ignore fourth and later arguments. */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if ((nn = nn->next) != NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_vmsg(MANDOCERR_ARG_EXCESS, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov nn->line, nn->pos, "Dt ... %s", nn->string);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovout:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov roff_node_delete(mdoc, n);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorepost_bx(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *n;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov /*
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * Make `Bx's second argument always start with an uppercase
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * letter. Groff checks if it's an "accepted" term, but we just
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore * uppercase blindly.
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if ((n = mdoc->last->child) != NULL && (n = n->next) != NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov *n->string = (char)toupper((unsigned char)*n->string);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorepost_os(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore#ifndef OSNAME
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore struct utsname utsname;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov static char *defbuf;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore#endif
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *n;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore n = mdoc->last;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (mdoc->meta.os != NULL)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mandoc_msg(MANDOCERR_PROLOG_REP, mdoc->parse,
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n->line, n->pos, "Os");
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov else if (mdoc->flags & MDOC_PBODY)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mandoc_msg(MANDOCERR_PROLOG_LATE, mdoc->parse,
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n->line, n->pos, "Os");
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore /*
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore * Set the operating system by way of the `Os' macro.
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore * The order of precedence is:
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore * 1. the argument of the `Os' macro, unless empty
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore * 2. the -Ios=foo command line argument, if provided
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore * 3. -DOSNAME="\"foo\"", if provided during compilation
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore * 4. "sysname release" from uname(3)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov */
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
698f87a48e2e945bfe5493ce168e0d0ae1cedd5cGarrett D'Amore free(mdoc->meta.os);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->meta.os = NULL;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov deroff(&mdoc->meta.os, n);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (mdoc->meta.os)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov goto out;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (mdoc->defos) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->meta.os = mandoc_strdup(mdoc->defos);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov goto out;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore#ifdef OSNAME
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->meta.os = mandoc_strdup(OSNAME);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore#else /*!OSNAME */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (defbuf == NULL) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (uname(&utsname) == -1) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_OS_UNAME, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->line, n->pos, "Os");
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov defbuf = mandoc_strdup("UNKNOWN");
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov } else
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_asprintf(&defbuf, "%s %s",
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov utsname.sysname, utsname.release);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->meta.os = mandoc_strdup(defbuf);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov#endif /*!OSNAME*/
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovout:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov roff_node_delete(mdoc, n);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov/*
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov * If no argument is provided,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov * fill in the name of the current manual page.
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov */
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovstatic void
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankovpost_ex(POST_ARGS)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *n;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov post_std(mdoc);
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n = mdoc->last;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (n->child != NULL)
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov if (mdoc->meta.name == NULL) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mandoc_msg(MANDOCERR_EX_NONAME, mdoc->parse,
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov n->line, n->pos, "Ex");
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov return;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore }
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->next = ROFF_NEXT_CHILD;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov roff_word_alloc(mdoc, n->line, n->pos, mdoc->meta.name);
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov mdoc->last = n;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovenum roff_sec
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovmdoc_a2sec(const char *p)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore int i;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov for (i = 0; i < (int)SEC__MAX; i++)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore if (secnames[i] && 0 == strcmp(p, secnames[i]))
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return (enum roff_sec)i;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return SEC_CUSTOM;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amorestatic size_t
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovmacro2len(int macro)
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore{
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore switch (macro) {
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Ad:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 12;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Ao:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 12;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_An:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 12;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Aq:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 12;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Ar:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 12;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Bo:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 12;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Bq:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 12;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Cd:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 12;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Cm:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 10;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Do:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 10;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Dq:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 12;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Dv:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 12;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Eo:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 12;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Em:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 10;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Er:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 17;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Ev:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 15;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Fa:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 12;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Fl:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 10;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Fo:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 16;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Fn:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 16;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Ic:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 10;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Li:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 16;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Ms:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 6;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Nm:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 10;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_No:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 12;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Oo:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 10;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Op:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 14;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Pa:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 32;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Pf:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 12;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Po:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 12;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Pq:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 12;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Ql:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 16;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Qo:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 12;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_So:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 12;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Sq:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 12;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Sy:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 6;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Sx:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 16;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Tn:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 10;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Va:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 12;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Vt:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 12;
260e9a87725c090ba5835b1f9f0b62fa2f96036fYuri Pankov case MDOC_Xr:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 10;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore default:
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore break;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore };
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return 0;
95c635efb7c3b86efc493e0447eaec7aecca3f0fGarrett D'Amore}