1 /* $Id: man_action.c,v 1.30 2010/03/27 10:04:56 kristaps Exp $ */
3 * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
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.
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.
23 #include "libmandoc.h"
26 int (*post)(struct man *);
29 static int post_TH(struct man *);
30 static int post_de(struct man *);
31 static int post_fi(struct man *);
32 static int post_nf(struct man *);
34 const struct actions man_actions[MAN_MAX] = {
71 { post_de }, /* dei */
73 { post_de }, /* ami */
80 man_action_post(struct man *m)
83 if (MAN_ACTED & m->last->flags)
85 m->last->flags |= MAN_ACTED;
87 switch (m->last->type) {
96 if (NULL == man_actions[m->last->tok].post)
98 return((*man_actions[m->last->tok].post)(m));
103 post_fi(struct man *m)
106 if ( ! (MAN_LITERAL & m->flags))
107 if ( ! man_nwarn(m, m->last, WNLITERAL))
109 m->flags &= ~MAN_LITERAL;
115 post_de(struct man *m)
119 * XXX: for the time being, we indiscriminately remove roff
120 * instructions from the parse stream.
122 if (MAN_BLOCK == m->last->type)
123 man_node_delete(m, m->last);
129 post_nf(struct man *m)
132 if (MAN_LITERAL & m->flags)
133 if ( ! man_nwarn(m, m->last, WOLITERAL))
135 m->flags |= MAN_LITERAL;
141 post_TH(struct man *m)
152 free(m->meta.source);
154 m->meta.title = m->meta.vol = m->meta.source = NULL;
158 /* ->TITLE<- MSEC DATE SOURCE VOL */
162 m->meta.title = mandoc_strdup(n->string);
164 /* TITLE ->MSEC<- DATE SOURCE VOL */
169 lval = strtol(n->string, &ep, 10);
170 if (n->string[0] != '\0' && *ep == '\0')
171 m->meta.msec = (int)lval;
172 else if ( ! man_nwarn(m, n, WMSEC))
175 /* TITLE MSEC ->DATE<- SOURCE VOL */
179 m->meta.date = mandoc_a2time
180 (MTIME_ISO_8601, n->string);
182 if (0 == m->meta.date) {
183 if ( ! man_nwarn(m, n, WDATE))
185 m->meta.date = time(NULL);
188 m->meta.date = time(NULL);
190 /* TITLE MSEC DATE ->SOURCE<- VOL */
192 if (n && (n = n->next))
193 m->meta.source = mandoc_strdup(n->string);
195 /* TITLE MSEC DATE SOURCE ->VOL<- */
197 if (n && (n = n->next))
198 m->meta.vol = mandoc_strdup(n->string);
201 * Remove the `TH' node after we've processed it for our
204 man_node_delete(m, m->last);