1 /* $Id: man_action.c,v 1.8 2009/09/18 22:46:14 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] = {
68 static time_t man_atotime(const char *);
72 man_action_post(struct man *m)
75 if (MAN_ACTED & m->last->flags)
77 m->last->flags |= MAN_ACTED;
79 switch (m->last->type) {
88 if (NULL == man_actions[m->last->tok].post)
90 return((*man_actions[m->last->tok].post)(m));
95 post_fi(struct man *m)
98 if ( ! (MAN_LITERAL & m->flags))
99 if ( ! man_nwarn(m, m->last, WNLITERAL))
101 m->flags &= ~MAN_LITERAL;
107 post_nf(struct man *m)
110 if (MAN_LITERAL & m->flags)
111 if ( ! man_nwarn(m, m->last, WOLITERAL))
113 m->flags |= MAN_LITERAL;
119 post_TH(struct man *m)
130 free(m->meta.source);
132 m->meta.title = m->meta.vol = m->meta.source = NULL;
136 /* ->TITLE<- MSEC DATE SOURCE VOL */
141 if (NULL == (m->meta.title = strdup(n->string)))
142 return(man_nerr(m, n, WNMEM));
144 /* TITLE ->MSEC<- DATE SOURCE VOL */
150 lval = strtol(n->string, &ep, 10);
151 if (n->string[0] != '\0' && *ep == '\0')
152 m->meta.msec = (int)lval;
153 else if ( ! man_nwarn(m, n, WMSEC))
156 /* TITLE MSEC ->DATE<- SOURCE VOL */
158 if (NULL == (n = n->next))
159 m->meta.date = time(NULL);
160 else if (0 == (m->meta.date = man_atotime(n->string))) {
161 if ( ! man_nwarn(m, n, WDATE))
163 m->meta.date = time(NULL);
166 /* TITLE MSEC DATE ->SOURCE<- VOL */
168 if (n && (n = n->next))
169 if (NULL == (m->meta.source = strdup(n->string)))
170 return(man_nerr(m, n, WNMEM));
172 /* TITLE MSEC DATE SOURCE ->VOL<- */
174 if (n && (n = n->next))
175 if (NULL == (m->meta.vol = strdup(n->string)))
176 return(man_nerr(m, n, WNMEM));
179 * The end document shouldn't have the prologue macros as part
180 * of the syntax tree (they encompass only meta-data).
183 if (m->last->parent->child == m->last) {
184 m->last->parent->child = NULL;
186 m->last = m->last->parent;
187 m->next = MAN_NEXT_CHILD;
189 assert(m->last->prev);
190 m->last->prev->next = NULL;
192 m->last = m->last->prev;
193 m->next = MAN_NEXT_SIBLING;
196 man_node_freelist(n);
202 man_atotime(const char *p)
207 bzero(&tm, sizeof(struct tm));
209 if ((pp = strptime(p, "%b %d %Y", &tm)) && 0 == *pp)
211 if ((pp = strptime(p, "%d %b %Y", &tm)) && 0 == *pp)
213 if ((pp = strptime(p, "%b %d, %Y", &tm)) && 0 == *pp)
215 if ((pp = strptime(p, "%b %Y", &tm)) && 0 == *pp)