1.\" $Id: mandoc_headers.3,v 1.31 2019/03/17 18:21:45 schwarze Exp $ 2.\" 3.\" Copyright (c) 2014-2019 Ingo Schwarze <schwarze@openbsd.org> 4.\" 5.\" Permission to use, copy, modify, and distribute this software for any 6.\" purpose with or without fee is hereby granted, provided that the above 7.\" copyright notice and this permission notice appear in all copies. 8.\" 9.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16.\" 17.Dd $Mdocdate: March 17 2019 $ 18.Dt MANDOC_HEADERS 3 19.Os 20.Sh NAME 21.Nm mandoc_headers 22.Nd ordering of mandoc include files 23.Sh DESCRIPTION 24To support a cleaner coding style, the mandoc header files do not 25contain any include directives and do not guard against multiple 26inclusion. 27The application developer has to make sure that the headers are 28included in a proper order, and that no header is included more 29than once. 30.Pp 31The headers and functions form three major groups: 32.Sx Parser interface , 33.Sx Parser internals , 34and 35.Sx Formatter interface . 36.Pp 37Various rules are given below prohibiting the inclusion of certain 38combinations of headers into the same file. 39The intention is to keep the following functional components 40separate from each other: 41.Pp 42.Bl -dash -offset indent -compact 43.It 44.Xr roff 7 45parser 46.It 47.Xr mdoc 7 48parser 49.It 50.Xr man 7 51parser 52.It 53.Xr tbl 7 54parser 55.It 56.Xr eqn 7 57parser 58.It 59terminal formatters 60.It 61HTML formatters 62.It 63search tools 64.It 65main programs 66.El 67.Pp 68Note that mere usage of an opaque struct type does 69.Em not 70require inclusion of the header where that type is defined. 71.Ss Parser interface 72Each of the following headers can be included without including 73any other mandoc header. 74These headers should be included before any other mandoc headers. 75.Bl -tag -width Ds 76.It Qq Pa mandoc_aux.h 77Memory allocation utility functions; can be used everywhere. 78.Pp 79Requires 80.In sys/types.h 81for 82.Vt size_t . 83.Pp 84Provides the functions documented in 85.Xr mandoc_malloc 3 . 86.It Qq Pa mandoc_ohash.h 87Hashing utility functions; can be used everywhere. 88.Pp 89Requires 90.In stddef.h 91for 92.Vt ptrdiff_t 93and 94.In stdint.h 95for 96.Vt uint32_t . 97.Pp 98Includes 99.In ohash.h 100and provides 101.Fn mandoc_ohash_init . 102.It Qq Pa mandoc.h 103Error handling, escape sequence, and character utilities; 104can be used everywhere. 105.Pp 106Requires 107.In sys/types.h 108for 109.Vt size_t 110and 111.In stdio.h 112for 113.Vt FILE . 114.Pp 115Provides 116.Vt enum mandoc_esc , 117.Vt enum mandocerr , 118.Vt enum mandoclevel , 119the function 120.Xr mandoc_escape 3 , 121the functions described in 122.Xr mchars_alloc 3 , 123and the 124.Fn mandoc_msg* 125functions. 126.It Qq Pa roff.h 127Common data types for all syntax trees and related functions; 128can be used everywhere. 129.Pp 130Provides 131.Vt enum mandoc_os , 132.Vt enum mdoc_endbody , 133.Vt enum roff_macroset , 134.Vt enum roff_sec , 135.Vt enum roff_tok , 136.Vt enum roff_type , 137.Vt struct roff_man , 138.Vt struct roff_meta , 139.Vt struct roff_node , 140the constant array 141.Va roff_name 142and the function 143.Fn deroff . 144.Pp 145Uses pointers to the types 146.Vt struct ohash 147from 148.Qq Pa mandoc_ohash.h , 149.Vt struct mdoc_arg 150and 151.Vt union mdoc_data 152from 153.Qq Pa mdoc.h , 154.Vt struct tbl_span 155from 156.Qq Pa tbl.h , 157and 158.Vt struct eqn_box 159from 160.Qq Pa eqn.h 161as opaque struct members. 162.It Qq Pa tbl.h 163Data structures for the 164.Xr tbl 7 165parse tree; can be used everywhere. 166.Pp 167Requires 168.In sys/types.h 169for 170.Vt size_t . 171.Pp 172Provides 173.Vt enum tbl_cellt , 174.Vt enum tbl_datt , 175.Vt enum tbl_spant , 176.Vt struct tbl_opts , 177.Vt struct tbl_cell , 178.Vt struct tbl_row , 179.Vt struct tbl_dat , 180and 181.Vt struct tbl_span . 182.It Qq Pa eqn.h 183Data structures for the 184.Xr eqn 7 185parse tree; can be used everywhere. 186.Pp 187Requires 188.In sys/types.h 189for 190.Vt size_t . 191.Pp 192Provides 193.Vt enum eqn_boxt , 194.Vt enum eqn_fontt , 195.Vt enum eqn_post , 196and 197.Vt struct eqn_box . 198.It Qq Pa mandoc_parse.h 199Top level parser interface, for use in the main program 200and in the main parser, but not in formatters. 201.Pp 202Requires 203.Qq Pa mandoc.h 204for 205.Vt enum mandocerr 206and 207.Vt enum mandoclevel 208and 209.Qq Pa roff.h 210for 211.Vt enum mandoc_os . 212.Pp 213Uses the opaque type 214.Vt struct mparse 215from 216.Pa read.c 217for function prototypes. 218Uses 219.Vt struct roff_meta 220from 221.Qq Pa roff.h 222as an opaque type for function prototypes. 223.It Qq Pa mandoc_xr.h 224Cross reference validation; intended for use in the main program 225and in parsers, but not in formatters. 226.Pp 227Provides 228.Vt struct mandoc_xr 229and the functions 230.Fn mandoc_xr_reset , 231.Fn mandoc_xr_add , 232.Fn mandoc_xr_get , 233and 234.Fn mandoc_xr_free . 235.El 236.Pp 237The following two require 238.Qq Pa roff.h 239but no other mandoc headers. 240Afterwards, any other mandoc headers can be included as needed. 241.Bl -tag -width Ds 242.It Qq Pa mdoc.h 243Requires 244.In sys/types.h 245for 246.Vt size_t . 247.Pp 248Provides 249.Vt enum mdocargt , 250.Vt enum mdoc_auth , 251.Vt enum mdoc_disp , 252.Vt enum mdoc_font , 253.Vt enum mdoc_list , 254.Vt struct mdoc_argv , 255.Vt struct mdoc_arg , 256.Vt struct mdoc_an , 257.Vt struct mdoc_bd , 258.Vt struct mdoc_bf , 259.Vt struct mdoc_bl , 260.Vt struct mdoc_rs , 261.Vt union mdoc_data , 262and the functions 263.Fn mdoc_* 264described in 265.Xr mandoc 3 . 266.Pp 267Uses the types 268.Vt struct roff_node 269from 270.Qq Pa roff.h 271and 272.Vt struct roff_man 273from 274.Qq Pa roff_int.h 275as opaque types for function prototypes. 276.Pp 277When this header is included, the same file should not include 278internals of different parsers. 279.It Qq Pa man.h 280Provides the functions 281.Fn man_* 282described in 283.Xr mandoc 3 . 284.Pp 285Uses the type 286.Vt struct roff_man 287from 288.Qq Pa roff.h 289as an opaque type for function prototypes. 290.Pp 291When this header is included, the same file should not include 292internals of different parsers. 293.El 294.Ss Parser internals 295Most of the following headers require inclusion of a parser interface header 296before they can be included. 297All parser interface headers should precede all parser internal headers. 298When any parser internal headers are included, the same file should 299not include any formatter headers. 300.Bl -tag -width Ds 301.It Qq Pa libmandoc.h 302Requires 303.In sys/types.h 304for 305.Vt size_t 306and 307.Qq Pa mandoc.h 308for 309.Vt enum mandocerr . 310.Pp 311Provides 312.Vt struct buf , 313utility functions needed by multiple parsers, 314and the top-level functions to call the parsers. 315.Pp 316Uses the opaque type 317.Vt struct roff 318from 319.Pa roff.c 320for function prototypes. 321Uses the type 322.Vt struct roff_man 323from 324.Qq Pa roff.h 325as an opaque type for function prototypes. 326.It Qq Pa roff_int.h 327Parser internals shared by multiple parsers. 328Can be used in all parsers, but not in main programs or formatters. 329.Pp 330Requires 331.Qq Pa roff.h 332for 333.Vt enum roff_type 334and 335.Vt enum roff_tok . 336.Pp 337Provides 338.Vt enum roff_next , 339.Vt struct roff_man , 340functions named 341.Fn roff_* 342to handle roff nodes, 343.Fn roffhash_alloc , 344.Fn roffhash_find , 345.Fn roffhash_free , 346and 347.Fn roff_validate , 348and the two special functions 349.Fn man_breakscope 350and 351.Fn mdoc_argv_free 352because the latter two are needed by 353.Pa roff.c . 354.Pp 355Uses the types 356.Vt struct ohash 357from 358.Qq Pa mandoc_ohash.h , 359.Vt struct roff_node 360and 361.Vt struct roff_meta 362from 363.Qq Pa roff.h , 364.Vt struct roff 365from 366.Pa roff.c , 367and 368.Vt struct mdoc_arg 369from 370.Qq Pa mdoc.h 371as opaque types for function prototypes. 372.It Qq Pa libmdoc.h 373Requires 374.Qq Pa roff.h 375for 376.Vt enum roff_tok 377and 378.Vt enum roff_sec . 379.Pp 380Provides 381.Vt enum margserr , 382.Vt enum mdelim , 383.Vt struct mdoc_macro , 384and many functions internal to the 385.Xr mdoc 7 386parser. 387.Pp 388Uses the types 389.Vt struct roff_node 390from 391.Qq Pa roff.h , 392.Vt struct roff_man 393from 394.Qq Pa roff_int.h , 395and 396.Vt struct mdoc_arg 397from 398.Qq Pa mdoc.h 399as opaque types for function prototypes. 400.Pp 401When this header is included, the same file should not include 402interfaces of different parsers. 403.It Qq Pa libman.h 404Requires 405.Qq Pa roff.h 406for 407.Vt enum roff_tok . 408.Pp 409Provides 410.Vt struct man_macro 411and some functions internal to the 412.Xr man 7 413parser. 414.Pp 415Uses the types 416.Vt struct roff_node 417from 418.Qq Pa roff.h 419and 420.Vt struct roff_man 421from 422.Qq Pa roff_int.h 423as opaque types for function prototypes. 424.Pp 425When this header is included, the same file should not include 426interfaces of different parsers. 427.It Qq Pa eqn_parse.h 428External interface of the 429.Xr eqn 7 430parser, for use in the 431.Xr roff 7 432and 433.Xr eqn 7 434parsers only. 435.Pp 436Requires 437.In sys/types.h 438for 439.Vt size_t . 440.Pp 441Provides 442.Vt struct eqn_node 443and the functions 444.Fn eqn_alloc , 445.Fn eqn_box_new , 446.Fn eqn_box_free , 447.Fn eqn_free , 448.Fn eqn_parse , 449.Fn eqn_read , 450and 451.Fn eqn_reset . 452.Pp 453Uses the type 454.Vt struct eqn_box 455from 456.Qq Pa mandoc.h 457as an opaque type for function prototypes. 458Uses the types 459.Vt struct roff_node 460from 461.Qq Pa roff.h 462and 463.Vt struct eqn_def 464from 465.Pa eqn.c 466as opaque struct members. 467.Pp 468When this header is included, the same file should not include 469internals of different parsers. 470.It Qq Pa tbl_parse.h 471External interface of the 472.Xr tbl 7 473parser, for use in the 474.Xr roff 7 475and 476.Xr tbl 7 477parsers only. 478.Pp 479Provides the functions documented in 480.Xr tbl 3 . 481.Pp 482Uses the types 483.Vt struct tbl_span 484from 485.Qq Pa tbl.h 486and 487.Vt struct tbl_node 488from 489.Qq Pa tbl_int.h 490as opaque types for function prototypes. 491.Pp 492When this header is included, the same file should not include 493internals of different parsers. 494.It Qq Pa tbl_int.h 495Internal interfaces of the 496.Xr tbl 7 497parser, for use inside the 498.Xr tbl 7 499parser only. 500.Pp 501Requires 502.Qq Pa tbl.h 503for 504.Vt struct tbl_opts . 505.Pp 506Provides 507.Vt enum tbl_part , 508.Vt struct tbl_node , 509and the functions 510.Fn tbl_option , 511.Fn tbl_layout , 512.Fn tbl_data , 513.Fn tbl_cdata , 514and 515.Fn tbl_reset . 516.Pp 517When this header is included, the same file should not include 518interfaces of different parsers. 519.El 520.Ss Formatter interface 521These headers should be included after any parser interface headers. 522No parser internal headers should be included by the same file. 523.Bl -tag -width Ds 524.It Qq Pa out.h 525Requires 526.In sys/types.h 527for 528.Vt size_t . 529.Pp 530Provides 531.Vt enum roffscale , 532.Vt struct roffcol , 533.Vt struct roffsu , 534.Vt struct rofftbl , 535.Fn a2roffsu , 536and 537.Fn tblcalc . 538.Pp 539Uses 540.Vt struct tbl_span 541from 542.Qq Pa mandoc.h 543as an opaque type for function prototypes. 544.Pp 545When this header is included, the same file should not include 546.Qq Pa mansearch.h . 547.It Qq Pa term.h 548Requires 549.In sys/types.h 550for 551.Vt size_t 552and 553.Qq Pa out.h 554for 555.Vt struct roffsu 556and 557.Vt struct rofftbl . 558.Pp 559Provides 560.Vt enum termenc , 561.Vt enum termfont , 562.Vt enum termtype , 563.Vt struct termp_tbl , 564.Vt struct termp , 565.Fn roff_term_pre , 566and many terminal formatting functions. 567.Pp 568Uses the opaque type 569.Vt struct termp_ps 570from 571.Pa term_ps.c . 572Uses 573.Vt struct tbl_span 574and 575.Vt struct eqn_box 576from 577.Qq Pa mandoc.h 578and 579.Vt struct roff_meta 580and 581.Vt struct roff_node 582from 583.Qq Pa roff.h 584as opaque types for function prototypes. 585.Pp 586When this header is included, the same file should not include 587.Qq Pa html.h 588or 589.Qq Pa mansearch.h . 590.It Qq Pa html.h 591Requires 592.In sys/types.h 593for 594.Vt size_t , 595.Qq Pa mandoc.h 596for 597.Vt enum mandoc_esc , 598.Qq Pa roff.h 599for 600.Vt enum roff_tok , 601and 602.Qq Pa out.h 603for 604.Vt struct roffsu 605and 606.Vt struct rofftbl . 607.Pp 608Provides 609.Vt enum htmltag , 610.Vt enum htmlattr , 611.Vt enum htmlfont , 612.Vt struct tag , 613.Vt struct tagq , 614.Vt struct htmlpair , 615.Vt struct html , 616.Fn roff_html_pre , 617and many HTML formatting functions. 618.Pp 619Uses 620.Vt struct tbl_span 621and 622.Vt struct eqn_box 623from 624.Qq Pa mandoc.h 625and 626.Vt struct roff_node 627from 628.Qq Pa roff.h 629as opaque types for function prototypes. 630.Pp 631When this header is included, the same file should not include 632.Qq Pa term.h 633or 634.Qq Pa mansearch.h . 635.It Qq Pa tag.h 636Requires 637.In sys/types.h 638for 639.Vt size_t . 640.Pp 641Provides an interface to generate 642.Xr ctags 1 643files for the 644.Ic :t 645functionality mentioned in 646.Xr man 1 . 647.It Qq Pa main.h 648Provides the top level steering functions for all formatters. 649.Pp 650Uses the type 651.Vt struct roff_meta 652from 653.Qq Pa roff.h 654as an opaque type for function prototypes. 655.It Qq Pa manconf.h 656Requires 657.In sys/types.h 658for 659.Vt size_t . 660.Pp 661Provides 662.Vt struct manconf , 663.Vt struct manpaths , 664.Vt struct manoutput , 665and the functions 666.Fn manconf_parse , 667.Fn manconf_output , 668.Fn manconf_free , 669and 670.Fn manpath_base . 671.It Qq Pa mansearch.h 672Requires 673.In sys/types.h 674for 675.Vt size_t 676and 677.In stdint.h 678for 679.Vt uint64_t . 680.Pp 681Provides 682.Vt enum argmode , 683.Vt struct manpage , 684.Vt struct mansearch , 685and the functions 686.Fn mansearch 687and 688.Fn mansearch_free . 689.Pp 690Uses 691.Vt struct manpaths 692from 693.Qq Pa manconf.h 694as an opaque type for function prototypes. 695.Pp 696When this header is included, the same file should not include 697.Qq Pa out.h , 698.Qq Pa term.h , 699or 700.Qq Pa html.h . 701.El 702