version 1.8, 2009/08/17 11:10:02 |
version 1.27, 2010/12/17 11:41:45 |
|
|
.\" $Id$ |
.\" $Id$ |
.\" |
.\" |
.\" Copyright (c) 2009 Kristaps Dzonsons <kristaps@kth.se> |
.\" Copyright (c) 2009-2010 Kristaps Dzonsons <kristaps@bsd.lv> |
.\" |
.\" |
.\" Permission to use, copy, modify, and distribute this software for any |
.\" Permission to use, copy, modify, and distribute this software for any |
.\" purpose with or without fee is hereby granted, provided that the above |
.\" purpose with or without fee is hereby granted, provided that the above |
|
|
.Dd $Mdocdate$ |
.Dd $Mdocdate$ |
.Dt MAN 3 |
.Dt MAN 3 |
.Os |
.Os |
.\" SECTION |
|
.Sh NAME |
.Sh NAME |
|
.Nm man , |
.Nm man_alloc , |
.Nm man_alloc , |
.Nm man_parseln , |
|
.Nm man_endparse , |
.Nm man_endparse , |
.Nm man_node , |
|
.Nm man_meta , |
|
.Nm man_free , |
.Nm man_free , |
|
.Nm man_meta , |
|
.Nm man_node , |
|
.Nm man_parseln , |
.Nm man_reset |
.Nm man_reset |
.Nd man macro compiler library |
.Nd man macro compiler library |
.\" SECTION |
|
.Sh SYNOPSIS |
.Sh SYNOPSIS |
.Fd #include <man.h> |
.In mandoc.h |
|
.In man.h |
.Vt extern const char * const * man_macronames; |
.Vt extern const char * const * man_macronames; |
.Ft "struct man *" |
.Ft "struct man *" |
.Fn man_alloc "void *data" "int pflags" "const struct man_cb *cb" |
.Fo man_alloc |
|
.Fa "struct regset *regs" |
|
.Fa "void *data" |
|
.Fa "mandocmsg msgs" |
|
.Fc |
|
.Ft int |
|
.Fn man_endparse "struct man *man" |
.Ft void |
.Ft void |
.Fn man_reset "struct man *man" |
|
.Ft void |
|
.Fn man_free "struct man *man" |
.Fn man_free "struct man *man" |
.Ft int |
|
.Fn man_parseln "struct man *man" "int line" "char *buf" |
|
.Ft "const struct man_node *" |
|
.Fn man_node "const struct man *man" |
|
.Ft "const struct man_meta *" |
.Ft "const struct man_meta *" |
.Fn man_meta "const struct man *man" |
.Fn man_meta "const struct man *man" |
|
.Ft "const struct man_node *" |
|
.Fn man_node "const struct man *man" |
.Ft int |
.Ft int |
.Fn man_endparse "struct man *man" |
.Fo man_parseln |
.\" SECTION |
.Fa "struct man *man" |
|
.Fa "int line" |
|
.Fa "char *buf" |
|
.Fc |
|
.Ft void |
|
.Fn man_reset "struct man *man" |
.Sh DESCRIPTION |
.Sh DESCRIPTION |
The |
The |
.Nm man |
.Nm |
library parses lines of |
library parses lines of |
.Xr man 7 |
.Xr man 7 |
input (and |
input into an abstract syntax tree (AST). |
.Em only |
|
man) into an abstract syntax tree (AST). |
|
.\" PARAGRAPH |
|
.Pp |
.Pp |
In general, applications initiate a parsing sequence with |
In general, applications initiate a parsing sequence with |
.Fn man_alloc , |
.Fn man_alloc , |
Line 71 then free all allocated memory with |
|
Line 75 then free all allocated memory with |
|
The |
The |
.Fn man_reset |
.Fn man_reset |
function may be used in order to reset the parser for another input |
function may be used in order to reset the parser for another input |
sequence. See the |
sequence. |
.Sx EXAMPLES |
|
section for a full example. |
|
.\" PARAGRAPH |
|
.Pp |
.Pp |
This section further defines the |
Beyond the full set of macros defined in |
.Sx Types , |
.Xr man 7 , |
.Sx Functions |
the |
and |
.Nm |
.Sx Variables |
library also accepts the following macro: |
available to programmers. Following that, the |
.Pp |
.Sx Abstract Syntax Tree |
.Bl -tag -width Ds -compact |
section documents the output tree. |
.It PD |
.\" SUBSECTION |
Has no effect. |
|
Handled as a current-scope line macro. |
|
.El |
.Ss Types |
.Ss Types |
Both functions (see |
.Bl -ohang |
.Sx Functions ) |
|
and variables (see |
|
.Sx Variables ) |
|
may use the following types: |
|
.Bl -ohang -offset "XXXX" |
|
.\" LIST-ITEM |
|
.It Vt struct man |
.It Vt struct man |
An opaque type defined in |
An opaque type. |
.Pa man.c . |
|
Its values are only used privately within the library. |
Its values are only used privately within the library. |
.\" LIST-ITEM |
|
.It Vt struct man_cb |
|
A set of message callbacks defined in |
|
.Pa man.h . |
|
.\" LIST-ITEM |
|
.It Vt struct man_node |
.It Vt struct man_node |
A parsed node. Defined in |
A parsed node. |
.Pa man.h . |
|
See |
See |
.Sx Abstract Syntax Tree |
.Sx Abstract Syntax Tree |
for details. |
for details. |
.El |
.El |
.\" SUBSECTION |
|
.Ss Functions |
.Ss Functions |
Function descriptions follow: |
.Bl -ohang |
.Bl -ohang -offset "XXXX" |
|
.\" LIST-ITEM |
|
.It Fn man_alloc |
.It Fn man_alloc |
Allocates a parsing structure. The |
Allocates a parsing structure. |
.Fa data |
|
pointer is passed to callbacks in |
|
.Fa cb , |
|
which are documented further in the header file. |
|
The |
The |
.Fa pflags |
.Fa data |
arguments are defined in |
pointer is passed to |
.Pa man.h . |
.Fa msgs . |
Returns NULL on failure. If non-NULL, the pointer must be freed with |
Returns NULL on failure. |
|
If non-NULL, the pointer must be freed with |
.Fn man_free . |
.Fn man_free . |
.\" LIST-ITEM |
|
.It Fn man_reset |
.It Fn man_reset |
Reset the parser for another parse routine. After its use, |
Reset the parser for another parse routine. |
|
After its use, |
.Fn man_parseln |
.Fn man_parseln |
behaves as if invoked for the first time. |
behaves as if invoked for the first time. |
.\" LIST-ITEM |
|
.It Fn man_free |
.It Fn man_free |
Free all resources of a parser. The pointer is no longer valid after |
Free all resources of a parser. |
invocation. |
The pointer is no longer valid after invocation. |
.\" LIST-ITEM |
|
.It Fn man_parseln |
.It Fn man_parseln |
Parse a nil-terminated line of input. This line should not contain the |
Parse a nil-terminated line of input. |
trailing newline. Returns 0 on failure, 1 on success. The input buffer |
This line should not contain the trailing newline. |
|
Returns 0 on failure, 1 on success. |
|
The input buffer |
.Fa buf |
.Fa buf |
is modified by this function. |
is modified by this function. |
.\" LIST-ITEM |
|
.It Fn man_endparse |
.It Fn man_endparse |
Signals that the parse is complete. Note that if |
Signals that the parse is complete. |
|
Note that if |
.Fn man_endparse |
.Fn man_endparse |
is called subsequent to |
is called subsequent to |
.Fn man_node , |
.Fn man_node , |
the resulting tree is incomplete. Returns 0 on failure, 1 on success. |
the resulting tree is incomplete. |
.\" LIST-ITEM |
Returns 0 on failure, 1 on success. |
.It Fn man_node |
.It Fn man_node |
Returns the first node of the parse. Note that if |
Returns the first node of the parse. |
|
Note that if |
.Fn man_parseln |
.Fn man_parseln |
or |
or |
.Fn man_endparse |
.Fn man_endparse |
return 0, the tree will be incomplete. |
return 0, the tree will be incomplete. |
.It Fn man_meta |
.It Fn man_meta |
Returns the document's parsed meta-data. If this information has not |
Returns the document's parsed meta-data. |
yet been supplied or |
If this information has not yet been supplied or |
.Fn man_parseln |
.Fn man_parseln |
or |
or |
.Fn man_endparse |
.Fn man_endparse |
return 0, the data will be incomplete. |
return 0, the data will be incomplete. |
.El |
.El |
.\" SUBSECTION |
|
.Ss Variables |
.Ss Variables |
The following variables are also defined: |
The following variables are also defined: |
.Bl -ohang -offset "XXXX" |
.Bl -ohang |
.\" LIST-ITEM |
|
.It Va man_macronames |
.It Va man_macronames |
An array of string-ified token names. |
An array of string-ified token names. |
.El |
.El |
.\" SUBSECTION |
|
.Ss Abstract Syntax Tree |
.Ss Abstract Syntax Tree |
The |
The |
.Nm |
.Nm |
functions produce an abstract syntax tree (AST) describing input in a |
functions produce an abstract syntax tree (AST) describing input in a |
regular form. It may be reviewed at any time with |
regular form. |
|
It may be reviewed at any time with |
.Fn man_nodes ; |
.Fn man_nodes ; |
however, if called before |
however, if called before |
.Fn man_endparse , |
.Fn man_endparse , |
|
|
or |
or |
.Fn man_parseln |
.Fn man_parseln |
fail, it may be incomplete. |
fail, it may be incomplete. |
.\" PARAGRAPH |
|
.Pp |
.Pp |
This AST is governed by the ontological |
This AST is governed by the ontological rules dictated in |
rules dictated in |
|
.Xr man 7 |
.Xr man 7 |
and derives its terminology accordingly. |
and derives its terminology accordingly. |
.\" PARAGRAPH |
|
.Pp |
.Pp |
The AST is composed of |
The AST is composed of |
.Vt struct man_node |
.Vt struct man_node |
nodes with element, root and text types as declared |
nodes with element, root and text types as declared by the |
by the |
|
.Va type |
.Va type |
field. Each node also provides its parse point (the |
field. |
|
Each node also provides its parse point (the |
.Va line , |
.Va line , |
.Va sec , |
.Va sec , |
and |
and |
Line 210 fields), its position in the tree (the |
|
Line 190 fields), its position in the tree (the |
|
and |
and |
.Va prev |
.Va prev |
fields) and some type-specific data. |
fields) and some type-specific data. |
.\" PARAGRAPH |
|
.Pp |
.Pp |
The tree itself is arranged according to the following normal form, |
The tree itself is arranged according to the following normal form, |
where capitalised non-terminals represent nodes. |
where capitalised non-terminals represent nodes. |
.Pp |
.Pp |
.Bl -tag -width "ELEMENTXX" -compact -offset "XXXX" |
.Bl -tag -width "ELEMENTXX" -compact |
.\" LIST-ITEM |
|
.It ROOT |
.It ROOT |
\(<- mnode+ |
\(<- mnode+ |
.It mnode |
.It mnode |
Line 232 where capitalised non-terminals represent nodes. |
|
Line 210 where capitalised non-terminals represent nodes. |
|
.It TEXT |
.It TEXT |
\(<- [[:alpha:]]* |
\(<- [[:alpha:]]* |
.El |
.El |
.\" PARAGRAPH |
|
.Pp |
.Pp |
The only elements capable of nesting other elements are those with |
The only elements capable of nesting other elements are those with |
next-lint scope as documented in |
next-lint scope as documented in |
.Xr man 7 . |
.Xr man 7 . |
.\" SECTION |
|
.Sh EXAMPLES |
.Sh EXAMPLES |
The following example reads lines from stdin and parses them, operating |
The following example reads lines from stdin and parses them, operating |
on the finished parse tree with |
on the finished parse tree with |
.Fn parsed . |
.Fn parsed . |
Note that, if the last line of the file isn't newline-terminated, this |
This example does not error-check nor free memory upon failure. |
will truncate the file's last character (see |
.Bd -literal -offset indent |
.Xr fgetln 3 ) . |
struct regset regs; |
Further, this example does not error-check nor free memory upon failure. |
|
.Bd -literal -offset "XXXX" |
|
struct man *man; |
struct man *man; |
struct man_node *node; |
struct man_node *node; |
char *buf; |
char *buf; |
size_t len; |
size_t len; |
int line; |
int line; |
|
|
|
bzero(®s, sizeof(struct regset)); |
line = 1; |
line = 1; |
man = man_alloc(NULL, 0, NULL); |
man = man_alloc(®s, NULL, NULL); |
|
buf = NULL; |
|
alloc_len = 0; |
|
|
while ((buf = fgetln(fp, &len))) { |
while ((len = getline(&buf, &alloc_len, stdin)) >= 0) { |
buf[len - 1] = '\\0'; |
if (len && buflen[len - 1] = '\en') |
if ( ! man_parseln(man, line, buf)) |
buf[len - 1] = '\e0'; |
errx(1, "man_parseln"); |
if ( ! man_parseln(man, line, buf)) |
line++; |
errx(1, "man_parseln"); |
|
line++; |
} |
} |
|
|
|
free(buf); |
|
|
if ( ! man_endparse(man)) |
if ( ! man_endparse(man)) |
errx(1, "man_endparse"); |
errx(1, "man_endparse"); |
if (NULL == (node = man_node(man))) |
if (NULL == (node = man_node(man))) |
errx(1, "man_node"); |
errx(1, "man_node"); |
|
|
parsed(man, node); |
parsed(man, node); |
man_free(man); |
man_free(man); |
.Ed |
.Ed |
.\" SECTION |
.Pp |
|
To compile this, execute |
|
.Pp |
|
.Dl % cc main.c libman.a libmandoc.a |
|
.Pp |
|
where |
|
.Pa main.c |
|
is the example file. |
.Sh SEE ALSO |
.Sh SEE ALSO |
.Xr mandoc 1 , |
.Xr mandoc 1 , |
.Xr man 7 |
.Xr man 7 |
.\" SECTION |
|
.Sh AUTHORS |
.Sh AUTHORS |
The |
The |
.Nm |
.Nm |
utility was written by |
library was written by |
.An Kristaps Dzonsons Aq kristaps@kth.se . |
.An Kristaps Dzonsons Aq kristaps@bsd.lv . |