1 .\" $Id: man.3,v 1.25 2010/10/10 09:47:05 kristaps Exp $
3 .\" Copyright (c) 2009-2010 Kristaps Dzonsons <kristaps@bsd.lv>
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.
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.
17 .Dd $Mdocdate: October 10 2010 $
29 .Nd man macro compiler library
33 .Vt extern const char * const * man_macronames;
36 .Fa "struct regset *regs"
41 .Fn man_endparse "struct man *man"
43 .Fn man_free "struct man *man"
44 .Ft "const struct man_meta *"
45 .Fn man_meta "const struct man *man"
46 .Ft "const struct man_node *"
47 .Fn man_node "const struct man *man"
55 .Fn man_reset "struct man *man"
59 library parses lines of
61 input into an abstract syntax tree (AST).
63 In general, applications initiate a parsing sequence with
65 parse each line in a document with
67 close the parsing session with
69 operate over the syntax tree returned by
73 then free all allocated memory with
77 function may be used in order to reset the parser for another input
80 Beyond the full set of macros defined in
84 library also accepts the following macros:
86 .Bl -tag -width Ds -compact
88 Has no effect. Handled as a current-scope line macro.
92 .Pq part of the standard preamble for Perl documentation .
93 Handled as a line macro.
97 .Pq part of the standard preamble for Perl documentation .
98 Handled as a current-scope line macro.
104 .Pq part of the standard preamble for Perl documentation .
105 Handled as a current-scope line macro.
111 Its values are only used privately within the library.
112 .It Vt struct man_node
115 .Sx Abstract Syntax Tree
121 Allocates a parsing structure.
126 Returns NULL on failure.
127 If non-NULL, the pointer must be freed with
130 Reset the parser for another parse routine.
133 behaves as if invoked for the first time.
135 Free all resources of a parser.
136 The pointer is no longer valid after invocation.
138 Parse a nil-terminated line of input.
139 This line should not contain the trailing newline.
140 Returns 0 on failure, 1 on success.
143 is modified by this function.
145 Signals that the parse is complete.
148 is called subsequent to
150 the resulting tree is incomplete.
151 Returns 0 on failure, 1 on success.
153 Returns the first node of the parse.
158 return 0, the tree will be incomplete.
160 Returns the document's parsed meta-data.
161 If this information has not yet been supplied or
165 return 0, the data will be incomplete.
168 The following variables are also defined:
170 .It Va man_macronames
171 An array of string-ified token names.
173 .Ss Abstract Syntax Tree
176 functions produce an abstract syntax tree (AST) describing input in a
178 It may be reviewed at any time with
180 however, if called before
186 fail, it may be incomplete.
188 This AST is governed by the ontological rules dictated in
190 and derives its terminology accordingly.
192 The AST is composed of
194 nodes with element, root and text types as declared by the
197 Each node also provides its parse point (the
202 fields), its position in the tree (the
208 fields) and some type-specific data.
210 The tree itself is arranged according to the following normal form,
211 where capitalised non-terminals represent nodes.
213 .Bl -tag -width "ELEMENTXX" -compact
217 \(<- ELEMENT | TEXT | BLOCK
230 The only elements capable of nesting other elements are those with
231 next-lint scope as documented in
234 The following example reads lines from stdin and parses them, operating
235 on the finished parse tree with
237 This example does not error-check nor free memory upon failure.
238 .Bd -literal -offset indent
241 struct man_node *node;
246 bzero(®s, sizeof(struct regset));
248 man = man_alloc(®s, NULL, NULL);
252 while ((len = getline(&buf, &alloc_len, stdin)) >= 0) {
253 if (len && buflen[len - 1] = '\en')
254 buf[len - 1] = '\e0';
255 if ( ! man_parseln(man, line, buf))
256 errx(1, "man_parseln");
262 if ( ! man_endparse(man))
263 errx(1, "man_endparse");
264 if (NULL == (node = man_node(man)))
271 To compile this, execute
273 .D1 % cc main.c libman.a libmandoc.a
284 library was written by
285 .An Kristaps Dzonsons Aq kristaps@bsd.lv .