[BACK]Return to mdoc.3 CVS log [TXT][DIR] Up to [local] / src / usr.bin / mandoc

Annotation of src/usr.bin/mandoc/mdoc.3, Revision 1.1

1.1     ! kristaps    1: .\" $Id: mdoc.3,v 1.26 2009/03/31 13:50:19 kristaps Exp $
        !             2: .\"
        !             3: .\" Copyright (c) 2009 Kristaps Dzonsons <kristaps@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
        !             7: .\" above copyright notice and this permission notice appear in all
        !             8: .\" copies.
        !             9: .\"
        !            10: .\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
        !            11: .\" WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
        !            12: .\" WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
        !            13: .\" AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
        !            14: .\" DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
        !            15: .\" PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
        !            16: .\" TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
        !            17: .\" PERFORMANCE OF THIS SOFTWARE.
        !            18: .\"
        !            19: .Dd $Mdocdate$
        !            20: .Dt mdoc 3
        !            21: .Os
        !            22: .\" SECTION
        !            23: .Sh NAME
        !            24: .Nm mdoc_alloc ,
        !            25: .Nm mdoc_parseln ,
        !            26: .Nm mdoc_endparse ,
        !            27: .Nm mdoc_node ,
        !            28: .Nm mdoc_meta ,
        !            29: .Nm mdoc_free ,
        !            30: .Nm mdoc_reset
        !            31: .Nd mdoc macro compiler library
        !            32: .\" SECTION
        !            33: .Sh SYNOPSIS
        !            34: .Fd #include <mdoc.h>
        !            35: .Vt extern const char * const * mdoc_macronames;
        !            36: .Vt extern const char * const * mdoc_argnames;
        !            37: .Ft "struct mdoc *"
        !            38: .Fn mdoc_alloc "void *data" "int pflags" "const struct mdoc_cb *cb"
        !            39: .Ft int
        !            40: .Fn mdoc_reset "struct mdoc *mdoc"
        !            41: .Ft void
        !            42: .Fn mdoc_free "struct mdoc *mdoc"
        !            43: .Ft int
        !            44: .Fn mdoc_parseln "struct mdoc *mdoc" "int line" "char *buf"
        !            45: .Ft "const struct mdoc_node *"
        !            46: .Fn mdoc_node "struct mdoc *mdoc"
        !            47: .Ft "const struct mdoc_meta *"
        !            48: .Fn mdoc_meta "struct mdoc *mdoc"
        !            49: .Ft int
        !            50: .Fn mdoc_endparse "struct mdoc *mdoc"
        !            51: .\" SECTION
        !            52: .Sh DESCRIPTION
        !            53: The
        !            54: .Nm mdoc
        !            55: library parses lines of
        !            56: .Xr mdoc 7
        !            57: input (and
        !            58: .Em only
        !            59: mdoc) into an abstract syntax tree (AST).
        !            60: .\" PARAGRAPH
        !            61: .Pp
        !            62: In general, applications initiate a parsing sequence with
        !            63: .Fn mdoc_alloc ,
        !            64: parse each line in a document with
        !            65: .Fn mdoc_parseln ,
        !            66: close the parsing session with
        !            67: .Fn mdoc_endparse ,
        !            68: operate over the syntax tree returned by
        !            69: .Fn mdoc_node
        !            70: and
        !            71: .Fn mdoc_meta ,
        !            72: then free all allocated memory with
        !            73: .Fn mdoc_free .
        !            74: The
        !            75: .Fn mdoc_reset
        !            76: function may be used in order to reset the parser for another input
        !            77: sequence.  See the
        !            78: .Sx EXAMPLES
        !            79: section for a full example.
        !            80: .\" PARAGRAPH
        !            81: .Pp
        !            82: This section further defines the
        !            83: .Sx Types ,
        !            84: .Sx Functions
        !            85: and
        !            86: .Sx Variables
        !            87: available to programmers.  Following that, the
        !            88: .Sx Abstract Syntax Tree
        !            89: section documents the output tree.
        !            90: .\" SUBSECTION
        !            91: .Ss Types
        !            92: Both functions (see
        !            93: .Sx Functions )
        !            94: and variables (see
        !            95: .Sx Variables )
        !            96: may use the following types:
        !            97: .Bl -ohang -offset "XXXX"
        !            98: .\" LIST-ITEM
        !            99: .It Vt struct mdoc
        !           100: An opaque type defined in
        !           101: .Pa mdoc.c .
        !           102: Its values are only used privately within the library.
        !           103: .\" LIST-ITEM
        !           104: .It Vt struct mdoc_cb
        !           105: A set of message callbacks defined in
        !           106: .Pa mdoc.h .
        !           107: .\" LIST-ITEM
        !           108: .It Vt struct mdoc_node
        !           109: A parsed node.  Defined in
        !           110: .Pa mdoc.h .
        !           111: See
        !           112: .Sx Abstract Syntax Tree
        !           113: for details.
        !           114: .El
        !           115: .\" SUBSECTION
        !           116: .Ss Functions
        !           117: Function descriptions follow:
        !           118: .Bl -ohang -offset "XXXX"
        !           119: .\" LIST-ITEM
        !           120: .It Fn mdoc_alloc
        !           121: Allocates a parsing structure.  The
        !           122: .Fa data
        !           123: pointer is passed to callbacks in
        !           124: .Fa cb ,
        !           125: which are documented further in the header file.
        !           126: The
        !           127: .Fa pflags
        !           128: arguments are defined in
        !           129: .Pa mdoc.h .
        !           130: Returns NULL on failure.  If non-NULL, the pointer must be freed with
        !           131: .Fn mdoc_free .
        !           132: .\" LIST-ITEM
        !           133: .It Fn mdoc_reset
        !           134: Reset the parser for another parse routine.  After its use,
        !           135: .Fn mdoc_parseln
        !           136: behaves as if invoked for the first time.  If it returns 0, memory could
        !           137: not be allocated.
        !           138: .\" LIST-ITEM
        !           139: .It Fn mdoc_free
        !           140: Free all resources of a parser.  The pointer is no longer valid after
        !           141: invocation.
        !           142: .\" LIST-ITEM
        !           143: .It Fn mdoc_parseln
        !           144: Parse a nil-terminated line of input.  This line should not contain the
        !           145: trailing newline.  Returns 0 on failure, 1 on success.  The input buffer
        !           146: .Fa buf
        !           147: is modified by this function.
        !           148: .\" LIST-ITEM
        !           149: .It Fn mdoc_endparse
        !           150: Signals that the parse is complete.  Note that if
        !           151: .Fn mdoc_endparse
        !           152: is called subsequent to
        !           153: .Fn mdoc_node ,
        !           154: the resulting tree is incomplete.  Returns 0 on failure, 1 on success.
        !           155: .\" LIST-ITEM
        !           156: .It Fn mdoc_node
        !           157: Returns the first node of the parse.  Note that if
        !           158: .Fn mdoc_parseln
        !           159: or
        !           160: .Fn mdoc_endparse
        !           161: return 0, the tree will be incomplete.
        !           162: .It Fn mdoc_meta
        !           163: Returns the document's parsed meta-data.  If this information has not
        !           164: yet been supplied or
        !           165: .Fn mdoc_parseln
        !           166: or
        !           167: .Fn mdoc_endparse
        !           168: return 0, the data will be incomplete.
        !           169: .El
        !           170: .\" SUBSECTION
        !           171: .Ss Variables
        !           172: The following variables are also defined:
        !           173: .Bl -ohang -offset "XXXX"
        !           174: .\" LIST-ITEM
        !           175: .It Va mdoc_macronames
        !           176: An array of string-ified token names.
        !           177: .\" LIST-ITEM
        !           178: .It Va mdoc_argnames
        !           179: An array of string-ified token argument names.
        !           180: .El
        !           181: .\" SUBSECTION
        !           182: .Ss Abstract Syntax Tree
        !           183: The
        !           184: .Nm
        !           185: functions produce an abstract syntax tree (AST) describing input in a
        !           186: regular form.  It may be reviewed at any time with
        !           187: .Fn mdoc_nodes ;
        !           188: however, if called before
        !           189: .Fn mdoc_endparse ,
        !           190: or after
        !           191: .Fn mdoc_endparse
        !           192: or
        !           193: .Fn mdoc_parseln
        !           194: fail, it may be incomplete.
        !           195: .\" PARAGRAPH
        !           196: .Pp
        !           197: This AST is governed by the ontological
        !           198: rules dictated in
        !           199: .Xr mdoc 7
        !           200: and derives its terminology accordingly.
        !           201: .Qq In-line
        !           202: elements described in
        !           203: .Xr mdoc 7
        !           204: are described simply as
        !           205: .Qq elements .
        !           206: .\" PARAGRAPH
        !           207: .Pp
        !           208: The AST is composed of
        !           209: .Vt struct mdoc_node
        !           210: nodes with block, head, body, element, root and text types as declared
        !           211: by the
        !           212: .Va type
        !           213: field.  Each node also provides its parse point (the
        !           214: .Va line ,
        !           215: .Va sec ,
        !           216: and
        !           217: .Va pos
        !           218: fields), its position in the tree (the
        !           219: .Va parent ,
        !           220: .Va child ,
        !           221: .Va next
        !           222: and
        !           223: .Va prev
        !           224: fields) and some type-specific data.
        !           225: .\" PARAGRAPH
        !           226: .Pp
        !           227: The tree itself is arranged according to the following normal form,
        !           228: where capitalised non-terminals represent nodes.
        !           229: .Pp
        !           230: .Bl -tag -width "ELEMENTXX" -compact -offset "XXXX"
        !           231: .\" LIST-ITEM
        !           232: .It ROOT
        !           233: \(<- mnode+
        !           234: .It mnode
        !           235: \(<- BLOCK | ELEMENT | TEXT
        !           236: .It BLOCK
        !           237: \(<- (HEAD [TEXT])+ [BODY [TEXT]] [TAIL [TEXT]]
        !           238: .It BLOCK
        !           239: \(<- BODY [TEXT] [TAIL [TEXT]]
        !           240: .It ELEMENT
        !           241: \(<- TEXT*
        !           242: .It HEAD
        !           243: \(<- mnode+
        !           244: .It BODY
        !           245: \(<- mnode+
        !           246: .It TAIL
        !           247: \(<- mnode+
        !           248: .It TEXT
        !           249: \(<- [[:alpha:]]*
        !           250: .El
        !           251: .\" PARAGRAPH
        !           252: .Pp
        !           253: Of note are the TEXT nodes following the HEAD, BODY and TAIL nodes of
        !           254: the BLOCK production.  These refer to punctuation marks.  Furthermore,
        !           255: although a TEXT node will generally have a non-zero-length string, in
        !           256: the specific case of
        !           257: .Sq \&.Bd \-literal ,
        !           258: an empty line will produce a zero-length string.
        !           259: .\" SECTION
        !           260: .Sh EXAMPLES
        !           261: The following example reads lines from stdin and parses them, operating
        !           262: on the finished parse tree with
        !           263: .Fn parsed .
        !           264: Note that, if the last line of the file isn't newline-terminated, this
        !           265: will truncate the file's last character (see
        !           266: .Xr fgetln 3 ) .
        !           267: Further, this example does not error-check nor free memory upon failure.
        !           268: .Bd -literal -offset "XXXX"
        !           269: struct mdoc *mdoc;
        !           270: struct mdoc_node *node;
        !           271: char *buf;
        !           272: size_t len;
        !           273: int line;
        !           274:
        !           275: line = 1;
        !           276: mdoc = mdoc_alloc(NULL, 0, NULL);
        !           277:
        !           278: while ((buf = fgetln(fp, &len))) {
        !           279:        buf[len - 1] = '\\0';
        !           280:        if ( ! mdoc_parseln(mdoc, line, buf))
        !           281:                errx(1, "mdoc_parseln");
        !           282:        line++;
        !           283: }
        !           284:
        !           285: if ( ! mdoc_endparse(mdoc))
        !           286:        errx(1, "mdoc_endparse");
        !           287: if (NULL == (node = mdoc_node(mdoc)))
        !           288:        errx(1, "mdoc_node");
        !           289:
        !           290: parsed(mdoc, node);
        !           291: mdoc_free(mdoc);
        !           292: .Ed
        !           293: .\" SECTION
        !           294: .Sh SEE ALSO
        !           295: .Xr mandoc 1 ,
        !           296: .Xr mdoc 7
        !           297: .\" SECTION
        !           298: .Sh AUTHORS
        !           299: The
        !           300: .Nm
        !           301: utility was written by
        !           302: .An Kristaps Dzonsons Aq kristaps@openbsd.org .
        !           303: .\" SECTION
        !           304: .Sh CAVEATS
        !           305: .Bl -dash -compact
        !           306: .\" LIST-ITEM
        !           307: .It
        !           308: The
        !           309: .Sq \&.Xc
        !           310: and
        !           311: .Sq \&.Xo
        !           312: macros aren't handled when used to span lines for the
        !           313: .Sq \&.It
        !           314: macro.
        !           315: .\" LIST-ITEM
        !           316: .It
        !           317: The
        !           318: .Sq \&.Bsx
        !           319: macro family doesn't yet understand version arguments.
        !           320: .\" LIST-ITEM
        !           321: .It
        !           322: If not given a value, the \-offset argument to
        !           323: .Sq \&.Bd
        !           324: and
        !           325: .Sq \&.Bl
        !           326: should be the width of
        !           327: .Qq <string> ;
        !           328: instead, a value of
        !           329: .Li 10n
        !           330: is provided.
        !           331: .\" LIST-ITEM
        !           332: .It
        !           333: Columns widths in
        !           334: .Sq \&.Bl \-column
        !           335: should default to width
        !           336: .Qq <stringx>
        !           337: if not included.
        !           338: .\" LIST-ITEM
        !           339: .It
        !           340: List-width suffix
        !           341: .Qq m
        !           342: isn't handled.
        !           343: .\" LIST-ITEM
        !           344: .It
        !           345: Contents of the SYNOPSIS section aren't checked.
        !           346: .El