Annotation of mandoc/prologue.c, Revision 1.2
1.2 ! kristaps 1: /* $Id: prologue.c,v 1.1 2009/01/01 20:40:16 kristaps Exp $ */
1.1 kristaps 2: /*
3: * Copyright (c) 2008 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
7: * above copyright notice and this permission notice appear in all
8: * copies.
9: *
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.
18: */
19: #include <assert.h>
20: #include <stdlib.h>
1.2 ! kristaps 21: #ifdef __linux__
! 22: #include <time.h>
! 23: #endif
1.1 kristaps 24:
25: #include "private.h"
26:
27: static int prologue_dt(MACRO_PROT_ARGS);
28: static int prologue_dd(MACRO_PROT_ARGS);
29: static int prologue_os(MACRO_PROT_ARGS);
30:
31: static int
32: prologue_dt(MACRO_PROT_ARGS)
33: {
34: int lastarg, j;
35: char *args[MDOC_LINEARG_MAX];
36:
37: if (SEC_PROLOGUE != mdoc->sec_lastn)
38: return(mdoc_err(mdoc, tok, ppos, ERR_SEC_NPROLOGUE));
39: if (0 == mdoc->meta.date)
40: return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE_OO));
41: if (mdoc->meta.title[0])
42: return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE_REP));
43:
44: j = -1;
45: lastarg = ppos;
46:
47: again:
48: if (j == MDOC_LINEARG_MAX)
49: return(mdoc_err(mdoc, tok, lastarg, ERR_ARGS_MANY));
50:
51: lastarg = *pos;
52:
53: switch (mdoc_args(mdoc, tok, pos, buf, 0, &args[++j])) {
54: case (ARGS_EOLN):
55: if (mdoc->meta.title)
56: return(1);
57: if ( ! mdoc_warn(mdoc, tok, ppos, WARN_ARGS_GE1))
58: return(0);
59: (void)xstrlcpy(mdoc->meta.title,
60: "UNTITLED", META_TITLE_SZ);
61: return(1);
62: case (ARGS_ERROR):
63: return(0);
64: default:
65: break;
66: }
67:
68: if (MDOC_MAX != mdoc_find(mdoc, args[j]) && ! mdoc_warn
69: (mdoc, tok, lastarg, WARN_SYNTAX_MACLIKE))
70: return(0);
71:
72: if (0 == j) {
73: if (xstrlcpy(mdoc->meta.title, args[0], META_TITLE_SZ))
74: goto again;
75: return(mdoc_err(mdoc, tok, lastarg, ERR_SYNTAX_ARGFORM));
76:
77: } else if (1 == j) {
78: mdoc->meta.msec = mdoc_atomsec(args[1]);
79: if (MSEC_DEFAULT != mdoc->meta.msec)
80: goto again;
81: return(mdoc_err(mdoc, tok, -1, ERR_SYNTAX_ARGFORM));
82:
83: } else if (2 == j) {
84: mdoc->meta.vol = mdoc_atovol(args[2]);
85: if (VOL_DEFAULT != mdoc->meta.vol)
86: goto again;
87: mdoc->meta.arch = mdoc_atoarch(args[2]);
88: if (ARCH_DEFAULT != mdoc->meta.arch)
89: goto again;
90: return(mdoc_err(mdoc, tok, lastarg, ERR_SYNTAX_ARGFORM));
91: }
92:
93: return(mdoc_err(mdoc, tok, lastarg, ERR_ARGS_MANY));
94: }
95:
96:
97: static int
98: prologue_os(MACRO_PROT_ARGS)
99: {
100: int lastarg, j;
101: char *args[MDOC_LINEARG_MAX];
102:
103: /* FIXME: if we use `Os' again... ? */
104:
105: if (SEC_PROLOGUE != mdoc->sec_lastn)
106: return(mdoc_err(mdoc, tok, ppos, ERR_SEC_NPROLOGUE));
107: if (0 == mdoc->meta.title[0])
108: return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE_OO));
109: if (mdoc->meta.os[0])
110: return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE_REP));
111:
112: j = -1;
113: lastarg = ppos;
114:
115: again:
116: if (j == MDOC_LINEARG_MAX)
117: return(mdoc_err(mdoc, tok, lastarg, ERR_ARGS_MANY));
118:
119: lastarg = *pos;
120:
121: switch (mdoc_args(mdoc, tok, pos, buf,
122: ARGS_QUOTED, &args[++j])) {
123: case (ARGS_EOLN):
124: mdoc->sec_lastn = mdoc->sec_last = SEC_BODY;
125: return(1);
126: case (ARGS_ERROR):
127: return(0);
128: default:
129: break;
130: }
131:
132: if ( ! xstrlcat(mdoc->meta.os, args[j], sizeof(mdoc->meta.os)))
133: return(mdoc_err(mdoc, tok, lastarg, ERR_SYNTAX_ARGFORM));
134: if ( ! xstrlcat(mdoc->meta.os, " ", sizeof(mdoc->meta.os)))
135: return(mdoc_err(mdoc, tok, lastarg, ERR_SYNTAX_ARGFORM));
136:
137: goto again;
138: /* NOTREACHED */
139: }
140:
141:
142: static int
143: prologue_dd(MACRO_PROT_ARGS)
144: {
145: int lastarg, j;
146: char *args[MDOC_LINEARG_MAX], date[64];
147:
148: if (SEC_PROLOGUE != mdoc->sec_lastn)
149: return(mdoc_err(mdoc, tok, ppos, ERR_SEC_NPROLOGUE));
150: if (mdoc->meta.title[0])
151: return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE_OO));
152: if (mdoc->meta.date)
153: return(mdoc_err(mdoc, tok, ppos, ERR_SEC_PROLOGUE_REP));
154:
155: j = -1;
156: date[0] = 0;
157: lastarg = ppos;
158:
159: again:
160: if (j == MDOC_LINEARG_MAX)
161: return(mdoc_err(mdoc, tok, lastarg, ERR_ARGS_MANY));
162:
163: lastarg = *pos;
164: switch (mdoc_args(mdoc, tok, pos, buf, 0, &args[++j])) {
165: case (ARGS_EOLN):
166: if (mdoc->meta.date)
167: return(1);
168: mdoc->meta.date = mdoc_atotime(date);
169: if (mdoc->meta.date)
170: return(1);
171: return(mdoc_err(mdoc, tok, ppos, ERR_SYNTAX_ARGFORM));
172: case (ARGS_ERROR):
173: return(0);
174: default:
175: break;
176: }
177:
178: if (MDOC_MAX != mdoc_find(mdoc, args[j]) && ! mdoc_warn
179: (mdoc, tok, lastarg, WARN_SYNTAX_MACLIKE))
180: return(0);
181:
182: if (0 == j) {
183: if (xstrcmp("$Mdocdate$", args[j])) {
184: mdoc->meta.date = time(NULL);
185: goto again;
186: } else if (xstrcmp("$Mdocdate:", args[j]))
187: goto again;
188: } else if (4 == j)
189: if ( ! xstrcmp("$", args[j]))
190: goto again;
191:
192: if ( ! xstrlcat(date, args[j], sizeof(date)))
193: return(mdoc_err(mdoc, tok, lastarg, ERR_SYNTAX_ARGFORM));
194: if ( ! xstrlcat(date, " ", sizeof(date)))
195: return(mdoc_err(mdoc, tok, lastarg, ERR_SYNTAX_ARGFORM));
196:
197: goto again;
198: /* NOTREACHED */
199: }
200:
201:
202: int
203: macro_prologue(MACRO_PROT_ARGS)
204: {
205:
206: switch (tok) {
207: case (MDOC_Dt):
208: return(prologue_dt(mdoc, tok, ppos, pos, buf));
209: case (MDOC_Dd):
210: return(prologue_dd(mdoc, tok, ppos, pos, buf));
211: case (MDOC_Os):
212: return(prologue_os(mdoc, tok, ppos, pos, buf));
213: default:
214: break;
215: }
216:
217: abort();
218: /* NOTREACHED */
219: }
220:
CVSweb