annotate directive.c @ 64:f50b4ea6cbfe

Prune single-line comments from (most) directive lines. Also, don't pass the string length to the directive processing functions, as half of them weren't honoring it. Instead, ensure that the directive line is terminated at the place the directive processing functions should stop looking at it.
author David A. Holland
date Sun, 31 Mar 2013 02:04:56 -0400
parents 90c6052410ce
children f8507e5ed84c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
30
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
1 /*-
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
2 * Copyright (c) 2010 The NetBSD Foundation, Inc.
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
3 * All rights reserved.
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
4 *
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
5 * This code is derived from software contributed to The NetBSD Foundation
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
6 * by David A. Holland.
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
7 *
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
8 * Redistribution and use in source and binary forms, with or without
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
9 * modification, are permitted provided that the following conditions
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
10 * are met:
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
11 * 1. Redistributions of source code must retain the above copyright
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
12 * notice, this list of conditions and the following disclaimer.
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
13 * 2. Redistributions in binary form must reproduce the above copyright
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
14 * notice, this list of conditions and the following disclaimer in the
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
15 * documentation and/or other materials provided with the distribution.
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
16 *
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
17 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
18 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
19 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
20 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
25 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
27 * POSSIBILITY OF SUCH DAMAGE.
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
28 */
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
29
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
30 #include <assert.h>
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
31 #include <stdbool.h>
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
32 #include <stdlib.h>
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
33 #include <string.h>
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
34
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
35 #include "utils.h"
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
36 #include "mode.h"
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
37 #include "place.h"
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
38 #include "files.h"
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
39 #include "directive.h"
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
40 #include "macro.h"
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
41 #include "eval.h"
49
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
42 #include "output.h"
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
43
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
44 struct ifstate {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
45 struct ifstate *prev;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
46 struct place startplace;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
47 bool curtrue;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
48 bool evertrue;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
49 bool seenelse;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
50 };
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
51
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
52 static struct ifstate *ifstate;
49
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
53 static bool in_multiline_comment;
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
54
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
55 ////////////////////////////////////////////////////////////
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
56 // common parsing bits
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
57
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
58 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
59 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
60 uncomment(char *buf)
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
61 {
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
62 char *s, *t, *u = NULL;
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
63 bool incomment = false;
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
65 for (s = t = buf; *s; s++) {
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
66 if (incomment) {
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
67 if (s[0] == '*' && s[1] == '/') {
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
68 s++;
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
69 incomment = false;
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
70 }
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
71 } else {
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
72 if (s[0] == '/' && s[1] == '*') {
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
73 incomment = true;
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
74 } else {
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
75 if (t != s) {
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
76 *t = *s;
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
77 }
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
78 if (!strchr(ws, *t)) {
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
79 u = t;
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
80 }
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
81 t++;
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
82 }
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
83 }
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
84 }
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
85 if (u) {
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
86 /* end string after last non-whitespace char */
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
87 u[1] = '\0';
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
88 } else {
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
89 *t = '\0';
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
90 }
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
91 }
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
92
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
93 static
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
94 void
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
95 oneword(const char *what, struct place *p2, char *line)
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
96 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
97 size_t pos;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
98
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
99 pos = strcspn(line, ws);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
100 if (line[pos] != '\0') {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
101 p2->column += pos;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
102 complain(p2, "Garbage after %s argument", what);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
103 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
104 line[pos] = '\0';
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
105 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
106 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
107
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
108 ////////////////////////////////////////////////////////////
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
109 // if handling
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
110
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
111 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
112 struct ifstate *
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
113 ifstate_create(struct ifstate *prev, struct place *p, bool startstate)
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
114 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
115 struct ifstate *is;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
116
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
117 is = domalloc(sizeof(*is));
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
118 is->prev = prev;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
119 if (p != NULL) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
120 is->startplace = *p;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
121 } else {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
122 place_setbuiltin(&is->startplace, 1);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
123 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
124 is->curtrue = startstate;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
125 is->evertrue = is->curtrue;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
126 is->seenelse = false;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
127 return is;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
128 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
129
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
130 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
131 void
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
132 ifstate_destroy(struct ifstate *is)
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
133 {
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
134 dofree(is, sizeof(*is));
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
135 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
136
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
137 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
138 void
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
139 ifstate_push(struct place *p, bool startstate)
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
140 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
141 ifstate = ifstate_create(ifstate, p, startstate);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
142 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
143
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
144 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
145 void
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
146 ifstate_pop(void)
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
147 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
148 struct ifstate *is;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
149
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
150 is = ifstate;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
151 ifstate = ifstate->prev;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
152 ifstate_destroy(is);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
153 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
154
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
155 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
156 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
157 d_if(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
158 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
159 char *expr;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
160 bool val;
16
9dda765ee85c expression evaluator
David A. Holland
parents: 15
diff changeset
161 struct place p3 = *p2;
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
162
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
163 uncomment(line);
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
164 expr = macroexpand(p2, line, strlen(line), true);
16
9dda765ee85c expression evaluator
David A. Holland
parents: 15
diff changeset
165 val = eval(&p3, expr);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
166 ifstate_push(p, val);
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
167 dostrfree(expr);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
168 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
169
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
170 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
171 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
172 d_ifdef(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
173 {
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
174 uncomment(line);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
175 oneword("#ifdef", p2, line);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
176 ifstate_push(p, macro_isdefined(line));
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
177 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
178
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
179 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
180 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
181 d_ifndef(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
182 {
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
183 uncomment(line);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
184 oneword("#ifndef", p2, line);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
185 ifstate_push(p, !macro_isdefined(line));
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
186 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
187
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
188 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
189 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
190 d_elif(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
191 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
192 char *expr;
16
9dda765ee85c expression evaluator
David A. Holland
parents: 15
diff changeset
193 struct place p3 = *p2;
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
194
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
195 if (ifstate->seenelse) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
196 complain(p, "#elif after #else");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
197 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
198 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
199
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
200 if (ifstate->evertrue) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
201 ifstate->curtrue = false;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
202 } else {
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
203 uncomment(line);
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
204 expr = macroexpand(p2, line, strlen(line), true);
16
9dda765ee85c expression evaluator
David A. Holland
parents: 15
diff changeset
205 ifstate->curtrue = eval(&p3, expr);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
206 ifstate->evertrue = ifstate->curtrue;
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
207 dostrfree(expr);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
208 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
209 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
210
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
211 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
212 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
213 d_else(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
214 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
215 if (ifstate->seenelse) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
216 complain(p, "Multiple #else directives in one conditional");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
217 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
218 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
219
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
220 ifstate->curtrue = !ifstate->evertrue;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
221 ifstate->evertrue = true;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
222 ifstate->seenelse = true;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
223 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
224
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
225 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
226 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
227 d_endif(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
228 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
229 if (ifstate->prev == NULL) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
230 complain(p, "Unmatched #endif");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
231 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
232 } else {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
233 ifstate_pop();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
234 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
235 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
236
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
237 ////////////////////////////////////////////////////////////
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
238 // macros
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
239
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
240 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
241 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
242 d_define(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
243 {
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
244 size_t pos, argpos;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
245 struct place p3, p4;
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
246
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
247 /*
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
248 * line may be:
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
249 * macro expansion
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
250 * macro(arg, arg, ...) expansion
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
251 */
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
252
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
253 pos = strcspn(line, " \t\f\v(");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
254 if (line[pos] == '(') {
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
255 line[pos++] = '\0';
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
256 argpos = pos;
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
257 pos = pos + strcspn(line+pos, "()");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
258 if (line[pos] == '(') {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
259 p2->column += pos;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
260 complain(p2, "Left parenthesis in macro parameters");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
261 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
262 return;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
263 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
264 if (line[pos] != ')') {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
265 p2->column += pos;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
266 complain(p2, "Unclosed macro parameter list");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
267 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
268 return;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
269 }
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
270 line[pos++] = '\0';
36
a489cc223483 Don't demand space after the macro argument parenthesis.
David A. Holland
parents: 30
diff changeset
271 #if 0
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
272 if (!strchr(ws, line[pos])) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
273 p2->column += pos;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
274 complain(p2, "Trash after macro parameter list");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
275 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
276 return;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
277 }
36
a489cc223483 Don't demand space after the macro argument parenthesis.
David A. Holland
parents: 30
diff changeset
278 #endif
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
279 } else if (line[pos] == '\0') {
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
280 argpos = 0;
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
281 } else {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
282 line[pos++] = '\0';
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
283 argpos = 0;
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
284 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
285
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
286 pos += strspn(line+pos, ws);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
287
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
288 p3 = *p2;
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
289 p3.column += argpos;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
290
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
291 p4 = *p2;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
292 p4.column += pos;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
293
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
294 if (argpos) {
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
295 macro_define_params(p2, line, &p3,
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
296 line + argpos, &p4,
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
297 line + pos);
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
298 } else {
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
299 macro_define_plain(p2, line, &p4, line + pos);
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
300 }
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
301 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
302
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
303 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
304 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
305 d_undef(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
306 {
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
307 uncomment(line);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
308 oneword("#undef", p2, line);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
309 macro_undef(line);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
310 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
311
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
312 ////////////////////////////////////////////////////////////
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
313 // includes
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
314
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
315 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
316 bool
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
317 tryinclude(struct place *p, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
318 {
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
319 size_t len;
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
320
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
321 len = strlen(line);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
322 if (len > 2 && line[0] == '"' && line[len-1] == '"') {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
323 line[len-1] = '\0';
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
324 file_readquote(p, line+1);
62
90c6052410ce Don't truncate the candidate include path strings.
David A. Holland
parents: 49
diff changeset
325 line[len-1] = '"';
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
326 return true;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
327 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
328 if (len > 2 && line[0] == '<' && line[len-1] == '>') {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
329 line[len-1] = '\0';
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
330 file_readbracket(p, line+1);
62
90c6052410ce Don't truncate the candidate include path strings.
David A. Holland
parents: 49
diff changeset
331 line[len-1] = '>';
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
332 return true;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
333 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
334 return false;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
335 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
336
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
337 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
338 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
339 d_include(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
340 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
341 char *text;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
342
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
343 uncomment(line);
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
344 if (tryinclude(p, line)) {
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
345 return;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
346 }
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
347 text = macroexpand(p2, line, strlen(line), false);
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
348 if (tryinclude(p, text)) {
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
349 dostrfree(text);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
350 return;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
351 }
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
352 dostrfree(text);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
353 complain(p, "Illegal #include directive");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
354 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
355 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
356
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
357 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
358 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
359 d_line(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
360 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
361 /* XXX */
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
362 complain(p, "Sorry, no #line yet");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
363 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
364
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
365 ////////////////////////////////////////////////////////////
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
366 // messages
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
367
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
368 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
369 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
370 d_warning(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
371 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
372 char *msg;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
373
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
374 msg = macroexpand(p2, line, strlen(line), false);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
375 complain(p, "#warning: %s", msg);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
376 if (mode.werror) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
377 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
378 }
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
379 dostrfree(msg);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
380 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
381
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
382 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
383 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
384 d_error(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
385 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
386 char *msg;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
387
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
388 msg = macroexpand(p2, line, strlen(line), false);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
389 complain(p, "#error: %s", msg);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
390 complain_fail();
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
391 dostrfree(msg);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
392 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
393
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
394 ////////////////////////////////////////////////////////////
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
395 // other
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
396
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
397 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
398 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
399 d_pragma(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
400 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
401 complain(p, "#pragma %s", line);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
402 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
403 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
404
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
405 ////////////////////////////////////////////////////////////
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
406 // directive table
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
407
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
408 static const struct {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
409 const char *name;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
410 bool ifskip;
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
411 void (*func)(struct place *, struct place *, char *line);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
412 } directives[] = {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
413 { "define", true, d_define },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
414 { "elif", false, d_elif },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
415 { "else", false, d_else },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
416 { "endif", false, d_endif },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
417 { "error", true, d_error },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
418 { "if", false, d_if },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
419 { "ifdef", false, d_ifdef },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
420 { "ifndef", false, d_ifndef },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
421 { "include", true, d_include },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
422 { "line", true, d_line },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
423 { "pragma", true, d_pragma },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
424 { "undef", true, d_undef },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
425 { "warning", true, d_warning },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
426 };
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
427 static const unsigned numdirectives = HOWMANY(directives);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
428
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
429 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
430 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
431 directive_gotdirective(struct place *p, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
432 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
433 struct place p2;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
434 size_t len, skip;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
435 unsigned i;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
436
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
437 p2 = *p;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
438 for (i=0; i<numdirectives; i++) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
439 len = strlen(directives[i].name);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
440 if (!strncmp(line, directives[i].name, len) &&
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
441 strchr(ws, line[len])) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
442 if (directives[i].ifskip && !ifstate->curtrue) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
443 return;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
444 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
445 skip = len + strspn(line+len, ws);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
446 p2.column += skip;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
447 line += skip;
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
448
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
449 len = strlen(line);
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
450 len = notrailingws(line, len);
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
451 if (len < strlen(line)) {
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
452 line[len] = '\0';
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
453 }
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
454 directives[i].func(p, &p2, line);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
455 return;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
456 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
457 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
458 skip = strcspn(line, ws);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
459 complain(p, "Unknown directive #%.*s", (int)skip, line);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
460 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
461 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
462
49
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
463 /*
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
464 * If desired, warn about a nested comment. The comment begins at
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
465 * offset POS from the place P.
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
466 */
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
467 static
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
468 void
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
469 warn_nestcomment(const struct place *p, size_t pos)
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
470 {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
471 struct place p2;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
472
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
473 if (warns.nestcomment) {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
474 p2 = *p;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
475 p2.column += pos;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
476 complain(p, "Warning: %c%c within comment",
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
477 '/', '*');
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
478 if (mode.werror) {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
479 complain_failed();
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
480 }
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
481 }
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
482 }
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
483
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
484 /*
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
485 * Check for comment delimiters in LINE. If a multi-line comment is
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
486 * continuing or ending, set ACOMM to its length. If a multi-line
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
487 * comment is starting, set BCOMM to its length. Set TEXT to the
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
488 * length of text that is not commented out, or that contains comments
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
489 * that both begin and end on this line. ACOMM + TEXT + BCOMM == LEN.
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
490 *
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
491 * Updates in_multiline_comment to the appropriate state for after
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
492 * this line is handled.
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
493 */
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
494 static
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
495 size_t
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
496 directive_scancomments(const struct place *p, char *line, size_t len,
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
497 size_t *acomm, size_t *text, size_t *bcomm)
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
498 {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
499 size_t pos;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
500 size_t first_commentend;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
501 size_t last_commentstart;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
502 bool incomment;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
503
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
504 first_commentend = len;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
505 last_commentstart = len;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
506 incomment = in_multiline_comment;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
507 for (pos = 0; pos+1 < len; pos++) {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
508 if (line[pos] == '/' && line[pos+1] == '*') {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
509 if (incomment) {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
510 warn_nestcomment(p, pos);
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
511 } else {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
512 incomment = true;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
513 last_commentstart = pos;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
514 }
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
515 } else if (line[pos] == '*' && line[pos+1] == '/') {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
516 if (incomment) {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
517 incomment = false;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
518 if (first_commentend == len) {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
519 first_commentend = pos;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
520 }
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
521 last_commentstart = len;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
522 } else {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
523 /* stray end-comment; should we care? */
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
524 }
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
525 }
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
526 }
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
527
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
528 if (in_multiline_comment && first_commentend < last_commentstart) {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
529 /* multiline comment ends */
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
530 /* first_commentend points to the star, adjust */
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
531 *acomm = first_commentend + 2;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
532 *text = len - *acomm;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
533 } else if (in_multiline_comment) {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
534 /* comment did not end, so another one cannot have started */
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
535 assert(last_commentstart == len);
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
536 *acomm = len;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
537 *text = 0;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
538 } else {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
539 *acomm = 0;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
540 *text = len;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
541 }
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
542
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
543 *bcomm = len - last_commentstart;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
544 *text -= *bcomm;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
545
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
546 in_multiline_comment = incomment;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
547 return len;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
548 }
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
549
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
550 void
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
551 directive_gotline(struct place *p, char *line, size_t len)
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
552 {
49
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
553 size_t acomm; /* length of comment ending on this line */
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
554 size_t text; /* length of non-multi-line-comment text */
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
555 size_t bcomm; /* length of comment beginning on this line */
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
556 size_t skip;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
557
49
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
558 directive_scancomments(p, line, len, &acomm, &text, &bcomm);
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
559
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
560 if (acomm > 0) {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
561 if (mode.output_retain_comments && ifstate->curtrue) {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
562 /*
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
563 * Do not expand the comment; send it straight
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
564 * to the output. This will cause it to appear
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
565 * first if we're partway through collecting a
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
566 * macro argument. Too bad. This isn't a
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
567 * standard mode anyway.
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
568 */
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
569 output(p, line, acomm);
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
570 }
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
571 p->column += acomm;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
572 }
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
573
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
574 /* check if we have a directive line */
49
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
575 skip = strspn(line + acomm, ws);
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
576 if (acomm == 0 && line[skip] == '#') {
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
577 char ch;
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
578
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
579 skip = skip + 1 + strspn(line + skip + 1, ws);
49
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
580 assert(skip <= text);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
581 p->column += skip;
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
582 assert(line[len] == '\0');
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
583 /* ensure null termination for directives */
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
584 ch = line[text];
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
585 if (ch != '\0') {
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
586 line[text] = '\0';
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
587 }
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
588 directive_gotdirective(p, line+skip /*, length = text-skip */);
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
589 line[text] = ch;
49
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
590 p->column += text-skip;
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
591 } else if (ifstate->curtrue) {
49
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
592 macro_sendline(p, line + acomm, text);
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
593 p->column += text;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
594 }
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
595
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
596 if (bcomm > 0) {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
597 if (mode.output_retain_comments && ifstate->curtrue) {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
598 output(p, line + acomm + text, bcomm);
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
599 }
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
600 p->column += bcomm;
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
601 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
602 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
603
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
604 void
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
605 directive_goteof(struct place *p)
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
606 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
607 while (ifstate->prev != NULL) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
608 complain(p, "Missing #endif");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
609 complain(&ifstate->startplace, "...opened at this point");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
610 complain_failed();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
611 ifstate_pop();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
612 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
613 macro_sendeof(p);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
614 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
615
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
616 ////////////////////////////////////////////////////////////
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
617 // module initialization
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
618
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
619 void
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
620 directive_init(void)
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
621 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
622 ifstate = ifstate_create(NULL, NULL, true);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
623 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
624
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
625 void
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
626 directive_cleanup(void)
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
627 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
628 assert(ifstate->prev == NULL);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
629 ifstate_destroy(ifstate);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
630 ifstate = NULL;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
631 }