annotate directive.c @ 135:eaae8014a94a

Don't assert and leak memory if failing during argument collection. Once you have a -D option or a -include foo option, you need to clean up the arrays those are accumulated in if you die before they're collected and handled.
author David A. Holland
date Tue, 09 Jul 2013 13:35:40 -0400
parents 1cda505ddc78
children a2c2fe8dbea3 d6e6b3940780
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
30
76c114899f63 copyrights
David A. Holland
parents: 18
diff changeset
1 /*-
99
60184aa42604 add 2013 to copyrights where it seems warranted
David A. Holland
parents: 90
diff changeset
2 * Copyright (c) 2010, 2013 The NetBSD Foundation, Inc.
30
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;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
53
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
54 ////////////////////////////////////////////////////////////
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
55 // common parsing bits
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
56
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
57 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
58 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
59 uncomment(char *buf)
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
60 {
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
61 char *s, *t, *u = NULL;
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
62 bool incomment = false;
81
27c9aafcaca1 Don't recognize comments within double-quote strings.
David A. Holland
parents: 77
diff changeset
63 bool inesc = false;
27c9aafcaca1 Don't recognize comments within double-quote strings.
David A. Holland
parents: 77
diff changeset
64 bool inquote = false;
128
1cda505ddc78 Don't expand macros within character constants.
David A. Holland
parents: 127
diff changeset
65 char quote = '\0';
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
66
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
67 for (s = t = buf; *s; s++) {
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
68 if (incomment) {
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
69 if (s[0] == '*' && s[1] == '/') {
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
70 s++;
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
71 incomment = false;
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
72 }
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
73 } else {
81
27c9aafcaca1 Don't recognize comments within double-quote strings.
David A. Holland
parents: 77
diff changeset
74 if (!inquote && s[0] == '/' && s[1] == '*') {
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
75 incomment = true;
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
76 } else {
81
27c9aafcaca1 Don't recognize comments within double-quote strings.
David A. Holland
parents: 77
diff changeset
77 if (inesc) {
27c9aafcaca1 Don't recognize comments within double-quote strings.
David A. Holland
parents: 77
diff changeset
78 inesc = false;
27c9aafcaca1 Don't recognize comments within double-quote strings.
David A. Holland
parents: 77
diff changeset
79 } else if (s[0] == '\\') {
27c9aafcaca1 Don't recognize comments within double-quote strings.
David A. Holland
parents: 77
diff changeset
80 inesc = true;
128
1cda505ddc78 Don't expand macros within character constants.
David A. Holland
parents: 127
diff changeset
81 } else if (!inquote &&
1cda505ddc78 Don't expand macros within character constants.
David A. Holland
parents: 127
diff changeset
82 (s[0] == '"' || s[0] == '\'')) {
1cda505ddc78 Don't expand macros within character constants.
David A. Holland
parents: 127
diff changeset
83 inquote = true;
1cda505ddc78 Don't expand macros within character constants.
David A. Holland
parents: 127
diff changeset
84 quote = s[0];
1cda505ddc78 Don't expand macros within character constants.
David A. Holland
parents: 127
diff changeset
85 } else if (inquote && s[0] == quote) {
1cda505ddc78 Don't expand macros within character constants.
David A. Holland
parents: 127
diff changeset
86 inquote = false;
81
27c9aafcaca1 Don't recognize comments within double-quote strings.
David A. Holland
parents: 77
diff changeset
87 }
27c9aafcaca1 Don't recognize comments within double-quote strings.
David A. Holland
parents: 77
diff changeset
88
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
89 if (t != s) {
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
90 *t = *s;
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 if (!strchr(ws, *t)) {
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
93 u = t;
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
94 }
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
95 t++;
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
96 }
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
97 }
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
98 }
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
99 if (u) {
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
100 /* end string after last non-whitespace char */
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
101 u[1] = '\0';
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
102 } else {
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
103 *t = '\0';
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
104 }
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
105 }
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
106
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
107 static
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
108 void
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
109 oneword(const char *what, struct place *p2, char *line)
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
110 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
111 size_t pos;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
112
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
113 pos = strcspn(line, ws);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
114 if (line[pos] != '\0') {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
115 p2->column += pos;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
116 complain(p2, "Garbage after %s argument", what);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
117 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
118 line[pos] = '\0';
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
119 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
120 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
121
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
122 ////////////////////////////////////////////////////////////
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
123 // if handling
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
124
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
125 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
126 struct ifstate *
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
127 ifstate_create(struct ifstate *prev, struct place *p, bool startstate)
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
128 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
129 struct ifstate *is;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
130
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
131 is = domalloc(sizeof(*is));
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
132 is->prev = prev;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
133 if (p != NULL) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
134 is->startplace = *p;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
135 } else {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
136 place_setbuiltin(&is->startplace, 1);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
137 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
138 is->curtrue = startstate;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
139 is->evertrue = is->curtrue;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
140 is->seenelse = false;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
141 return is;
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_destroy(struct ifstate *is)
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
147 {
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
148 dofree(is, sizeof(*is));
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
149 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
150
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
151 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
152 void
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
153 ifstate_push(struct place *p, bool startstate)
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
154 {
72
b1d0f10e8d36 handle nested ifs correctly
David A. Holland
parents: 66
diff changeset
155 struct ifstate *newstate;
b1d0f10e8d36 handle nested ifs correctly
David A. Holland
parents: 66
diff changeset
156
b1d0f10e8d36 handle nested ifs correctly
David A. Holland
parents: 66
diff changeset
157 newstate = ifstate_create(ifstate, p, startstate);
b1d0f10e8d36 handle nested ifs correctly
David A. Holland
parents: 66
diff changeset
158 if (!ifstate->curtrue) {
b1d0f10e8d36 handle nested ifs correctly
David A. Holland
parents: 66
diff changeset
159 newstate->curtrue = false;
b1d0f10e8d36 handle nested ifs correctly
David A. Holland
parents: 66
diff changeset
160 newstate->evertrue = true;
b1d0f10e8d36 handle nested ifs correctly
David A. Holland
parents: 66
diff changeset
161 }
b1d0f10e8d36 handle nested ifs correctly
David A. Holland
parents: 66
diff changeset
162 ifstate = newstate;
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
163 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
164
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
165 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
166 void
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
167 ifstate_pop(void)
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
168 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
169 struct ifstate *is;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
170
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
171 is = ifstate;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
172 ifstate = ifstate->prev;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
173 ifstate_destroy(is);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
174 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
175
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
176 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
177 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
178 d_if(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
179 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
180 char *expr;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
181 bool val;
16
9dda765ee85c expression evaluator
David A. Holland
parents: 15
diff changeset
182 struct place p3 = *p2;
82
05a94332f08b In #if/#elif, prune comments *after* macro expansion.
David A. Holland
parents: 81
diff changeset
183 size_t oldlen;
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
184
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
185 expr = macroexpand(p2, line, strlen(line), true);
82
05a94332f08b In #if/#elif, prune comments *after* macro expansion.
David A. Holland
parents: 81
diff changeset
186
05a94332f08b In #if/#elif, prune comments *after* macro expansion.
David A. Holland
parents: 81
diff changeset
187 oldlen = strlen(expr);
05a94332f08b In #if/#elif, prune comments *after* macro expansion.
David A. Holland
parents: 81
diff changeset
188 uncomment(expr);
05a94332f08b In #if/#elif, prune comments *after* macro expansion.
David A. Holland
parents: 81
diff changeset
189 /* trim to fit, so the malloc debugging won't complain */
05a94332f08b In #if/#elif, prune comments *after* macro expansion.
David A. Holland
parents: 81
diff changeset
190 expr = dorealloc(expr, oldlen + 1, strlen(expr) + 1);
05a94332f08b In #if/#elif, prune comments *after* macro expansion.
David A. Holland
parents: 81
diff changeset
191
127
a0a86380456e fix for #if handling:
David A. Holland
parents: 109
diff changeset
192 if (ifstate->curtrue) {
a0a86380456e fix for #if handling:
David A. Holland
parents: 109
diff changeset
193 val = eval(&p3, expr);
a0a86380456e fix for #if handling:
David A. Holland
parents: 109
diff changeset
194 } else {
a0a86380456e fix for #if handling:
David A. Holland
parents: 109
diff changeset
195 val = 0;
a0a86380456e fix for #if handling:
David A. Holland
parents: 109
diff changeset
196 }
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
197 ifstate_push(p, val);
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
198 dostrfree(expr);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
199 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
200
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
201 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
202 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
203 d_ifdef(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
204 {
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
205 uncomment(line);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
206 oneword("#ifdef", p2, line);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
207 ifstate_push(p, macro_isdefined(line));
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 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
211 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
212 d_ifndef(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
213 {
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
214 uncomment(line);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
215 oneword("#ifndef", p2, line);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
216 ifstate_push(p, !macro_isdefined(line));
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
217 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
218
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
219 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
220 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
221 d_elif(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
222 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
223 char *expr;
16
9dda765ee85c expression evaluator
David A. Holland
parents: 15
diff changeset
224 struct place p3 = *p2;
82
05a94332f08b In #if/#elif, prune comments *after* macro expansion.
David A. Holland
parents: 81
diff changeset
225 size_t oldlen;
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
226
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
227 if (ifstate->seenelse) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
228 complain(p, "#elif after #else");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
229 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
230 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
231
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
232 if (ifstate->evertrue) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
233 ifstate->curtrue = false;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
234 } else {
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
235 expr = macroexpand(p2, line, strlen(line), true);
82
05a94332f08b In #if/#elif, prune comments *after* macro expansion.
David A. Holland
parents: 81
diff changeset
236
05a94332f08b In #if/#elif, prune comments *after* macro expansion.
David A. Holland
parents: 81
diff changeset
237 oldlen = strlen(expr);
05a94332f08b In #if/#elif, prune comments *after* macro expansion.
David A. Holland
parents: 81
diff changeset
238 uncomment(expr);
05a94332f08b In #if/#elif, prune comments *after* macro expansion.
David A. Holland
parents: 81
diff changeset
239 /* trim to fit, so the malloc debugging won't complain */
05a94332f08b In #if/#elif, prune comments *after* macro expansion.
David A. Holland
parents: 81
diff changeset
240 expr = dorealloc(expr, oldlen + 1, strlen(expr) + 1);
05a94332f08b In #if/#elif, prune comments *after* macro expansion.
David A. Holland
parents: 81
diff changeset
241
16
9dda765ee85c expression evaluator
David A. Holland
parents: 15
diff changeset
242 ifstate->curtrue = eval(&p3, expr);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
243 ifstate->evertrue = ifstate->curtrue;
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
244 dostrfree(expr);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
245 }
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 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
249 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
250 d_else(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
251 {
103
343af355df1b Pass -Wunused.
David A. Holland
parents: 99
diff changeset
252 (void)p2;
343af355df1b Pass -Wunused.
David A. Holland
parents: 99
diff changeset
253 (void)line;
343af355df1b Pass -Wunused.
David A. Holland
parents: 99
diff changeset
254
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
255 if (ifstate->seenelse) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
256 complain(p, "Multiple #else directives in one conditional");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
257 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
258 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
259
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
260 ifstate->curtrue = !ifstate->evertrue;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
261 ifstate->evertrue = true;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
262 ifstate->seenelse = true;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
263 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
264
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
265 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
266 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
267 d_endif(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
268 {
103
343af355df1b Pass -Wunused.
David A. Holland
parents: 99
diff changeset
269 (void)p2;
343af355df1b Pass -Wunused.
David A. Holland
parents: 99
diff changeset
270 (void)line;
343af355df1b Pass -Wunused.
David A. Holland
parents: 99
diff changeset
271
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
272 if (ifstate->prev == NULL) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
273 complain(p, "Unmatched #endif");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
274 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
275 } else {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
276 ifstate_pop();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
277 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
278 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
279
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
280 ////////////////////////////////////////////////////////////
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
281 // macros
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
282
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
283 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
284 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
285 d_define(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
286 {
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
287 size_t pos, argpos;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
288 struct place p3, p4;
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
289
103
343af355df1b Pass -Wunused.
David A. Holland
parents: 99
diff changeset
290 (void)p;
343af355df1b Pass -Wunused.
David A. Holland
parents: 99
diff changeset
291
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
292 /*
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
293 * line may be:
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
294 * macro expansion
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
295 * macro(arg, arg, ...) expansion
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
296 */
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
297
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
298 pos = strcspn(line, " \t\f\v(");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
299 if (line[pos] == '(') {
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
300 line[pos++] = '\0';
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
301 argpos = pos;
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
302 pos = pos + strcspn(line+pos, "()");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
303 if (line[pos] == '(') {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
304 p2->column += pos;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
305 complain(p2, "Left parenthesis in macro parameters");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
306 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
307 return;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
308 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
309 if (line[pos] != ')') {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
310 p2->column += pos;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
311 complain(p2, "Unclosed macro parameter list");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
312 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
313 return;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
314 }
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
315 line[pos++] = '\0';
36
a489cc223483 Don't demand space after the macro argument parenthesis.
David A. Holland
parents: 30
diff changeset
316 #if 0
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
317 if (!strchr(ws, line[pos])) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
318 p2->column += pos;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
319 complain(p2, "Trash after macro parameter list");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
320 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
321 return;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
322 }
36
a489cc223483 Don't demand space after the macro argument parenthesis.
David A. Holland
parents: 30
diff changeset
323 #endif
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
324 } else if (line[pos] == '\0') {
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
325 argpos = 0;
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
326 } else {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
327 line[pos++] = '\0';
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
328 argpos = 0;
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
329 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
330
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
331 pos += strspn(line+pos, ws);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
332
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
333 p3 = *p2;
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
334 p3.column += argpos;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
335
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
336 p4 = *p2;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
337 p4.column += pos;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
338
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
339 if (argpos) {
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
340 macro_define_params(p2, line, &p3,
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
341 line + argpos, &p4,
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
342 line + pos);
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
343 } else {
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
344 macro_define_plain(p2, line, &p4, line + pos);
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
345 }
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
346 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
347
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
348 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
349 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
350 d_undef(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
351 {
103
343af355df1b Pass -Wunused.
David A. Holland
parents: 99
diff changeset
352 (void)p;
343af355df1b Pass -Wunused.
David A. Holland
parents: 99
diff changeset
353
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
354 uncomment(line);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
355 oneword("#undef", p2, line);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
356 macro_undef(line);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
357 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
358
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
359 ////////////////////////////////////////////////////////////
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
360 // includes
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
361
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
362 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
363 bool
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
364 tryinclude(struct place *p, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
365 {
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
366 size_t len;
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
367
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
368 len = strlen(line);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
369 if (len > 2 && line[0] == '"' && line[len-1] == '"') {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
370 line[len-1] = '\0';
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
371 file_readquote(p, line+1);
62
90c6052410ce Don't truncate the candidate include path strings.
David A. Holland
parents: 49
diff changeset
372 line[len-1] = '"';
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
373 return true;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
374 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
375 if (len > 2 && line[0] == '<' && line[len-1] == '>') {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
376 line[len-1] = '\0';
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
377 file_readbracket(p, line+1);
62
90c6052410ce Don't truncate the candidate include path strings.
David A. Holland
parents: 49
diff changeset
378 line[len-1] = '>';
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
379 return true;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
380 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
381 return false;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
382 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
383
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
384 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
385 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
386 d_include(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
387 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
388 char *text;
82
05a94332f08b In #if/#elif, prune comments *after* macro expansion.
David A. Holland
parents: 81
diff changeset
389 size_t oldlen;
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
390
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
391 uncomment(line);
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
392 if (tryinclude(p, line)) {
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
393 return;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
394 }
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
395 text = macroexpand(p2, line, strlen(line), false);
82
05a94332f08b In #if/#elif, prune comments *after* macro expansion.
David A. Holland
parents: 81
diff changeset
396
05a94332f08b In #if/#elif, prune comments *after* macro expansion.
David A. Holland
parents: 81
diff changeset
397 oldlen = strlen(text);
05a94332f08b In #if/#elif, prune comments *after* macro expansion.
David A. Holland
parents: 81
diff changeset
398 uncomment(text);
05a94332f08b In #if/#elif, prune comments *after* macro expansion.
David A. Holland
parents: 81
diff changeset
399 /* trim to fit, so the malloc debugging won't complain */
05a94332f08b In #if/#elif, prune comments *after* macro expansion.
David A. Holland
parents: 81
diff changeset
400 text = dorealloc(text, oldlen + 1, strlen(text) + 1);
05a94332f08b In #if/#elif, prune comments *after* macro expansion.
David A. Holland
parents: 81
diff changeset
401
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
402 if (tryinclude(p, text)) {
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
403 dostrfree(text);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
404 return;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
405 }
90
594495750d84 If we get a malformed #include, print it.
David A. Holland
parents: 83
diff changeset
406 complain(p, "Illegal #include directive");
594495750d84 If we get a malformed #include, print it.
David A. Holland
parents: 83
diff changeset
407 complain(p, "Before macro expansion: #include %s", line);
594495750d84 If we get a malformed #include, print it.
David A. Holland
parents: 83
diff changeset
408 complain(p, "After macro expansion: #include %s", text);
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
409 dostrfree(text);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
410 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
411 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
412
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
413 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
414 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
415 d_line(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
416 {
103
343af355df1b Pass -Wunused.
David A. Holland
parents: 99
diff changeset
417 (void)p2;
343af355df1b Pass -Wunused.
David A. Holland
parents: 99
diff changeset
418 (void)line;
343af355df1b Pass -Wunused.
David A. Holland
parents: 99
diff changeset
419
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
420 /* XXX */
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
421 complain(p, "Sorry, no #line yet");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
422 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
423
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
424 ////////////////////////////////////////////////////////////
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
425 // messages
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
426
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
427 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
428 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
429 d_warning(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
430 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
431 char *msg;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
432
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
433 msg = macroexpand(p2, line, strlen(line), false);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
434 complain(p, "#warning: %s", msg);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
435 if (mode.werror) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
436 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
437 }
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
438 dostrfree(msg);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
439 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
440
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
441 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
442 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
443 d_error(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
444 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
445 char *msg;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
446
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
447 msg = macroexpand(p2, line, strlen(line), false);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
448 complain(p, "#error: %s", msg);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
449 complain_fail();
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
450 dostrfree(msg);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
451 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
452
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
453 ////////////////////////////////////////////////////////////
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
454 // other
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
455
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
456 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
457 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
458 d_pragma(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
459 {
103
343af355df1b Pass -Wunused.
David A. Holland
parents: 99
diff changeset
460 (void)p2;
343af355df1b Pass -Wunused.
David A. Holland
parents: 99
diff changeset
461
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
462 complain(p, "#pragma %s", line);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
463 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
464 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
465
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
466 ////////////////////////////////////////////////////////////
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
467 // directive table
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
468
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
469 static const struct {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
470 const char *name;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
471 bool ifskip;
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
472 void (*func)(struct place *, struct place *, char *line);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
473 } directives[] = {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
474 { "define", true, d_define },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
475 { "elif", false, d_elif },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
476 { "else", false, d_else },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
477 { "endif", false, d_endif },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
478 { "error", true, d_error },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
479 { "if", false, d_if },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
480 { "ifdef", false, d_ifdef },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
481 { "ifndef", false, d_ifndef },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
482 { "include", true, d_include },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
483 { "line", true, d_line },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
484 { "pragma", true, d_pragma },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
485 { "undef", true, d_undef },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
486 { "warning", true, d_warning },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
487 };
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
488 static const unsigned numdirectives = HOWMANY(directives);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
489
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
490 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
491 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
492 directive_gotdirective(struct place *p, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
493 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
494 struct place p2;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
495 size_t len, skip;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
496 unsigned i;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
497
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
498 p2 = *p;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
499 for (i=0; i<numdirectives; i++) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
500 len = strlen(directives[i].name);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
501 if (!strncmp(line, directives[i].name, len) &&
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
502 strchr(ws, line[len])) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
503 if (directives[i].ifskip && !ifstate->curtrue) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
504 return;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
505 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
506 skip = len + strspn(line+len, ws);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
507 p2.column += skip;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
508 line += skip;
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
509
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
510 len = strlen(line);
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
511 len = notrailingws(line, len);
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
512 if (len < strlen(line)) {
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
513 line[len] = '\0';
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
514 }
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
515 directives[i].func(p, &p2, line);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
516 return;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
517 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
518 }
83
3e505c16b0b0 Accept # by itself, including with a comment after it.
David A. Holland
parents: 82
diff changeset
519 /* ugh. allow # by itself, including with a comment after it */
3e505c16b0b0 Accept # by itself, including with a comment after it.
David A. Holland
parents: 82
diff changeset
520 uncomment(line);
3e505c16b0b0 Accept # by itself, including with a comment after it.
David A. Holland
parents: 82
diff changeset
521 if (line[0] == '\0') {
3e505c16b0b0 Accept # by itself, including with a comment after it.
David A. Holland
parents: 82
diff changeset
522 return;
3e505c16b0b0 Accept # by itself, including with a comment after it.
David A. Holland
parents: 82
diff changeset
523 }
3e505c16b0b0 Accept # by itself, including with a comment after it.
David A. Holland
parents: 82
diff changeset
524
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
525 skip = strcspn(line, ws);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
526 complain(p, "Unknown directive #%.*s", (int)skip, line);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
527 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
528 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
529
49
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
530 /*
77
123168887da8 Clean out old not-really-working nested comment handling.
David A. Holland
parents: 72
diff changeset
531 * Check for nested comment delimiters in LINE.
49
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
532 */
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
533 static
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
534 size_t
77
123168887da8 Clean out old not-really-working nested comment handling.
David A. Holland
parents: 72
diff changeset
535 directive_scancomments(const struct place *p, char *line, size_t len)
49
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
536 {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
537 size_t pos;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
538 bool incomment;
77
123168887da8 Clean out old not-really-working nested comment handling.
David A. Holland
parents: 72
diff changeset
539 struct place p2;
49
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
540
77
123168887da8 Clean out old not-really-working nested comment handling.
David A. Holland
parents: 72
diff changeset
541 p2 = *p;
123168887da8 Clean out old not-really-working nested comment handling.
David A. Holland
parents: 72
diff changeset
542 incomment = 0;
49
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
543 for (pos = 0; pos+1 < len; pos++) {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
544 if (line[pos] == '/' && line[pos+1] == '*') {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
545 if (incomment) {
77
123168887da8 Clean out old not-really-working nested comment handling.
David A. Holland
parents: 72
diff changeset
546 complain(&p2, "Warning: %c%c within comment",
123168887da8 Clean out old not-really-working nested comment handling.
David A. Holland
parents: 72
diff changeset
547 '/', '*');
123168887da8 Clean out old not-really-working nested comment handling.
David A. Holland
parents: 72
diff changeset
548 if (mode.werror) {
123168887da8 Clean out old not-really-working nested comment handling.
David A. Holland
parents: 72
diff changeset
549 complain_failed();
123168887da8 Clean out old not-really-working nested comment handling.
David A. Holland
parents: 72
diff changeset
550 }
49
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
551 } else {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
552 incomment = true;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
553 }
109
4483a14ee101 Make -Wcomment work again
David A. Holland
parents: 103
diff changeset
554 pos++;
49
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
555 } else if (line[pos] == '*' && line[pos+1] == '/') {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
556 if (incomment) {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
557 incomment = false;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
558 } else {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
559 /* stray end-comment; should we care? */
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
560 }
109
4483a14ee101 Make -Wcomment work again
David A. Holland
parents: 103
diff changeset
561 pos++;
49
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
562 }
77
123168887da8 Clean out old not-really-working nested comment handling.
David A. Holland
parents: 72
diff changeset
563 if (line[pos] == '\n') {
123168887da8 Clean out old not-really-working nested comment handling.
David A. Holland
parents: 72
diff changeset
564 p2.line++;
123168887da8 Clean out old not-really-working nested comment handling.
David A. Holland
parents: 72
diff changeset
565 p2.column = 0;
123168887da8 Clean out old not-really-working nested comment handling.
David A. Holland
parents: 72
diff changeset
566 } else {
123168887da8 Clean out old not-really-working nested comment handling.
David A. Holland
parents: 72
diff changeset
567 p2.column++;
123168887da8 Clean out old not-really-working nested comment handling.
David A. Holland
parents: 72
diff changeset
568 }
49
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
569 }
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
570
77
123168887da8 Clean out old not-really-working nested comment handling.
David A. Holland
parents: 72
diff changeset
571 /* multiline comments are supposed to arrive in a single buffer */
123168887da8 Clean out old not-really-working nested comment handling.
David A. Holland
parents: 72
diff changeset
572 assert(!incomment);
49
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
573 return len;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
574 }
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
575
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
576 void
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
577 directive_gotline(struct place *p, char *line, size_t len)
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
578 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
579 size_t skip;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
580
77
123168887da8 Clean out old not-really-working nested comment handling.
David A. Holland
parents: 72
diff changeset
581 if (warns.nestcomment) {
123168887da8 Clean out old not-really-working nested comment handling.
David A. Holland
parents: 72
diff changeset
582 directive_scancomments(p, line, len);
49
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
583 }
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
584
66
f8507e5ed84c Recognize directive lines only when the # is exactly in column 0.
David A. Holland
parents: 64
diff changeset
585 /* check if we have a directive line (# exactly in column 0) */
77
123168887da8 Clean out old not-really-working nested comment handling.
David A. Holland
parents: 72
diff changeset
586 if (line[0] == '#') {
66
f8507e5ed84c Recognize directive lines only when the # is exactly in column 0.
David A. Holland
parents: 64
diff changeset
587 skip = 1 + strspn(line + 1, ws);
77
123168887da8 Clean out old not-really-working nested comment handling.
David A. Holland
parents: 72
diff changeset
588 assert(skip <= len);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
589 p->column += skip;
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
590 assert(line[len] == '\0');
77
123168887da8 Clean out old not-really-working nested comment handling.
David A. Holland
parents: 72
diff changeset
591 directive_gotdirective(p, line+skip /*, length = len-skip */);
123168887da8 Clean out old not-really-working nested comment handling.
David A. Holland
parents: 72
diff changeset
592 p->column += len-skip;
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
593 } else if (ifstate->curtrue) {
77
123168887da8 Clean out old not-really-working nested comment handling.
David A. Holland
parents: 72
diff changeset
594 macro_sendline(p, line, len);
123168887da8 Clean out old not-really-working nested comment handling.
David A. Holland
parents: 72
diff changeset
595 p->column += len;
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
596 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
597 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
598
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
599 void
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
600 directive_goteof(struct place *p)
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
601 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
602 while (ifstate->prev != NULL) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
603 complain(p, "Missing #endif");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
604 complain(&ifstate->startplace, "...opened at this point");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
605 complain_failed();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
606 ifstate_pop();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
607 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
608 macro_sendeof(p);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
609 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
610
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
611 ////////////////////////////////////////////////////////////
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
612 // module initialization
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
613
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
614 void
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
615 directive_init(void)
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
616 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
617 ifstate = ifstate_create(NULL, NULL, true);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
618 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
619
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
620 void
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
621 directive_cleanup(void)
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
622 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
623 assert(ifstate->prev == NULL);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
624 ifstate_destroy(ifstate);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
625 ifstate = NULL;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
626 }