325 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
			
		
		
	
	
			325 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
| .\"	$Id: man.3,v 1.18 2010/05/25 22:16:59 kristaps Exp $
 | |
| .\"
 | |
| .\" Copyright (c) 2009-2010 Kristaps Dzonsons <kristaps@bsd.lv>
 | |
| .\"
 | |
| .\" Permission to use, copy, modify, and distribute this software for any
 | |
| .\" purpose with or without fee is hereby granted, provided that the above
 | |
| .\" copyright notice and this permission notice appear in all copies.
 | |
| .\"
 | |
| .\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 | |
| .\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 | |
| .\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 | |
| .\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 | |
| .\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 | |
| .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 | |
| .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | |
| .\"
 | |
| .Dd $Mdocdate: May 25 2010 $
 | |
| .Dt MAN 3
 | |
| .Os
 | |
| .Sh NAME
 | |
| .Nm man ,
 | |
| .Nm man_alloc ,
 | |
| .Nm man_endparse ,
 | |
| .Nm man_free ,
 | |
| .Nm man_meta ,
 | |
| .Nm man_node ,
 | |
| .Nm man_parseln ,
 | |
| .Nm man_reset
 | |
| .Nd man macro compiler library
 | |
| .Sh SYNOPSIS
 | |
| .In mandoc.h
 | |
| .In man.h
 | |
| .Vt extern const char * const * man_macronames;
 | |
| .Ft "struct man *"
 | |
| .Fn man_alloc "void *data" "int pflags" "mandocmsg msgs"
 | |
| .Ft int
 | |
| .Fn man_endparse "struct man *man"
 | |
| .Ft void
 | |
| .Fn man_free "struct man *man"
 | |
| .Ft "const struct man_meta *"
 | |
| .Fn man_meta "const struct man *man"
 | |
| .Ft "const struct man_node *"
 | |
| .Fn man_node "const struct man *man"
 | |
| .Ft int
 | |
| .Fn man_parseln "struct man *man" "int line" "char *buf"
 | |
| .Ft void
 | |
| .Fn man_reset "struct man *man"
 | |
| .Sh DESCRIPTION
 | |
| The
 | |
| .Nm
 | |
| library parses lines of
 | |
| .Xr man 7
 | |
| input into an abstract syntax tree (AST).
 | |
| .Pp
 | |
| In general, applications initiate a parsing sequence with
 | |
| .Fn man_alloc ,
 | |
| parse each line in a document with
 | |
| .Fn man_parseln ,
 | |
| close the parsing session with
 | |
| .Fn man_endparse ,
 | |
| operate over the syntax tree returned by
 | |
| .Fn man_node
 | |
| and
 | |
| .Fn man_meta ,
 | |
| then free all allocated memory with
 | |
| .Fn man_free .
 | |
| The
 | |
| .Fn man_reset
 | |
| function may be used in order to reset the parser for another input
 | |
| sequence.
 | |
| See the
 | |
| .Sx EXAMPLES
 | |
| section for a full example.
 | |
| .Pp
 | |
| Beyond the full set of macros defined in
 | |
| .Xr man 7 ,
 | |
| the
 | |
| .Nm
 | |
| library also accepts the following macros:
 | |
| .Pp
 | |
| .Bl -tag -width Ds -compact
 | |
| .It PD
 | |
| Has no effect.  Handled as a current-scope line macro.
 | |
| .It Sp
 | |
| A synonym for
 | |
| .Sq sp 0.5v
 | |
| .Pq part of the standard preamble for Perl documentation .
 | |
| Handled as a line macro.
 | |
| .It Vb
 | |
| A synonym for
 | |
| .Sq nf
 | |
| .Pq part of the standard preamble for Perl documentation .
 | |
| Handled as a current-scope line macro.
 | |
| .It Ve
 | |
| A synonym for
 | |
| .Sq fi ,
 | |
| closing
 | |
| .Sq Vb
 | |
| .Pq part of the standard preamble for Perl documentation .
 | |
| Handled as a current-scope line macro.
 | |
| .El
 | |
| .Pp
 | |
| Furthermore, the following escapes are accepted to allow
 | |
| .Xr pod2man 1
 | |
| documents to be correctly formatted:
 | |
| \e*(-- (dash),
 | |
| \e*(PI (pi),
 | |
| \e*(L" (left double-quote),
 | |
| \e*(R" (right double-quote),
 | |
| \e*(C+ (C++),
 | |
| \e*(C` (left single-quote),
 | |
| \e*(C' (right single-quote),
 | |
| \e*(Aq (apostrophe),
 | |
| \e*^ (hat),
 | |
| \e*, (comma),
 | |
| \e*~ (tilde),
 | |
| \e*/ (forward slash),
 | |
| \e*: (umlaut),
 | |
| \e*8 (beta),
 | |
| \e*o (degree),
 | |
| \e*(D- (Eth),
 | |
| \e*(d- (eth),
 | |
| \e*(Th (Thorn),
 | |
| and
 | |
| \e*(th (thorn).
 | |
| .Sh REFERENCE
 | |
| This section further defines the
 | |
| .Sx Types ,
 | |
| .Sx Functions
 | |
| and
 | |
| .Sx Variables
 | |
| available to programmers.
 | |
| Following that, the
 | |
| .Sx Abstract Syntax Tree
 | |
| section documents the output tree.
 | |
| .Ss Types
 | |
| Both functions (see
 | |
| .Sx Functions )
 | |
| and variables (see
 | |
| .Sx Variables )
 | |
| may use the following types:
 | |
| .Bl -ohang
 | |
| .It Vt struct man
 | |
| An opaque type defined in
 | |
| .Pa man.c .
 | |
| Its values are only used privately within the library.
 | |
| .It Vt mandocmsg
 | |
| A function callback type defined in
 | |
| .Pa mandoc.h .
 | |
| .It Vt struct man_node
 | |
| A parsed node.
 | |
| Defined in
 | |
| .Pa man.h .
 | |
| See
 | |
| .Sx Abstract Syntax Tree
 | |
| for details.
 | |
| .El
 | |
| .Ss Functions
 | |
| Function descriptions follow:
 | |
| .Bl -ohang
 | |
| .It Fn man_alloc
 | |
| Allocates a parsing structure.
 | |
| The
 | |
| .Fa data
 | |
| pointer is passed to
 | |
| .Fa msgs .
 | |
| The
 | |
| .Fa pflags
 | |
| arguments are defined in
 | |
| .Pa man.h .
 | |
| Returns NULL on failure.
 | |
| If non-NULL, the pointer must be freed with
 | |
| .Fn man_free .
 | |
| .It Fn man_reset
 | |
| Reset the parser for another parse routine.
 | |
| After its use,
 | |
| .Fn man_parseln
 | |
| behaves as if invoked for the first time.
 | |
| .It Fn man_free
 | |
| Free all resources of a parser.
 | |
| The pointer is no longer valid after invocation.
 | |
| .It Fn man_parseln
 | |
| Parse a nil-terminated line of input.
 | |
| This line should not contain the trailing newline.
 | |
| Returns 0 on failure, 1 on success.
 | |
| The input buffer
 | |
| .Fa buf
 | |
| is modified by this function.
 | |
| .It Fn man_endparse
 | |
| Signals that the parse is complete.
 | |
| Note that if
 | |
| .Fn man_endparse
 | |
| is called subsequent to
 | |
| .Fn man_node ,
 | |
| the resulting tree is incomplete.
 | |
| Returns 0 on failure, 1 on success.
 | |
| .It Fn man_node
 | |
| Returns the first node of the parse.
 | |
| Note that if
 | |
| .Fn man_parseln
 | |
| or
 | |
| .Fn man_endparse
 | |
| return 0, the tree will be incomplete.
 | |
| .It Fn man_meta
 | |
| Returns the document's parsed meta-data.
 | |
| If this information has not yet been supplied or
 | |
| .Fn man_parseln
 | |
| or
 | |
| .Fn man_endparse
 | |
| return 0, the data will be incomplete.
 | |
| .El
 | |
| .Ss Variables
 | |
| The following variables are also defined:
 | |
| .Bl -ohang
 | |
| .It Va man_macronames
 | |
| An array of string-ified token names.
 | |
| .El
 | |
| .Ss Abstract Syntax Tree
 | |
| The
 | |
| .Nm
 | |
| functions produce an abstract syntax tree (AST) describing input in a
 | |
| regular form.
 | |
| It may be reviewed at any time with
 | |
| .Fn man_nodes ;
 | |
| however, if called before
 | |
| .Fn man_endparse ,
 | |
| or after
 | |
| .Fn man_endparse
 | |
| or
 | |
| .Fn man_parseln
 | |
| fail, it may be incomplete.
 | |
| .Pp
 | |
| This AST is governed by the ontological rules dictated in
 | |
| .Xr man 7
 | |
| and derives its terminology accordingly.
 | |
| .Pp
 | |
| The AST is composed of
 | |
| .Vt struct man_node
 | |
| nodes with element, root and text types as declared by the
 | |
| .Va type
 | |
| field.
 | |
| Each node also provides its parse point (the
 | |
| .Va line ,
 | |
| .Va sec ,
 | |
| and
 | |
| .Va pos
 | |
| fields), its position in the tree (the
 | |
| .Va parent ,
 | |
| .Va child ,
 | |
| .Va next
 | |
| and
 | |
| .Va prev
 | |
| fields) and some type-specific data.
 | |
| .Pp
 | |
| The tree itself is arranged according to the following normal form,
 | |
| where capitalised non-terminals represent nodes.
 | |
| .Pp
 | |
| .Bl -tag -width "ELEMENTXX" -compact
 | |
| .It ROOT
 | |
| \(<- mnode+
 | |
| .It mnode
 | |
| \(<- ELEMENT | TEXT | BLOCK
 | |
| .It BLOCK
 | |
| \(<- HEAD BODY
 | |
| .It HEAD
 | |
| \(<- mnode*
 | |
| .It BODY
 | |
| \(<- mnode*
 | |
| .It ELEMENT
 | |
| \(<- ELEMENT | TEXT*
 | |
| .It TEXT
 | |
| \(<- [[:alpha:]]*
 | |
| .El
 | |
| .Pp
 | |
| The only elements capable of nesting other elements are those with
 | |
| next-lint scope as documented in
 | |
| .Xr man 7 .
 | |
| .Sh EXAMPLES
 | |
| The following example reads lines from stdin and parses them, operating
 | |
| on the finished parse tree with
 | |
| .Fn parsed .
 | |
| This example does not error-check nor free memory upon failure.
 | |
| .Bd -literal -offset indent
 | |
| struct man *man;
 | |
| struct man_node *node;
 | |
| char *buf;
 | |
| size_t len;
 | |
| int line;
 | |
| 
 | |
| line = 1;
 | |
| man = man_alloc(NULL, 0, NULL);
 | |
| buf = NULL;
 | |
| alloc_len = 0;
 | |
| 
 | |
| while ((len = getline(&buf, &alloc_len, stdin)) >= 0) {
 | |
|     if (len && buflen[len - 1] = '\en')
 | |
|         buf[len - 1] = '\e0';
 | |
|     if ( ! man_parseln(man, line, buf))
 | |
|         errx(1, "man_parseln");
 | |
|     line++;
 | |
| }
 | |
| 
 | |
| free(buf);
 | |
| 
 | |
| if ( ! man_endparse(man))
 | |
|     errx(1, "man_endparse");
 | |
| if (NULL == (node = man_node(man)))
 | |
|     errx(1, "man_node");
 | |
| 
 | |
| parsed(man, node);
 | |
| man_free(man);
 | |
| .Ed
 | |
| .Pp
 | |
| Please see
 | |
| .Pa main.c
 | |
| in the source archive for a rigorous reference.
 | |
| .Sh SEE ALSO
 | |
| .Xr mandoc 1 ,
 | |
| .Xr man 7
 | |
| .Sh AUTHORS
 | |
| The
 | |
| .Nm
 | |
| library was written by
 | |
| .An Kristaps Dzonsons Aq kristaps@bsd.lv .
 | 
