581f55ffc417b5237789167c5c1586d07164e40f
[dragonfly.git] / contrib / mdocml / man.h
1 /*      $Id: man.h,v 1.50 2011/01/01 12:59:17 kristaps Exp $ */
2 /*
3  * Copyright (c) 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
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 above
7  * copyright notice and this permission notice appear in all copies.
8  *
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.
16  */
17 #ifndef MAN_H
18 #define MAN_H
19
20 /* 
21  * What follows is a list of ALL possible macros. 
22  */
23 enum    mant {
24         MAN_br = 0,
25         MAN_TH,
26         MAN_SH,
27         MAN_SS,
28         MAN_TP,
29         MAN_LP,
30         MAN_PP,
31         MAN_P,
32         MAN_IP,
33         MAN_HP,
34         MAN_SM,
35         MAN_SB,
36         MAN_BI,
37         MAN_IB,
38         MAN_BR,
39         MAN_RB,
40         MAN_R,
41         MAN_B,
42         MAN_I,
43         MAN_IR,
44         MAN_RI,
45         MAN_na,
46         MAN_sp,
47         MAN_nf,
48         MAN_fi,
49         MAN_RE,
50         MAN_RS,
51         MAN_DT,
52         MAN_UC,
53         MAN_PD,
54         MAN_AT,
55         MAN_in,
56         MAN_ft,
57         MAN_MAX
58 };
59
60 /* 
61  * Type of a syntax node. 
62  */
63 enum    man_type {
64         MAN_TEXT,
65         MAN_ELEM,
66         MAN_ROOT,
67         MAN_BLOCK,
68         MAN_HEAD,
69         MAN_BODY,
70         MAN_TBL
71 };
72
73 /* 
74  * Information from prologue. 
75  */
76 struct  man_meta {
77         char            *msec; /* `TH' section (1, 3p, etc.) */
78         time_t           date; /* `TH' normalised date */
79         char            *rawdate; /* raw `TH' date */
80         char            *vol; /* `TH' volume */
81         char            *title; /* `TH' title (e.g., FOO) */
82         char            *source; /* `TH' source (e.g., GNU) */
83 };
84
85 /* 
86  * Single node in tree-linked AST. 
87  */
88 struct  man_node {
89         struct man_node *parent; /* parent AST node */
90         struct man_node *child; /* first child AST node */
91         struct man_node *next; /* sibling AST node */
92         struct man_node *prev; /* prior sibling AST node */
93         int              nchild; /* number children */
94         int              line;
95         int              pos;
96         enum mant        tok; /* tok or MAN__MAX if none */
97         int              flags;
98 #define MAN_VALID       (1 << 0) /* has been validated */
99 #define MAN_EOS         (1 << 2) /* at sentence boundary */
100         enum man_type    type; /* AST node type */
101         char            *string; /* TEXT node argument */
102         struct man_node *head; /* BLOCK node HEAD ptr */
103         struct man_node *body; /* BLOCK node BODY ptr */
104         const struct tbl_span *span; /* TBL */
105 };
106
107 /*
108  * Names of macros.  Index is enum mant.  Indexing into this returns
109  * the normalised name, e.g., man_macronames[MAN_SH] -> "SH".
110  */
111 extern  const char *const *man_macronames;
112
113 __BEGIN_DECLS
114
115 struct  man;
116
117 void              man_free(struct man *);
118 struct  man      *man_alloc(struct regset *, void *, mandocmsg);
119 void              man_reset(struct man *);
120 int               man_parseln(struct man *, int, char *, int);
121 int               man_endparse(struct man *);
122 int               man_addspan(struct man *,
123                         const struct tbl_span *);
124
125 const struct man_node *man_node(const struct man *);
126 const struct man_meta *man_meta(const struct man *);
127
128 __END_DECLS
129
130 #endif /*!MAN_H*/