9ff1f2ac94
--- MAJOR NEW FEATURES --- * man.conf(5): Design and implement a simpler configuration file format. * man(1): Leverage less(1) -T and :t in a way resembling ctags(1) to jump to the definitions of various terms inside manual pages. * soelim(1): New implementation by Baptiste Daroussin. * privilege limitation: Use OpenBSD pledge(2) or OS X sandbox_init(3) when available. * man.cgi(8): Support short URIs like http://man.openbsd.org/mdoc . * mandoc.css: Use one unified stylesheet rather than three different ones. --- MAJOR FUNCTIONALLY RELEVANT BUGFIXES --- * mdoc(7): Fix multiple aspects of SYNOPSIS .Nm formatting. * man(1): Fix process group handling, avoiding unclean shutdowns. --- PORTABILITY IMPROVEMENTS --- * Correctly use the ohash(3) compatibility implementation even when building without SQLite support. * Add compat glue for building on Solaris 9 and 10. * Let ./configure select a supported RE syntax for word boundaries. * Support LDFLAGS, to be used for example for hardening options. * Avoid mixing putchar(3) and putwchar(3) on the same file descriptor, it resulted in output corruption on some platforms. * Avoid reusing va_lists, use va_copy(3) for better portability. * Do not hardcode the path to the more(1) program. --- MINOR NEW FEATURES --- * roff(7): Implement \n(.$ (number of macro arguments). * roff(7): Fully implement \z (do not advance cursor). * roff(7): Implement the `r' conditional (register exists). * roff(7): Implement \\$* (interpolate all arguments). * roff(7): Parse and ignore \, and \/ (italic corrections). * When there is no -m, no -M, no MANPATH and no /etc/man.conf, fall back to /usr/share/man:/usr/X11R6/man:/usr/local/man. * man(1): Give manuals in purely numerical sections priority over manuals of the same name in sections with an alphabetical suffix. * man.cgi(8): Support "header.html" and "footer.html". * man.cgi(8): Set the "autofocus" attribute on the query text box. * man.cgi(8): Simplify the search form, drop two useless buttons. * man.cgi(8): Delete the pseudo-manpath "mandoc", assume that apropos(1) and man.cgi(8) are installed in the default manpath. --- RELIABILITY BUGFIXES --- * mdoc(7): Avoid a use after free and an assertion failure when nodes are deleted during validation. * mdoc(7): Avoid a NULL pointer access when .Bd has no arguments. * mdoc(7): Avoid a NULL pointer access triggered by mismatching end macros. * mdoc(7): Avoid an assertion when .Fo has no argument. * mdoc(7): Avoid an assertion when .Ta<tab> occurs in .Bl -column. * mdoc(7): Avoid an assertion when a body gets broken and has a tail. * roff(7): Avoid an assertion caused by blanks inside \o. * roff(7): Make .so links to gziped manuals work without mandoc.db(5). * tbl(7): Avoid a use after free when the last line of a layout is empty. * eqn(7): Avoid an infinite loop caused by recursive "define". * makewhatis(8): Avoid a segfault caused by unusual directory structures. * Fix handling of leading, trailing, and double colons in MANPATH and -m. --- MINOR BUGFIXES --- * mdoc(7): Put arguments to end macros of broken partial explicit blocks inside the breaking block. * mdoc(7): Let .Dv force normal font. * mdoc(7): Make trailing whitespace significant in .Bl -tag widths. * mdoc(7): Fix macro interpretation around tabs in .Bl -column. * man(7): Use the default width for .RS without arguments. * man(7): On a new RS nesting level, the saved width starts from the default width, not from the saved width of the previous level. * man(7): Allow .PD in next-line scope. * man(7): Improve handling of empty .HP. * man(7): Improve formatting of .br and .sp inside .HP. * man(7): Do not mistreat empty arguments to font alternating macros as vertical spacing requests. * man(7): Allow fill mode changes in tagged paragraph next-line scope. * man(7): Fix minor bugs in block rewinding and simplify the related code. * man(7): Add missing line breaks before subsection headers. * man(7): Give section and subsection headers hanging indentation. * man(7): Make trailing whitespace significant in .TP widths. * roff(7): Don't allow breaking the output line after hyphens that immediately follow escape sequences. * roff(7): Ignore blank characters at the beginning of conditional blocks. * roff(7): Escape breakable hyphens only after handling input line traps. * roff(7): Reject \[uD800] to \[uDFFF] (surrogates) in the parser. * tbl(7): Allow more than one data field after T} on the same input line. * terminal output: Apply bold and italic to non-ASCII Unicode codepoints. * terminal output: Improve rounding rules for horizontal scaling widths. * HTML output: Render ASCII_NBRSP as " ", not "-". * man(1): Do not match the first part of a name if it continues with a dot. * man(1): Keep working even if the current directory is unusable. * man(1): Better error message when $PAGER is invalid. * makewhatis(8): Improve handling of .Va and .Vt macros. * apropos(1): Print "nothing appropriate" to stderr when appropriate. * apropos(1): Abort with a useful error message when elementary database operations like preparing queries or binding variables fail. --- STRUCTURAL CHANGES, no functional change --- * mdoc(7) and man(7): Unified data structures struct roff_node etc. * mdoc(7) and man(7): Unified node handling library in roff.c. * mdoc(7) and man(7): Seperate validation phase from parsing. * roff(7): Major character table cleanup. * Link with libz rather than forking gunzip(1). --- THANKS TO --- * Baptiste Daroussin (FreeBSD) for the new soelim(1) and for release testing. * Anthony Bentley (OpenBSD) for unifying mandoc.css, two nice patches for man.cgi(8), some documentation patches, some bug reports, and various useful discussions. * Todd Miller (OpenBSD) for lots of help with process group and signal handling, a few patches, some bug reports and some useful discussions. * Jonathan Gray (OpenBSD) for yet more testing with afl(1) again resulting in more than half a dozen important bug reports. * Svyatoslav Mishyn (Crux Linux) for some patches, several bug reports, and extensive release testing. * Christian Neukirchen (void Linux) for a number of compatibility patches and suggestions and several bug reports. * Christos Zoulas (NetBSD) for a bug fix patch and some useful suggestions for cleanup. * Florian Obser (OpenBSD) for a bugfix patch and some bug reports. * Sevan Janiyan for help with Solaris compatibility and release testing on many platforms. * Jan Holzhueter and OpenCSW in general for help with Solaris compatibility, and for providing me with a Solaris 9/10/11 testing environment. * Michael McConville (OpenBSD) for some simple cleanup patches. * Thomas Klausner (NetBSD) for some bug reports and release testing. * Christian Weisgerber, Dmitrij Czarkoff, Igor Sobrado, Ken Westerback, Marc Espie, Mike Belopuhov, Rafael Neves, Ted Unangst, Tim van der Molen, Theo Buehler, Theo de Raadt (OpenBSD), Kurt Jaeger, Dag Erling Smoergrav (FreeBSD), Joerg Sonnenberger (NetBSD), Carsten Kunze (Heirloom troff), Daniel Levai, Fabian Raetz, Jan Stary, Jean-Yves Migeon, Lorenzo Beretta, Markus Waldeck, Maxim Belooussov, Michael Reed, Peter Bray, and Serguey Parkhomovsky for bug reports and feature suggestions. * Alexander Hall, Andrew Fresh, Antoine Jacoutot, Doug Hogan, Jason McIntyre, Jasper Lievisse Adriaanse, Kent Spillner, Nicholas Marriott, Peter Hessler, Sebastien Marie, Stefan Sperling, and Theo de Raadt (OpenBSD) for helpful discussions and feedback.
526 lines
8.8 KiB
Groff
526 lines
8.8 KiB
Groff
.Dd December 1, 2014
|
|
.Dt MANDOC_HEADERS 3
|
|
.Os
|
|
.Sh NAME
|
|
.Nm mandoc_headers
|
|
.Nd ordering of mandoc include files
|
|
.Sh DESCRIPTION
|
|
To support a cleaner coding style, the mandoc header files do not
|
|
contain any include directives and do not guard against multiple
|
|
inclusion.
|
|
The application developer has to make sure that the headers are
|
|
included in a proper order, and that no header is included more
|
|
than once.
|
|
.Pp
|
|
The headers and functions form three major groups:
|
|
.Sx Parser interface ,
|
|
.Sx Parser internals ,
|
|
and
|
|
.Sx Formatter interface .
|
|
.Pp
|
|
Various rules are given below prohibiting the inclusion of certain
|
|
combinations of headers into the same file.
|
|
The intention is to keep the following functional components
|
|
separate from each other:
|
|
.Pp
|
|
.Bl -dash -offset indent -compact
|
|
.It
|
|
.Xr mdoc 7
|
|
parser
|
|
.It
|
|
.Xr man 7
|
|
parser
|
|
.It
|
|
.Xr roff 7
|
|
parser
|
|
.It
|
|
.Xr tbl 7
|
|
parser
|
|
.It
|
|
.Xr eqn 7
|
|
parser
|
|
.It
|
|
terminal formatters
|
|
.It
|
|
HTML formatters
|
|
.It
|
|
search tools
|
|
.El
|
|
.Pp
|
|
Note that mere usage of an opaque struct type does
|
|
.Em not
|
|
require inclusion of the header where that type is defined.
|
|
.Ss Parser interface
|
|
Each of the following headers can be included without including
|
|
any other mandoc header.
|
|
These headers should be included before any other mandoc headers.
|
|
.Bl -tag -width Ds
|
|
.It Qq Pa mandoc_aux.h
|
|
Requires
|
|
.In sys/types.h
|
|
for
|
|
.Vt size_t .
|
|
Provides the utility functions documented in
|
|
.Xr mandoc_malloc 3 .
|
|
.It Qq Pa mandoc_ohash.h
|
|
Includes
|
|
.In ohash.h
|
|
and provides
|
|
.Fn mandoc_ohash_init .
|
|
.It Qq Pa mandoc.h
|
|
Requires
|
|
.In sys/types.h
|
|
for
|
|
.Vt size_t .
|
|
.Pp
|
|
Provides
|
|
.Vt enum mandoc_esc ,
|
|
.Vt enum mandocerr ,
|
|
.Vt enum mandoclevel ,
|
|
.Vt enum tbl_cellt ,
|
|
.Vt enum tbl_datt ,
|
|
.Vt enum tbl_spant ,
|
|
.Vt enum eqn_boxt ,
|
|
.Vt enum eqn_fontt ,
|
|
.Vt enum eqn_pilet ,
|
|
.Vt enum eqn_post ,
|
|
.Vt struct tbl_opts ,
|
|
.Vt struct tbl_cell ,
|
|
.Vt struct tbl_row ,
|
|
.Vt struct tbl_dat ,
|
|
.Vt struct tbl_span ,
|
|
.Vt struct eqn_box ,
|
|
.Vt struct eqn ,
|
|
the function prototype typedef
|
|
.Fn mandocmsg ,
|
|
the function
|
|
.Xr mandoc_escape 3 ,
|
|
the functions described in
|
|
.Xr mchars_alloc 3 ,
|
|
and the functions
|
|
.Fn mparse_*
|
|
described in
|
|
.Xr mandoc 3 .
|
|
.Pp
|
|
Uses the opaque type
|
|
.Vt struct mparse
|
|
from
|
|
.Pa read.c
|
|
for function prototypes.
|
|
Uses the type
|
|
.Vt struct roff_man
|
|
from
|
|
.Pa roff.h
|
|
as an opaque type for function prototypes.
|
|
.It Qq Pa roff.h
|
|
Provides
|
|
.Vt enum mdoc_endbody ,
|
|
.Vt enum roff_macroset ,
|
|
.Vt enum roff_next ,
|
|
.Vt enum roff_sec ,
|
|
.Vt enum roff_type ,
|
|
.Vt struct roff_man ,
|
|
.Vt struct roff_meta ,
|
|
.Vt struct roff_node ,
|
|
and the function
|
|
.Fn deroff .
|
|
.Pp
|
|
Uses pointers to the types
|
|
.Vt struct mdoc_arg
|
|
and
|
|
.Vt union mdoc_data
|
|
from
|
|
.Pa mdoc.h
|
|
as opaque struct members.
|
|
.El
|
|
.Pp
|
|
The following two require
|
|
.Qq Pa roff.h
|
|
but no other mandoc headers.
|
|
Afterwards, any other mandoc headers can be included as needed.
|
|
.Bl -tag -width Ds
|
|
.It Qq Pa mdoc.h
|
|
Requires
|
|
.In sys/types.h
|
|
for
|
|
.Vt size_t .
|
|
.Pp
|
|
Provides
|
|
.Vt enum mdocargt ,
|
|
.Vt enum mdoc_auth ,
|
|
.Vt enum mdoc_disp ,
|
|
.Vt enum mdoc_font ,
|
|
.Vt enum mdoc_list ,
|
|
.Vt struct mdoc_argv ,
|
|
.Vt struct mdoc_arg ,
|
|
.Vt struct mdoc_an ,
|
|
.Vt struct mdoc_bd ,
|
|
.Vt struct mdoc_bf ,
|
|
.Vt struct mdoc_bl ,
|
|
.Vt struct mdoc_rs ,
|
|
.Vt union mdoc_data ,
|
|
and the functions
|
|
.Fn mdoc_*
|
|
described in
|
|
.Xr mandoc 3 .
|
|
.Pp
|
|
Uses the type
|
|
.Vt struct roff_man
|
|
from
|
|
.Pa roff.h
|
|
as an opaque type for function prototypes.
|
|
.Pp
|
|
When this header is included, the same file should not include
|
|
.Pa libman.h
|
|
or
|
|
.Pa libroff.h .
|
|
.It Qq Pa man.h
|
|
Provides the functions
|
|
.Fn man_*
|
|
described in
|
|
.Xr mandoc 3 .
|
|
.Pp
|
|
Uses the opaque type
|
|
.Vt struct mparse
|
|
from
|
|
.Pa read.c
|
|
for function prototypes.
|
|
Uses the type
|
|
.Vt struct roff_man
|
|
from
|
|
.Pa roff.h
|
|
as an opaque type for function prototypes.
|
|
.Pp
|
|
When this header is included, the same file should not include
|
|
.Pa libmdoc.h
|
|
or
|
|
.Pa libroff.h .
|
|
.El
|
|
.Ss Parser internals
|
|
The following headers require inclusion of a parser interface header
|
|
before they can be included. All parser interface headers should
|
|
precede all parser internal headers. When any parser internal headers
|
|
are included, the same file should not include any formatter headers.
|
|
.Bl -tag -width Ds
|
|
.It Qq Pa libmandoc.h
|
|
Requires
|
|
.In sys/types.h
|
|
for
|
|
.Vt size_t
|
|
and
|
|
.Qq Pa mandoc.h
|
|
for
|
|
.Vt enum mandocerr .
|
|
.Pp
|
|
Provides
|
|
.Vt enum rofferr ,
|
|
.Vt struct buf ,
|
|
utility functions needed by multiple parsers,
|
|
and the top-level functions to call the parsers.
|
|
.Pp
|
|
Uses the opaque types
|
|
.Vt struct mparse
|
|
from
|
|
.Pa read.c
|
|
and
|
|
.Vt struct roff
|
|
from
|
|
.Pa roff.c
|
|
for function prototypes.
|
|
Uses the types
|
|
.Vt struct tbl_span
|
|
and
|
|
.Vt struct eqn
|
|
from
|
|
.Pa mandoc.h
|
|
and
|
|
.Vt struct roff_man
|
|
from
|
|
.Pa roff.h
|
|
as opaque types for function prototypes.
|
|
.It Qq Pa roff_int.h
|
|
Requires
|
|
.Qq Pa roff.h
|
|
for
|
|
.Vt enum roff_type .
|
|
.Pp
|
|
Provides functions named
|
|
.Fn roff_*
|
|
to handle roff nodes and the two special functions
|
|
.Fn man_breakscope
|
|
and
|
|
.Fn mdoc_argv_free
|
|
because the latter two are needed by
|
|
.Qq Pa roff.c .
|
|
.Pp
|
|
Uses the types
|
|
.Vt struct eqn
|
|
and
|
|
.Vt struct tbl_span
|
|
from
|
|
.Pa mandoc.h ,
|
|
.Vt struct roff_man
|
|
and
|
|
.Vt struct roff_node
|
|
from
|
|
.Pa roff.h ,
|
|
and
|
|
.Vt struct mdoc_arg
|
|
from
|
|
.Pa mdoc.h
|
|
as opaque types for function prototypes.
|
|
.It Qq Pa libmdoc.h
|
|
Requires
|
|
.Qq Pa mdoc.h
|
|
for
|
|
.Vt enum mdoc_*
|
|
and
|
|
.Vt struct mdoc_* .
|
|
.Pp
|
|
Provides
|
|
.Vt enum margserr ,
|
|
.Vt enum mdelim ,
|
|
.Vt struct mdoc_macro ,
|
|
and many functions internal to the
|
|
.Xr mdoc 7
|
|
parser.
|
|
.Pp
|
|
Uses the opaque type
|
|
.Vt struct mparse
|
|
from
|
|
.Pa read.c .
|
|
Uses the types
|
|
.Vt struct roff_man
|
|
and
|
|
.Vt struct roff_node
|
|
from
|
|
.Pa roff.h
|
|
as opaque types for function prototypes.
|
|
.Pp
|
|
When this header is included, the same file should not include
|
|
.Pa man.h ,
|
|
.Pa libman.h ,
|
|
or
|
|
.Pa libroff.h .
|
|
.It Qq Pa libman.h
|
|
Provides
|
|
.Vt struct man_macro
|
|
and some functions internal to the
|
|
.Xr man 7
|
|
parser.
|
|
.Pp
|
|
Uses the types
|
|
.Vt struct roff_man
|
|
and
|
|
.Vt struct roff_node
|
|
from
|
|
.Pa roff.h
|
|
as opaque types for function prototypes.
|
|
.Pp
|
|
When this header is included, the same file should not include
|
|
.Pa mdoc.h ,
|
|
.Pa libmdoc.h ,
|
|
or
|
|
.Pa libroff.h .
|
|
.It Qq Pa libroff.h
|
|
Requires
|
|
.In sys/types.h
|
|
for
|
|
.Vt size_t ,
|
|
.Qq Pa mandoc.h
|
|
for
|
|
.Vt struct tbl_*
|
|
and
|
|
.Vt struct eqn ,
|
|
and
|
|
.Qq Pa libmandoc.h
|
|
for
|
|
.Vt enum rofferr .
|
|
.Pp
|
|
Provides
|
|
.Vt enum tbl_part ,
|
|
.Vt struct tbl_node ,
|
|
.Vt struct eqn_def ,
|
|
.Vt struct eqn_node ,
|
|
and many functions internal to the
|
|
.Xr tbl 7
|
|
and
|
|
.Xr eqn 7
|
|
parsers.
|
|
.Pp
|
|
Uses the opaque type
|
|
.Vt struct mparse
|
|
from
|
|
.Pa read.c .
|
|
.Pp
|
|
When this header is included, the same file should not include
|
|
.Pa man.h ,
|
|
.Pa mdoc.h ,
|
|
.Pa libman.h ,
|
|
or
|
|
.Pa libmdoc.h .
|
|
.El
|
|
.Ss Formatter interface
|
|
These headers should be included after any parser interface headers.
|
|
No parser internal headers should be included by the same file.
|
|
.Bl -tag -width Ds
|
|
.It Qq Pa out.h
|
|
Requires
|
|
.In sys/types.h
|
|
for
|
|
.Vt size_t .
|
|
.Pp
|
|
Provides
|
|
.Vt enum roffscale ,
|
|
.Vt struct roffcol ,
|
|
.Vt struct roffsu ,
|
|
.Vt struct rofftbl ,
|
|
.Fn a2roffsu ,
|
|
and
|
|
.Fn tblcalc .
|
|
.Pp
|
|
Uses
|
|
.Vt struct tbl_span
|
|
from
|
|
.Pa mandoc.h
|
|
as an opaque type for function prototypes.
|
|
.Pp
|
|
When this header is included, the same file should not include
|
|
.Pa mansearch.h .
|
|
.It Qq Pa term.h
|
|
Requires
|
|
.In sys/types.h
|
|
for
|
|
.Vt size_t
|
|
and
|
|
.Qq Pa out.h
|
|
for
|
|
.Vt struct roffsu
|
|
and
|
|
.Vt struct rofftbl .
|
|
.Pp
|
|
Provides
|
|
.Vt enum termenc ,
|
|
.Vt enum termfont ,
|
|
.Vt enum termtype ,
|
|
.Vt struct termp_tbl ,
|
|
.Vt struct termp ,
|
|
and many terminal formatting functions.
|
|
.Pp
|
|
Uses the opaque type
|
|
.Vt struct termp_ps
|
|
from
|
|
.Pa term_ps.c .
|
|
Uses
|
|
.Vt struct tbl_span
|
|
and
|
|
.Vt struct eqn
|
|
from
|
|
.Pa mandoc.h
|
|
and
|
|
.Vt struct roff_meta
|
|
from
|
|
.Pa roff.h
|
|
as opaque types for function prototypes.
|
|
.Pp
|
|
When this header is included, the same file should not include
|
|
.Pa html.h
|
|
or
|
|
.Pa mansearch.h .
|
|
.It Qq Pa html.h
|
|
Requires
|
|
.In sys/types.h
|
|
for
|
|
.Vt size_t ,
|
|
.In stdio.h
|
|
for
|
|
.Dv BUFSIZ ,
|
|
and
|
|
.Qq Pa out.h
|
|
for
|
|
.Vt struct roffsu
|
|
and
|
|
.Vt struct rofftbl .
|
|
.Pp
|
|
Provides
|
|
.Vt enum htmltag ,
|
|
.Vt enum htmlattr ,
|
|
.Vt enum htmlfont ,
|
|
.Vt struct tag ,
|
|
.Vt struct tagq ,
|
|
.Vt struct htmlpair ,
|
|
.Vt struct html ,
|
|
and many HTML formatting functions.
|
|
.Pp
|
|
When this header is included, the same file should not include
|
|
.Pa term.h
|
|
or
|
|
.Pa mansearch.h .
|
|
.It Qq Pa tag.h
|
|
Requires
|
|
.In sys/types.h
|
|
for
|
|
.Vt size_t .
|
|
.Pp
|
|
Provides an interface to generate
|
|
.Xr ctags 1
|
|
files for the
|
|
.Ic :t
|
|
functionality mentioned in
|
|
.Xr man 1 .
|
|
.It Qq Pa main.h
|
|
Provides the top level steering functions for all formatters.
|
|
.Pp
|
|
Uses the type
|
|
.Vt struct roff_man
|
|
from
|
|
.Pa roff.h
|
|
as an opaque type for function prototypes.
|
|
.It Qq Pa manconf.h
|
|
Requires
|
|
.In sys/types.h
|
|
for
|
|
.Vt size_t .
|
|
.Pp
|
|
Provides
|
|
.Vt struct manconf ,
|
|
.Vt struct manpaths ,
|
|
.Vt struct manoutput ,
|
|
and the functions
|
|
.Fn manconf_parse ,
|
|
.Fn manconf_output ,
|
|
and
|
|
.Fn manconf_free .
|
|
.It Qq Pa mansearch.h
|
|
Requires
|
|
.In sys/types.h
|
|
for
|
|
.Vt size_t
|
|
and
|
|
.In stdint.h
|
|
for
|
|
.Vt uint64_t .
|
|
.Pp
|
|
Provides
|
|
.Vt enum argmode ,
|
|
.Vt struct manpage ,
|
|
.Vt struct mansearch ,
|
|
and the functions
|
|
.Fn mansearch_setup ,
|
|
.Fn mansearch ,
|
|
and
|
|
.Fn mansearch_free .
|
|
.Pp
|
|
Uses
|
|
.Vt struct manpaths
|
|
from
|
|
.Pa manconf.h
|
|
as an opaque type for function prototypes.
|
|
.Pp
|
|
When this header is included, the same file should not include
|
|
.Pa out.h ,
|
|
.Pa term.h ,
|
|
or
|
|
.Pa html.h .
|
|
.El
|