/*	$Id: mdoc.h,v 1.144 2015/11/07 14:01:16 schwarze Exp $ */
/*
 * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
 * Copyright (c) 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#define	MDOC_Ap    0
#define	MDOC_Dd    1
#define	MDOC_Dt    2
#define	MDOC_Os    3
#define	MDOC_Sh    4
#define	MDOC_Ss    5
#define	MDOC_Pp    6
#define	MDOC_D1    7
#define	MDOC_Dl    8
#define	MDOC_Bd    9
#define	MDOC_Ed   10
#define	MDOC_Bl   11
#define	MDOC_El   12
#define	MDOC_It   13
#define	MDOC_Ad   14
#define	MDOC_An   15
#define	MDOC_Ar   16
#define	MDOC_Cd   17
#define	MDOC_Cm   18
#define	MDOC_Dv   19
#define	MDOC_Er   20
#define	MDOC_Ev   21
#define	MDOC_Ex   22
#define	MDOC_Fa   23
#define	MDOC_Fd   24
#define	MDOC_Fl   25
#define	MDOC_Fn   26
#define	MDOC_Ft   27
#define	MDOC_Ic   28
#define	MDOC_In   29
#define	MDOC_Li   30
#define	MDOC_Nd   31
#define	MDOC_Nm   32
#define	MDOC_Op   33
#define	MDOC_Ot   34
#define	MDOC_Pa   35
#define	MDOC_Rv   36
#define	MDOC_St   37
#define	MDOC_Va   38
#define	MDOC_Vt   39
#define	MDOC_Xr   40
#define	MDOC__A   41
#define	MDOC__B   42
#define	MDOC__D   43
#define	MDOC__I   44
#define	MDOC__J   45
#define	MDOC__N   46
#define	MDOC__O   47
#define	MDOC__P   48
#define	MDOC__R   49
#define	MDOC__T   50
#define	MDOC__V   51
#define	MDOC_Ac   52
#define	MDOC_Ao   53
#define	MDOC_Aq   54
#define	MDOC_At   55
#define	MDOC_Bc   56
#define	MDOC_Bf   57
#define	MDOC_Bo   58
#define	MDOC_Bq   59
#define	MDOC_Bsx  60
#define	MDOC_Bx   61
#define	MDOC_Db   62
#define	MDOC_Dc   63
#define	MDOC_Do   64
#define	MDOC_Dq   65
#define	MDOC_Ec   66
#define	MDOC_Ef   67
#define	MDOC_Em   68
#define	MDOC_Eo   69
#define	MDOC_Fx   70
#define	MDOC_Ms   71
#define	MDOC_No   72
#define	MDOC_Ns   73
#define	MDOC_Nx   74
#define	MDOC_Ox   75
#define	MDOC_Pc   76
#define	MDOC_Pf   77
#define	MDOC_Po   78
#define	MDOC_Pq   79
#define	MDOC_Qc   80
#define	MDOC_Ql   81
#define	MDOC_Qo   82
#define	MDOC_Qq   83
#define	MDOC_Re   84
#define	MDOC_Rs   85
#define	MDOC_Sc   86
#define	MDOC_So   87
#define	MDOC_Sq   88
#define	MDOC_Sm   89
#define	MDOC_Sx   90
#define	MDOC_Sy   91
#define	MDOC_Tn   92
#define	MDOC_Ux   93
#define	MDOC_Xc   94
#define	MDOC_Xo   95
#define	MDOC_Fo   96
#define	MDOC_Fc   97
#define	MDOC_Oo   98
#define	MDOC_Oc   99
#define	MDOC_Bk  100
#define	MDOC_Ek  101
#define	MDOC_Bt  102
#define	MDOC_Hf  103
#define	MDOC_Fr  104
#define	MDOC_Ud  105
#define	MDOC_Lb  106
#define	MDOC_Lp  107
#define	MDOC_Lk  108
#define	MDOC_Mt  109
#define	MDOC_Brq 110
#define	MDOC_Bro 111
#define	MDOC_Brc 112
#define	MDOC__C  113
#define	MDOC_Es  114
#define	MDOC_En  115
#define	MDOC_Dx  116
#define	MDOC__Q  117
#define	MDOC_br  118
#define	MDOC_sp  119
#define	MDOC__U  120
#define	MDOC_Ta  121
#define	MDOC_ll  122
#define	MDOC_MAX 123

enum	mdocargt {
	MDOC_Split, /* -split */
	MDOC_Nosplit, /* -nospli */
	MDOC_Ragged, /* -ragged */
	MDOC_Unfilled, /* -unfilled */
	MDOC_Literal, /* -literal */
	MDOC_File, /* -file */
	MDOC_Offset, /* -offset */
	MDOC_Bullet, /* -bullet */
	MDOC_Dash, /* -dash */
	MDOC_Hyphen, /* -hyphen */
	MDOC_Item, /* -item */
	MDOC_Enum, /* -enum */
	MDOC_Tag, /* -tag */
	MDOC_Diag, /* -diag */
	MDOC_Hang, /* -hang */
	MDOC_Ohang, /* -ohang */
	MDOC_Inset, /* -inset */
	MDOC_Column, /* -column */
	MDOC_Width, /* -width */
	MDOC_Compact, /* -compact */
	MDOC_Std, /* -std */
	MDOC_Filled, /* -filled */
	MDOC_Words, /* -words */
	MDOC_Emphasis, /* -emphasis */
	MDOC_Symbolic, /* -symbolic */
	MDOC_Nested, /* -nested */
	MDOC_Centred, /* -centered */
	MDOC_ARG_MAX
};

/*
 * An argument to a macro (multiple values = `-column xxx yyy').
 */
struct	mdoc_argv {
	enum mdocargt	  arg; /* type of argument */
	int		  line;
	int		  pos;
	size_t		  sz; /* elements in "value" */
	char		**value; /* argument strings */
};

/*
 * Reference-counted macro arguments.  These are refcounted because
 * blocks have multiple instances of the same arguments spread across
 * the HEAD, BODY, TAIL, and BLOCK node types.
 */
struct	mdoc_arg {
	size_t		  argc;
	struct mdoc_argv *argv;
	unsigned int	  refcnt;
};

enum	mdoc_list {
	LIST__NONE = 0,
	LIST_bullet, /* -bullet */
	LIST_column, /* -column */
	LIST_dash, /* -dash */
	LIST_diag, /* -diag */
	LIST_enum, /* -enum */
	LIST_hang, /* -hang */
	LIST_hyphen, /* -hyphen */
	LIST_inset, /* -inset */
	LIST_item, /* -item */
	LIST_ohang, /* -ohang */
	LIST_tag, /* -tag */
	LIST_MAX
};

enum	mdoc_disp {
	DISP__NONE = 0,
	DISP_centered, /* -centered */
	DISP_ragged, /* -ragged */
	DISP_unfilled, /* -unfilled */
	DISP_filled, /* -filled */
	DISP_literal /* -literal */
};

enum	mdoc_auth {
	AUTH__NONE = 0,
	AUTH_split, /* -split */
	AUTH_nosplit /* -nosplit */
};

enum	mdoc_font {
	FONT__NONE = 0,
	FONT_Em, /* Em, -emphasis */
	FONT_Li, /* Li, -literal */
	FONT_Sy /* Sy, -symbolic */
};

struct	mdoc_bd {
	const char	 *offs; /* -offset */
	enum mdoc_disp	  type; /* -ragged, etc. */
	int		  comp; /* -compact */
};

struct	mdoc_bl {
	const char	 *width; /* -width */
	const char	 *offs; /* -offset */
	enum mdoc_list	  type; /* -tag, -enum, etc. */
	int		  comp; /* -compact */
	size_t		  ncols; /* -column arg count */
	const char	**cols; /* -column val ptr */
	int		  count; /* -enum counter */
};

struct	mdoc_bf {
	enum mdoc_font	  font; /* font */
};

struct	mdoc_an {
	enum mdoc_auth	  auth; /* -split, etc. */
};

struct	mdoc_rs {
	int		  quote_T; /* whether to quote %T */
};

/*
 * Consists of normalised node arguments.  These should be used instead
 * of iterating through the mdoc_arg pointers of a node: defaults are
 * provided, etc.
 */
union	mdoc_data {
	struct mdoc_an	  An;
	struct mdoc_bd	  Bd;
	struct mdoc_bf	  Bf;
	struct mdoc_bl	  Bl;
	struct roff_node *Es;
	struct mdoc_rs	  Rs;
};

/* Names of macros. */
extern	const char *const *mdoc_macronames;

/* Names of macro args.  Index is enum mdocargt. */
extern	const char *const *mdoc_argnames;


void		 mdoc_validate(struct roff_man *);