1 /* $Id: man_action.c,v 1.9 2009/10/27 21:40:07 schwarze 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.
17 #include <sys/utsname.h>
27 int (*post)(struct man *);
30 static int post_TH(struct man *);
31 static int post_fi(struct man *);
32 static int post_nf(struct man *);
34 const struct actions man_actions[MAN_MAX] = {
69 static time_t man_atotime(const char *);
73 man_action_post(struct man *m)
76 if (MAN_ACTED & m->last->flags)
78 m->last->flags |= MAN_ACTED;
80 switch (m->last->type) {
89 if (NULL == man_actions[m->last->tok].post)
91 return((*man_actions[m->last->tok].post)(m));
96 post_fi(struct man *m)
99 if ( ! (MAN_LITERAL & m->flags))
100 if ( ! man_nwarn(m, m->last, WNLITERAL))
102 m->flags &= ~MAN_LITERAL;
108 post_nf(struct man *m)
111 if (MAN_LITERAL & m->flags)
112 if ( ! man_nwarn(m, m->last, WOLITERAL))
114 m->flags |= MAN_LITERAL;
120 post_TH(struct man *m)
131 free(m->meta.source);
133 m->meta.title = m->meta.vol = m->meta.source = NULL;
137 /* ->TITLE<- MSEC DATE SOURCE VOL */
142 if (NULL == (m->meta.title = strdup(n->string)))
143 return(man_nerr(m, n, WNMEM));
145 /* TITLE ->MSEC<- DATE SOURCE VOL */
151 lval = strtol(n->string, &ep, 10);
152 if (n->string[0] != '\0' && *ep == '\0')
153 m->meta.msec = (int)lval;
154 else if ( ! man_nwarn(m, n, WMSEC))
157 /* TITLE MSEC ->DATE<- SOURCE VOL */
159 if (NULL == (n = n->next))
160 m->meta.date = time(NULL);
161 else if (0 == (m->meta.date = man_atotime(n->string))) {
162 if ( ! man_nwarn(m, n, WDATE))
164 m->meta.date = time(NULL);
167 /* TITLE MSEC DATE ->SOURCE<- VOL */
169 if (n && (n = n->next))
170 if (NULL == (m->meta.source = strdup(n->string)))
171 return(man_nerr(m, n, WNMEM));
173 /* TITLE MSEC DATE SOURCE ->VOL<- */
175 if (n && (n = n->next))
176 if (NULL == (m->meta.vol = strdup(n->string)))
177 return(man_nerr(m, n, WNMEM));
180 * The end document shouldn't have the prologue macros as part
181 * of the syntax tree (they encompass only meta-data).
184 if (m->last->parent->child == m->last) {
185 m->last->parent->child = NULL;
187 m->last = m->last->parent;
188 m->next = MAN_NEXT_CHILD;
190 assert(m->last->prev);
191 m->last->prev->next = NULL;
193 m->last = m->last->prev;
194 m->next = MAN_NEXT_SIBLING;
197 man_node_freelist(n);
203 man_atotime(const char *p)
208 bzero(&tm, sizeof(struct tm));
210 if ((pp = strptime(p, "%b %d %Y", &tm)) && 0 == *pp)
212 if ((pp = strptime(p, "%d %b %Y", &tm)) && 0 == *pp)
214 if ((pp = strptime(p, "%b %d, %Y", &tm)) && 0 == *pp)
216 if ((pp = strptime(p, "%b %Y", &tm)) && 0 == *pp)