1 /* $Id: mdoc.h,v 1.144 2015/11/07 14:01:16 schwarze Exp $ */ 2 /* 3 * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> 4 * Copyright (c) 2014, 2015 Ingo Schwarze <schwarze@openbsd.org> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 #define MDOC_Ap 0 20 #define MDOC_Dd 1 21 #define MDOC_Dt 2 22 #define MDOC_Os 3 23 #define MDOC_Sh 4 24 #define MDOC_Ss 5 25 #define MDOC_Pp 6 26 #define MDOC_D1 7 27 #define MDOC_Dl 8 28 #define MDOC_Bd 9 29 #define MDOC_Ed 10 30 #define MDOC_Bl 11 31 #define MDOC_El 12 32 #define MDOC_It 13 33 #define MDOC_Ad 14 34 #define MDOC_An 15 35 #define MDOC_Ar 16 36 #define MDOC_Cd 17 37 #define MDOC_Cm 18 38 #define MDOC_Dv 19 39 #define MDOC_Er 20 40 #define MDOC_Ev 21 41 #define MDOC_Ex 22 42 #define MDOC_Fa 23 43 #define MDOC_Fd 24 44 #define MDOC_Fl 25 45 #define MDOC_Fn 26 46 #define MDOC_Ft 27 47 #define MDOC_Ic 28 48 #define MDOC_In 29 49 #define MDOC_Li 30 50 #define MDOC_Nd 31 51 #define MDOC_Nm 32 52 #define MDOC_Op 33 53 #define MDOC_Ot 34 54 #define MDOC_Pa 35 55 #define MDOC_Rv 36 56 #define MDOC_St 37 57 #define MDOC_Va 38 58 #define MDOC_Vt 39 59 #define MDOC_Xr 40 60 #define MDOC__A 41 61 #define MDOC__B 42 62 #define MDOC__D 43 63 #define MDOC__I 44 64 #define MDOC__J 45 65 #define MDOC__N 46 66 #define MDOC__O 47 67 #define MDOC__P 48 68 #define MDOC__R 49 69 #define MDOC__T 50 70 #define MDOC__V 51 71 #define MDOC_Ac 52 72 #define MDOC_Ao 53 73 #define MDOC_Aq 54 74 #define MDOC_At 55 75 #define MDOC_Bc 56 76 #define MDOC_Bf 57 77 #define MDOC_Bo 58 78 #define MDOC_Bq 59 79 #define MDOC_Bsx 60 80 #define MDOC_Bx 61 81 #define MDOC_Db 62 82 #define MDOC_Dc 63 83 #define MDOC_Do 64 84 #define MDOC_Dq 65 85 #define MDOC_Ec 66 86 #define MDOC_Ef 67 87 #define MDOC_Em 68 88 #define MDOC_Eo 69 89 #define MDOC_Fx 70 90 #define MDOC_Ms 71 91 #define MDOC_No 72 92 #define MDOC_Ns 73 93 #define MDOC_Nx 74 94 #define MDOC_Ox 75 95 #define MDOC_Pc 76 96 #define MDOC_Pf 77 97 #define MDOC_Po 78 98 #define MDOC_Pq 79 99 #define MDOC_Qc 80 100 #define MDOC_Ql 81 101 #define MDOC_Qo 82 102 #define MDOC_Qq 83 103 #define MDOC_Re 84 104 #define MDOC_Rs 85 105 #define MDOC_Sc 86 106 #define MDOC_So 87 107 #define MDOC_Sq 88 108 #define MDOC_Sm 89 109 #define MDOC_Sx 90 110 #define MDOC_Sy 91 111 #define MDOC_Tn 92 112 #define MDOC_Ux 93 113 #define MDOC_Xc 94 114 #define MDOC_Xo 95 115 #define MDOC_Fo 96 116 #define MDOC_Fc 97 117 #define MDOC_Oo 98 118 #define MDOC_Oc 99 119 #define MDOC_Bk 100 120 #define MDOC_Ek 101 121 #define MDOC_Bt 102 122 #define MDOC_Hf 103 123 #define MDOC_Fr 104 124 #define MDOC_Ud 105 125 #define MDOC_Lb 106 126 #define MDOC_Lp 107 127 #define MDOC_Lk 108 128 #define MDOC_Mt 109 129 #define MDOC_Brq 110 130 #define MDOC_Bro 111 131 #define MDOC_Brc 112 132 #define MDOC__C 113 133 #define MDOC_Es 114 134 #define MDOC_En 115 135 #define MDOC_Dx 116 136 #define MDOC__Q 117 137 #define MDOC_br 118 138 #define MDOC_sp 119 139 #define MDOC__U 120 140 #define MDOC_Ta 121 141 #define MDOC_ll 122 142 #define MDOC_MAX 123 143 144 enum mdocargt { 145 MDOC_Split, /* -split */ 146 MDOC_Nosplit, /* -nospli */ 147 MDOC_Ragged, /* -ragged */ 148 MDOC_Unfilled, /* -unfilled */ 149 MDOC_Literal, /* -literal */ 150 MDOC_File, /* -file */ 151 MDOC_Offset, /* -offset */ 152 MDOC_Bullet, /* -bullet */ 153 MDOC_Dash, /* -dash */ 154 MDOC_Hyphen, /* -hyphen */ 155 MDOC_Item, /* -item */ 156 MDOC_Enum, /* -enum */ 157 MDOC_Tag, /* -tag */ 158 MDOC_Diag, /* -diag */ 159 MDOC_Hang, /* -hang */ 160 MDOC_Ohang, /* -ohang */ 161 MDOC_Inset, /* -inset */ 162 MDOC_Column, /* -column */ 163 MDOC_Width, /* -width */ 164 MDOC_Compact, /* -compact */ 165 MDOC_Std, /* -std */ 166 MDOC_Filled, /* -filled */ 167 MDOC_Words, /* -words */ 168 MDOC_Emphasis, /* -emphasis */ 169 MDOC_Symbolic, /* -symbolic */ 170 MDOC_Nested, /* -nested */ 171 MDOC_Centred, /* -centered */ 172 MDOC_ARG_MAX 173 }; 174 175 /* 176 * An argument to a macro (multiple values = `-column xxx yyy'). 177 */ 178 struct mdoc_argv { 179 enum mdocargt arg; /* type of argument */ 180 int line; 181 int pos; 182 size_t sz; /* elements in "value" */ 183 char **value; /* argument strings */ 184 }; 185 186 /* 187 * Reference-counted macro arguments. These are refcounted because 188 * blocks have multiple instances of the same arguments spread across 189 * the HEAD, BODY, TAIL, and BLOCK node types. 190 */ 191 struct mdoc_arg { 192 size_t argc; 193 struct mdoc_argv *argv; 194 unsigned int refcnt; 195 }; 196 197 enum mdoc_list { 198 LIST__NONE = 0, 199 LIST_bullet, /* -bullet */ 200 LIST_column, /* -column */ 201 LIST_dash, /* -dash */ 202 LIST_diag, /* -diag */ 203 LIST_enum, /* -enum */ 204 LIST_hang, /* -hang */ 205 LIST_hyphen, /* -hyphen */ 206 LIST_inset, /* -inset */ 207 LIST_item, /* -item */ 208 LIST_ohang, /* -ohang */ 209 LIST_tag, /* -tag */ 210 LIST_MAX 211 }; 212 213 enum mdoc_disp { 214 DISP__NONE = 0, 215 DISP_centered, /* -centered */ 216 DISP_ragged, /* -ragged */ 217 DISP_unfilled, /* -unfilled */ 218 DISP_filled, /* -filled */ 219 DISP_literal /* -literal */ 220 }; 221 222 enum mdoc_auth { 223 AUTH__NONE = 0, 224 AUTH_split, /* -split */ 225 AUTH_nosplit /* -nosplit */ 226 }; 227 228 enum mdoc_font { 229 FONT__NONE = 0, 230 FONT_Em, /* Em, -emphasis */ 231 FONT_Li, /* Li, -literal */ 232 FONT_Sy /* Sy, -symbolic */ 233 }; 234 235 struct mdoc_bd { 236 const char *offs; /* -offset */ 237 enum mdoc_disp type; /* -ragged, etc. */ 238 int comp; /* -compact */ 239 }; 240 241 struct mdoc_bl { 242 const char *width; /* -width */ 243 const char *offs; /* -offset */ 244 enum mdoc_list type; /* -tag, -enum, etc. */ 245 int comp; /* -compact */ 246 size_t ncols; /* -column arg count */ 247 const char **cols; /* -column val ptr */ 248 int count; /* -enum counter */ 249 }; 250 251 struct mdoc_bf { 252 enum mdoc_font font; /* font */ 253 }; 254 255 struct mdoc_an { 256 enum mdoc_auth auth; /* -split, etc. */ 257 }; 258 259 struct mdoc_rs { 260 int quote_T; /* whether to quote %T */ 261 }; 262 263 /* 264 * Consists of normalised node arguments. These should be used instead 265 * of iterating through the mdoc_arg pointers of a node: defaults are 266 * provided, etc. 267 */ 268 union mdoc_data { 269 struct mdoc_an An; 270 struct mdoc_bd Bd; 271 struct mdoc_bf Bf; 272 struct mdoc_bl Bl; 273 struct roff_node *Es; 274 struct mdoc_rs Rs; 275 }; 276 277 /* Names of macros. */ 278 extern const char *const *mdoc_macronames; 279 280 /* Names of macro args. Index is enum mdocargt. */ 281 extern const char *const *mdoc_argnames; 282 283 284 void mdoc_validate(struct roff_man *); 285