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