]>
git.cameronkatri.com Git - mandoc.git/blob - man_macro.c
1 /* $Id: man_macro.c,v 1.7 2009/03/25 16:07:36 kristaps Exp $ */
3 * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@openbsd.org>
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
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.
21 #include <err.h> /* XXX */
28 static int man_args(struct man
*, int,
29 int *, char *, char **);
33 man_macro(struct man
*man
, int tok
, int line
,
34 int ppos
, int *pos
, char *buf
)
40 if ( ! man_elem_alloc(man
, line
, ppos
, tok
))
43 man
->next
= MAN_NEXT_CHILD
;
47 w
= man_args(man
, line
, pos
, buf
, &p
);
54 if ( ! man_word_alloc(man
, line
, la
, p
))
56 man
->next
= MAN_NEXT_SIBLING
;
60 * Note that when TH is pruned, we'll be back at the root, so
61 * make sure that we don't clobber as its sibling.
64 for ( ; man
->last
; man
->last
= man
->last
->parent
) {
67 if (man
->last
->type
== MAN_ROOT
)
69 if ( ! man_valid_post(man
))
71 if ( ! man_action_post(man
))
78 * Same here regarding whether we're back at the root.
81 if (man
->last
->type
!= MAN_ROOT
&& ! man_valid_post(man
))
83 if (man
->last
->type
!= MAN_ROOT
&& ! man_action_post(man
))
85 if (man
->last
->type
!= MAN_ROOT
)
86 man
->next
= MAN_NEXT_SIBLING
;
93 man_macroend(struct man
*m
)
96 for ( ; m
->last
&& m
->last
!= m
->first
;
97 m
->last
= m
->last
->parent
) {
98 if ( ! man_valid_post(m
))
100 if ( ! man_action_post(m
))
103 assert(m
->last
== m
->first
);
105 if ( ! man_valid_post(m
))
107 if ( ! man_action_post(m
))
116 man_args(struct man
*man
, int line
,
117 int *pos
, char *buf
, char **v
)
123 /* First parse non-quoted strings. */
125 if ('\"' != buf
[*pos
]) {
129 if (' ' == buf
[*pos
])
130 if ('\\' != buf
[*pos
- 1])
143 while (buf
[*pos
] && ' ' == buf
[*pos
])
149 warnx("tail whitespace");
154 * If we're a quoted string (and quoted strings are allowed),
155 * then parse ahead to the next quote. If none's found, it's an
156 * error. After, parse to the next word.
161 while (buf
[*pos
] && '\"' != buf
[*pos
])
164 if (0 == buf
[*pos
]) {
165 warnx("unterminated quotation");
173 while (buf
[*pos
] && ' ' == buf
[*pos
])
179 warnx("tail whitespace");