mandoc(1): Update to 1.9.20.
[dragonfly.git] / usr.bin / mandoc / libman.h
CommitLineData
057fa736 1/* $Id: libman.h,v 1.30 2010/03/29 10:10:35 kristaps Exp $ */
589e7c1d
SW
2/*
3 * Copyright (c) 2009 Kristaps Dzonsons <kristaps@kth.se>
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 LIBMAN_H
18#define LIBMAN_H
19
20#include "man.h"
21
22enum man_next {
23 MAN_NEXT_SIBLING = 0,
24 MAN_NEXT_CHILD
25};
26
27struct man {
28 void *data;
29 struct man_cb cb;
057fa736
SW
30 int pflags; /* parse flags (see man.h) */
31 int svflags; /* flags saved during roff blocks */
32 int flags; /* parse flags */
33#define MAN_HALT (1 << 0) /* badness happened: die */
589e7c1d
SW
34#define MAN_ELINE (1 << 1) /* Next-line element scope. */
35#define MAN_BLINE (1 << 2) /* Next-line block scope. */
17fcb234
SW
36#define MAN_ILINE (1 << 3) /* Ignored in next-line scope. */
37#define MAN_LITERAL (1 << 4) /* Literal input. */
057fa736 38#define MAN_BPLINE (1 << 5)
589e7c1d 39 enum man_next next;
057fa736 40 enum man_next svnext;
589e7c1d
SW
41 struct man_node *last;
42 struct man_node *first;
43 struct man_meta meta;
44};
45
46enum merr {
47 WNPRINT = 0,
589e7c1d
SW
48 WMSEC,
49 WDATE,
50 WLNSCOPE,
17fcb234 51 WLNSCOPE2,
589e7c1d
SW
52 WTSPACE,
53 WTQUOTE,
54 WNODATA,
55 WNOTITLE,
56 WESCAPE,
57 WNUMFMT,
58 WHEADARGS,
59 WBODYARGS,
60 WNHEADARGS,
589e7c1d
SW
61 WMACROFORM,
62 WEXITSCOPE,
63 WNOSCOPE,
64 WOLITERAL,
65 WNLITERAL,
17fcb234
SW
66 WROFFNEST,
67 WROFFSCOPE,
68 WTITLECASE,
589e7c1d
SW
69 WERRMAX
70};
71
17fcb234 72#define MACRO_PROT_ARGS struct man *m, enum mant tok, int line, \
589e7c1d
SW
73 int ppos, int *pos, char *buf
74
75struct man_macro {
76 int (*fp)(MACRO_PROT_ARGS);
77 int flags;
78#define MAN_SCOPED (1 << 0)
79#define MAN_EXPLICIT (1 << 1) /* See blk_imp(). */
80#define MAN_FSCOPED (1 << 2) /* See blk_imp(). */
17fcb234
SW
81#define MAN_NSCOPED (1 << 3) /* See in_line_eoln(). */
82#define MAN_NOCLOSE (1 << 4) /* See blk_exp(). */
589e7c1d
SW
83};
84
85extern const struct man_macro *const man_macros;
86
87__BEGIN_DECLS
88
89#define man_perr(m, l, p, t) \
90 man_err((m), (l), (p), 1, (t))
91#define man_pwarn(m, l, p, t) \
92 man_err((m), (l), (p), 0, (t))
93#define man_nerr(m, n, t) \
94 man_err((m), (n)->line, (n)->pos, 1, (t))
95#define man_nwarn(m, n, t) \
96 man_err((m), (n)->line, (n)->pos, 0, (t))
97
98int man_word_alloc(struct man *, int, int, const char *);
17fcb234
SW
99int man_block_alloc(struct man *, int, int, enum mant);
100int man_head_alloc(struct man *, int, int, enum mant);
101int man_body_alloc(struct man *, int, int, enum mant);
102int man_elem_alloc(struct man *, int, int, enum mant);
103void man_node_delete(struct man *, struct man_node *);
589e7c1d 104void man_hash_init(void);
17fcb234 105enum mant man_hash_find(const char *);
589e7c1d
SW
106int man_macroend(struct man *);
107int man_args(struct man *, int, int *, char *, char **);
108#define ARGS_ERROR (-1)
109#define ARGS_EOLN (0)
110#define ARGS_WORD (1)
111#define ARGS_QWORD (1)
112int man_err(struct man *, int, int, int, enum merr);
113int man_vwarn(struct man *, int, int, const char *, ...);
114int man_verr(struct man *, int, int, const char *, ...);
115int man_valid_post(struct man *);
116int man_valid_pre(struct man *, const struct man_node *);
117int man_action_post(struct man *);
118int man_action_pre(struct man *, struct man_node *);
17fcb234
SW
119int man_unscope(struct man *,
120 const struct man_node *, enum merr);
589e7c1d
SW
121
122__END_DECLS
123
124#endif /*!LIBMAN_H*/