1*6b86842eSschwarze /* $OpenBSD: mdoc.h,v 1.71 2018/12/30 00:48:47 schwarze Exp $ */ 2f73abda9Skristaps /* 32791bd1cSschwarze * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> 4ae2efdd8Sschwarze * Copyright (c) 2014, 2015 Ingo Schwarze <schwarze@openbsd.org> 5f73abda9Skristaps * 6f73abda9Skristaps * Permission to use, copy, modify, and distribute this software for any 7a6464425Sschwarze * purpose with or without fee is hereby granted, provided that the above 8a6464425Sschwarze * copyright notice and this permission notice appear in all copies. 9f73abda9Skristaps * 10d1982c71Sschwarze * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES 11a6464425Sschwarze * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12d1982c71Sschwarze * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR 13a6464425Sschwarze * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14a6464425Sschwarze * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15a6464425Sschwarze * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16a6464425Sschwarze * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17f73abda9Skristaps */ 18f73abda9Skristaps 19*6b86842eSschwarze struct roff_node; 20*6b86842eSschwarze struct roff_man; 21*6b86842eSschwarze 22ddce0b0cSschwarze enum mdocargt { 23a35fc07aSschwarze MDOC_Split, /* -split */ 24a35fc07aSschwarze MDOC_Nosplit, /* -nospli */ 25a35fc07aSschwarze MDOC_Ragged, /* -ragged */ 26a35fc07aSschwarze MDOC_Unfilled, /* -unfilled */ 27a35fc07aSschwarze MDOC_Literal, /* -literal */ 28a35fc07aSschwarze MDOC_File, /* -file */ 29a35fc07aSschwarze MDOC_Offset, /* -offset */ 30a35fc07aSschwarze MDOC_Bullet, /* -bullet */ 31a35fc07aSschwarze MDOC_Dash, /* -dash */ 32a35fc07aSschwarze MDOC_Hyphen, /* -hyphen */ 33a35fc07aSschwarze MDOC_Item, /* -item */ 34a35fc07aSschwarze MDOC_Enum, /* -enum */ 35a35fc07aSschwarze MDOC_Tag, /* -tag */ 36a35fc07aSschwarze MDOC_Diag, /* -diag */ 37a35fc07aSschwarze MDOC_Hang, /* -hang */ 38a35fc07aSschwarze MDOC_Ohang, /* -ohang */ 39a35fc07aSschwarze MDOC_Inset, /* -inset */ 40a35fc07aSschwarze MDOC_Column, /* -column */ 41a35fc07aSschwarze MDOC_Width, /* -width */ 42a35fc07aSschwarze MDOC_Compact, /* -compact */ 43a35fc07aSschwarze MDOC_Std, /* -std */ 44a35fc07aSschwarze MDOC_Filled, /* -filled */ 45a35fc07aSschwarze MDOC_Words, /* -words */ 46a35fc07aSschwarze MDOC_Emphasis, /* -emphasis */ 47a35fc07aSschwarze MDOC_Symbolic, /* -symbolic */ 48a35fc07aSschwarze MDOC_Nested, /* -nested */ 49a35fc07aSschwarze MDOC_Centred, /* -centered */ 50ddce0b0cSschwarze MDOC_ARG_MAX 51ddce0b0cSschwarze }; 52f73abda9Skristaps 535a0a1f76Sschwarze /* 545a0a1f76Sschwarze * An argument to a macro (multiple values = `-column xxx yyy'). 555a0a1f76Sschwarze */ 56f73abda9Skristaps struct mdoc_argv { 575a0a1f76Sschwarze enum mdocargt arg; /* type of argument */ 58f73abda9Skristaps int line; 59f73abda9Skristaps int pos; 605a0a1f76Sschwarze size_t sz; /* elements in "value" */ 615a0a1f76Sschwarze char **value; /* argument strings */ 62f73abda9Skristaps }; 63f73abda9Skristaps 645a0a1f76Sschwarze /* 655a0a1f76Sschwarze * Reference-counted macro arguments. These are refcounted because 665a0a1f76Sschwarze * blocks have multiple instances of the same arguments spread across 675a0a1f76Sschwarze * the HEAD, BODY, TAIL, and BLOCK node types. 685a0a1f76Sschwarze */ 69f73abda9Skristaps struct mdoc_arg { 70f73abda9Skristaps size_t argc; 71f73abda9Skristaps struct mdoc_argv *argv; 72f73abda9Skristaps unsigned int refcnt; 73f73abda9Skristaps }; 74f73abda9Skristaps 7550e63e03Sschwarze enum mdoc_list { 7650e63e03Sschwarze LIST__NONE = 0, 77a35fc07aSschwarze LIST_bullet, /* -bullet */ 78a35fc07aSschwarze LIST_column, /* -column */ 79a35fc07aSschwarze LIST_dash, /* -dash */ 80a35fc07aSschwarze LIST_diag, /* -diag */ 81a35fc07aSschwarze LIST_enum, /* -enum */ 82a35fc07aSschwarze LIST_hang, /* -hang */ 83a35fc07aSschwarze LIST_hyphen, /* -hyphen */ 84a35fc07aSschwarze LIST_inset, /* -inset */ 85a35fc07aSschwarze LIST_item, /* -item */ 86a35fc07aSschwarze LIST_ohang, /* -ohang */ 87a35fc07aSschwarze LIST_tag, /* -tag */ 88467b61c6Sschwarze LIST_MAX 8950e63e03Sschwarze }; 9050e63e03Sschwarze 9131e23753Sschwarze enum mdoc_disp { 9231e23753Sschwarze DISP__NONE = 0, 932065e47aSschwarze DISP_centered, /* -centered */ 94a35fc07aSschwarze DISP_ragged, /* -ragged */ 95a35fc07aSschwarze DISP_unfilled, /* -unfilled */ 96a35fc07aSschwarze DISP_filled, /* -filled */ 97a35fc07aSschwarze DISP_literal /* -literal */ 9831e23753Sschwarze }; 9931e23753Sschwarze 100769ee804Sschwarze enum mdoc_auth { 101769ee804Sschwarze AUTH__NONE = 0, 102a35fc07aSschwarze AUTH_split, /* -split */ 103a35fc07aSschwarze AUTH_nosplit /* -nosplit */ 104769ee804Sschwarze }; 105769ee804Sschwarze 106769ee804Sschwarze enum mdoc_font { 107769ee804Sschwarze FONT__NONE = 0, 108a35fc07aSschwarze FONT_Em, /* Em, -emphasis */ 109a35fc07aSschwarze FONT_Li, /* Li, -literal */ 110a35fc07aSschwarze FONT_Sy /* Sy, -symbolic */ 111769ee804Sschwarze }; 112769ee804Sschwarze 11331e23753Sschwarze struct mdoc_bd { 11431e23753Sschwarze const char *offs; /* -offset */ 11531e23753Sschwarze enum mdoc_disp type; /* -ragged, etc. */ 11631e23753Sschwarze int comp; /* -compact */ 11731e23753Sschwarze }; 11831e23753Sschwarze 11931e23753Sschwarze struct mdoc_bl { 12031e23753Sschwarze const char *width; /* -width */ 12131e23753Sschwarze const char *offs; /* -offset */ 12231e23753Sschwarze enum mdoc_list type; /* -tag, -enum, etc. */ 12331e23753Sschwarze int comp; /* -compact */ 124769ee804Sschwarze size_t ncols; /* -column arg count */ 125769ee804Sschwarze const char **cols; /* -column val ptr */ 1265eced068Sschwarze int count; /* -enum counter */ 127769ee804Sschwarze }; 128769ee804Sschwarze 129769ee804Sschwarze struct mdoc_bf { 130769ee804Sschwarze enum mdoc_font font; /* font */ 131769ee804Sschwarze }; 132769ee804Sschwarze 133769ee804Sschwarze struct mdoc_an { 134769ee804Sschwarze enum mdoc_auth auth; /* -split, etc. */ 13531e23753Sschwarze }; 13631e23753Sschwarze 1376f207799Sschwarze struct mdoc_rs { 1385d273f35Sschwarze int quote_T; /* whether to quote %T */ 1396f207799Sschwarze }; 1406f207799Sschwarze 1415a0a1f76Sschwarze /* 1425a0a1f76Sschwarze * Consists of normalised node arguments. These should be used instead 1435a0a1f76Sschwarze * of iterating through the mdoc_arg pointers of a node: defaults are 1445a0a1f76Sschwarze * provided, etc. 1455a0a1f76Sschwarze */ 1465a0a1f76Sschwarze union mdoc_data { 1478c62fbf5Sschwarze struct mdoc_an An; 1488c62fbf5Sschwarze struct mdoc_bd Bd; 1498c62fbf5Sschwarze struct mdoc_bf Bf; 1508c62fbf5Sschwarze struct mdoc_bl Bl; 1513a0d07afSschwarze struct roff_node *Es; 1528c62fbf5Sschwarze struct mdoc_rs Rs; 1535a0a1f76Sschwarze }; 1545a0a1f76Sschwarze 155a35fc07aSschwarze /* Names of macro args. Index is enum mdocargt. */ 156f73abda9Skristaps extern const char *const *mdoc_argnames; 157396853b5Sschwarze 158396853b5Sschwarze void mdoc_validate(struct roff_man *); 159