annotate directive.c @ 75:980ed7cb620a

More multiline comment fixes. It looks like the only rational way to handle multiline comments is to treat the newlines as fully part of the comment text.
author David A. Holland
date Mon, 10 Jun 2013 19:56:55 -0400 (2013-06-10)
parents b1d0f10e8d36
children 123168887da8
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 {
72
b1d0f10e8d36 handle nested ifs correctly
David A. Holland
parents: 66
diff changeset
141 struct ifstate *newstate;
b1d0f10e8d36 handle nested ifs correctly
David A. Holland
parents: 66
diff changeset
142
b1d0f10e8d36 handle nested ifs correctly
David A. Holland
parents: 66
diff changeset
143 newstate = ifstate_create(ifstate, p, startstate);
b1d0f10e8d36 handle nested ifs correctly
David A. Holland
parents: 66
diff changeset
144 if (!ifstate->curtrue) {
b1d0f10e8d36 handle nested ifs correctly
David A. Holland
parents: 66
diff changeset
145 newstate->curtrue = false;
b1d0f10e8d36 handle nested ifs correctly
David A. Holland
parents: 66
diff changeset
146 newstate->evertrue = true;
b1d0f10e8d36 handle nested ifs correctly
David A. Holland
parents: 66
diff changeset
147 }
b1d0f10e8d36 handle nested ifs correctly
David A. Holland
parents: 66
diff changeset
148 ifstate = newstate;
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_pop(void)
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
154 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
155 struct ifstate *is;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
156
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
157 is = ifstate;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
158 ifstate = ifstate->prev;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
159 ifstate_destroy(is);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
160 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
161
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
162 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
163 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
164 d_if(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
165 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
166 char *expr;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
167 bool val;
16
9dda765ee85c expression evaluator
David A. Holland
parents: 15
diff changeset
168 struct place p3 = *p2;
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
169
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
170 uncomment(line);
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
171 expr = macroexpand(p2, line, strlen(line), true);
16
9dda765ee85c expression evaluator
David A. Holland
parents: 15
diff changeset
172 val = eval(&p3, expr);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
173 ifstate_push(p, val);
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
174 dostrfree(expr);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
175 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
176
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
177 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
178 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
179 d_ifdef(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
180 {
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
181 uncomment(line);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
182 oneword("#ifdef", p2, line);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
183 ifstate_push(p, macro_isdefined(line));
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
184 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
185
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
186 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
187 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
188 d_ifndef(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
189 {
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
190 uncomment(line);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
191 oneword("#ifndef", p2, line);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
192 ifstate_push(p, !macro_isdefined(line));
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
193 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
194
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
195 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
196 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
197 d_elif(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
198 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
199 char *expr;
16
9dda765ee85c expression evaluator
David A. Holland
parents: 15
diff changeset
200 struct place p3 = *p2;
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
201
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
202 if (ifstate->seenelse) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
203 complain(p, "#elif after #else");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
204 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
205 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
206
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
207 if (ifstate->evertrue) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
208 ifstate->curtrue = false;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
209 } else {
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
210 uncomment(line);
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
211 expr = macroexpand(p2, line, strlen(line), true);
16
9dda765ee85c expression evaluator
David A. Holland
parents: 15
diff changeset
212 ifstate->curtrue = eval(&p3, expr);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
213 ifstate->evertrue = ifstate->curtrue;
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
214 dostrfree(expr);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
215 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
216 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
217
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
218 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
219 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
220 d_else(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
221 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
222 if (ifstate->seenelse) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
223 complain(p, "Multiple #else directives in one conditional");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
224 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
225 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
226
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
227 ifstate->curtrue = !ifstate->evertrue;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
228 ifstate->evertrue = true;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
229 ifstate->seenelse = true;
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 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
233 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
234 d_endif(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
235 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
236 if (ifstate->prev == NULL) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
237 complain(p, "Unmatched #endif");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
238 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
239 } else {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
240 ifstate_pop();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
241 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
242 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
243
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
244 ////////////////////////////////////////////////////////////
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
245 // macros
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
246
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
247 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
248 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
249 d_define(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
250 {
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
251 size_t pos, argpos;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
252 struct place p3, p4;
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
253
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
254 /*
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
255 * line may be:
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
256 * macro expansion
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
257 * macro(arg, arg, ...) expansion
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 pos = strcspn(line, " \t\f\v(");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
261 if (line[pos] == '(') {
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
262 line[pos++] = '\0';
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
263 argpos = pos;
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
264 pos = pos + strcspn(line+pos, "()");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
265 if (line[pos] == '(') {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
266 p2->column += pos;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
267 complain(p2, "Left parenthesis in macro parameters");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
268 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
269 return;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
270 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
271 if (line[pos] != ')') {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
272 p2->column += pos;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
273 complain(p2, "Unclosed macro parameter list");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
274 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
275 return;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
276 }
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
277 line[pos++] = '\0';
36
a489cc223483 Don't demand space after the macro argument parenthesis.
David A. Holland
parents: 30
diff changeset
278 #if 0
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
279 if (!strchr(ws, line[pos])) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
280 p2->column += pos;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
281 complain(p2, "Trash after macro parameter list");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
282 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
283 return;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
284 }
36
a489cc223483 Don't demand space after the macro argument parenthesis.
David A. Holland
parents: 30
diff changeset
285 #endif
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
286 } else if (line[pos] == '\0') {
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
287 argpos = 0;
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
288 } else {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
289 line[pos++] = '\0';
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
290 argpos = 0;
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
291 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
292
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
293 pos += strspn(line+pos, ws);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
294
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
295 p3 = *p2;
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
296 p3.column += argpos;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
297
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
298 p4 = *p2;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
299 p4.column += pos;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
300
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
301 if (argpos) {
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
302 macro_define_params(p2, line, &p3,
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
303 line + argpos, &p4,
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
304 line + pos);
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
305 } else {
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
306 macro_define_plain(p2, line, &p4, line + pos);
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 16
diff changeset
307 }
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
308 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
309
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
310 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
311 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
312 d_undef(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
313 {
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
314 uncomment(line);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
315 oneword("#undef", p2, line);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
316 macro_undef(line);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
317 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
318
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
319 ////////////////////////////////////////////////////////////
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
320 // includes
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
321
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
322 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
323 bool
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
324 tryinclude(struct place *p, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
325 {
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
326 size_t len;
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
327
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
328 len = strlen(line);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
329 if (len > 2 && line[0] == '"' && line[len-1] == '"') {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
330 line[len-1] = '\0';
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
331 file_readquote(p, line+1);
62
90c6052410ce Don't truncate the candidate include path strings.
David A. Holland
parents: 49
diff changeset
332 line[len-1] = '"';
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
333 return true;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
334 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
335 if (len > 2 && line[0] == '<' && line[len-1] == '>') {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
336 line[len-1] = '\0';
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
337 file_readbracket(p, line+1);
62
90c6052410ce Don't truncate the candidate include path strings.
David A. Holland
parents: 49
diff changeset
338 line[len-1] = '>';
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
339 return true;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
340 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
341 return false;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
342 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
343
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
344 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
345 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
346 d_include(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
347 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
348 char *text;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
349
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
350 uncomment(line);
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
351 if (tryinclude(p, line)) {
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
352 return;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
353 }
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
354 text = macroexpand(p2, line, strlen(line), false);
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
355 if (tryinclude(p, text)) {
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
356 dostrfree(text);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
357 return;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
358 }
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
359 dostrfree(text);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
360 complain(p, "Illegal #include directive");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
361 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
362 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
363
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
364 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
365 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
366 d_line(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
367 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
368 /* XXX */
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
369 complain(p, "Sorry, no #line yet");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
370 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
371
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
372 ////////////////////////////////////////////////////////////
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
373 // messages
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
374
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
375 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
376 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
377 d_warning(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
378 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
379 char *msg;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
380
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
381 msg = macroexpand(p2, line, strlen(line), false);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
382 complain(p, "#warning: %s", msg);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
383 if (mode.werror) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
384 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
385 }
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
386 dostrfree(msg);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
387 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
388
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
389 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
390 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
391 d_error(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
392 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
393 char *msg;
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 msg = macroexpand(p2, line, strlen(line), false);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
396 complain(p, "#error: %s", msg);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
397 complain_fail();
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
398 dostrfree(msg);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
399 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
400
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
401 ////////////////////////////////////////////////////////////
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
402 // other
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
403
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
404 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
405 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
406 d_pragma(struct place *p, struct place *p2, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
407 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
408 complain(p, "#pragma %s", line);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
409 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
410 }
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 // directive table
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
414
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
415 static const struct {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
416 const char *name;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
417 bool ifskip;
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
418 void (*func)(struct place *, struct place *, char *line);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
419 } directives[] = {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
420 { "define", true, d_define },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
421 { "elif", false, d_elif },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
422 { "else", false, d_else },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
423 { "endif", false, d_endif },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
424 { "error", true, d_error },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
425 { "if", false, d_if },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
426 { "ifdef", false, d_ifdef },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
427 { "ifndef", false, d_ifndef },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
428 { "include", true, d_include },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
429 { "line", true, d_line },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
430 { "pragma", true, d_pragma },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
431 { "undef", true, d_undef },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
432 { "warning", true, d_warning },
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
433 };
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
434 static const unsigned numdirectives = HOWMANY(directives);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
435
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
436 static
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
437 void
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
438 directive_gotdirective(struct place *p, char *line)
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
439 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
440 struct place p2;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
441 size_t len, skip;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
442 unsigned i;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
443
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
444 p2 = *p;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
445 for (i=0; i<numdirectives; i++) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
446 len = strlen(directives[i].name);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
447 if (!strncmp(line, directives[i].name, len) &&
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
448 strchr(ws, line[len])) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
449 if (directives[i].ifskip && !ifstate->curtrue) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
450 return;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
451 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
452 skip = len + strspn(line+len, ws);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
453 p2.column += skip;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
454 line += skip;
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
455
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
456 len = strlen(line);
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
457 len = notrailingws(line, len);
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
458 if (len < strlen(line)) {
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
459 line[len] = '\0';
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
460 }
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
461 directives[i].func(p, &p2, line);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
462 return;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
463 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
464 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
465 skip = strcspn(line, ws);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
466 complain(p, "Unknown directive #%.*s", (int)skip, line);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
467 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
468 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
469
49
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 * 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
472 * offset POS from the place P.
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
473 */
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
474 static
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
475 void
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
476 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
477 {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
478 struct place p2;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
479
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
480 if (warns.nestcomment) {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
481 p2 = *p;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
482 p2.column += pos;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
483 complain(p, "Warning: %c%c within comment",
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 if (mode.werror) {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
486 complain_failed();
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
487 }
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
488 }
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
489 }
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 /*
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
492 * 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
493 * 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
494 * 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
495 * 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
496 * 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
497 *
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
498 * 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
499 * this line is handled.
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
500 */
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
501 static
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
502 size_t
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
503 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
504 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
505 {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
506 size_t pos;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
507 size_t first_commentend;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
508 size_t last_commentstart;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
509 bool incomment;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
510
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
511 first_commentend = len;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
512 last_commentstart = len;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
513 incomment = in_multiline_comment;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
514 for (pos = 0; pos+1 < len; pos++) {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
515 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 warn_nestcomment(p, pos);
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
518 } else {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
519 incomment = true;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
520 last_commentstart = pos;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
521 }
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
522 } else if (line[pos] == '*' && line[pos+1] == '/') {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
523 if (incomment) {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
524 incomment = false;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
525 if (first_commentend == len) {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
526 first_commentend = pos;
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 last_commentstart = len;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
529 } else {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
530 /* stray end-comment; should we care? */
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
531 }
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 }
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
534
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
535 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
536 /* multiline comment ends */
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
537 /* first_commentend points to the star, adjust */
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
538 *acomm = first_commentend + 2;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
539 *text = len - *acomm;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
540 } else if (in_multiline_comment) {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
541 /* 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
542 assert(last_commentstart == len);
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
543 *acomm = len;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
544 *text = 0;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
545 } else {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
546 *acomm = 0;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
547 *text = 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
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
550 *bcomm = len - last_commentstart;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
551 *text -= *bcomm;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
552
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
553 in_multiline_comment = incomment;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
554 return len;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
555 }
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
556
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
557 void
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
558 directive_gotline(struct place *p, char *line, size_t len)
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
559 {
49
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
560 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
561 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
562 size_t bcomm; /* length of comment beginning on this line */
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
563 size_t skip;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
564
49
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
565 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
566
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
567 if (acomm > 0) {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
568 if (mode.output_retain_comments && ifstate->curtrue) {
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 * 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
571 * 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
572 * 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
573 * 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
574 * standard mode anyway.
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
575 */
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
576 output(p, line, acomm);
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
577 }
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
578 p->column += acomm;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
579 }
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
580
66
f8507e5ed84c Recognize directive lines only when the # is exactly in column 0.
David A. Holland
parents: 64
diff changeset
581 /* check if we have a directive line (# exactly in column 0) */
f8507e5ed84c Recognize directive lines only when the # is exactly in column 0.
David A. Holland
parents: 64
diff changeset
582 if (acomm == 0 && line[0] == '#') {
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
583 char ch;
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
584
66
f8507e5ed84c Recognize directive lines only when the # is exactly in column 0.
David A. Holland
parents: 64
diff changeset
585 skip = 1 + strspn(line + 1, ws);
49
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
586 assert(skip <= text);
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
587 p->column += skip;
64
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
588 assert(line[len] == '\0');
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
589 /* ensure null termination for directives */
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
590 ch = line[text];
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
591 if (ch != '\0') {
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
592 line[text] = '\0';
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
593 }
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
594 directive_gotdirective(p, line+skip /*, length = text-skip */);
f50b4ea6cbfe Prune single-line comments from (most) directive lines.
David A. Holland
parents: 62
diff changeset
595 line[text] = ch;
49
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
596 p->column += text-skip;
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
597 } else if (ifstate->curtrue) {
49
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
598 macro_sendline(p, line + acomm, text);
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
599 p->column += text;
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
600 }
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
601
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
602 if (bcomm > 0) {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
603 if (mode.output_retain_comments && ifstate->curtrue) {
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
604 output(p, line + acomm + text, bcomm);
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
605 }
8a204d153398 Intercept multiline comments earlier. Leave same-line comments alone.
David A. Holland
parents: 39
diff changeset
606 p->column += bcomm;
15
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
607 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
608 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
609
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
610 void
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
611 directive_goteof(struct place *p)
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
612 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
613 while (ifstate->prev != NULL) {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
614 complain(p, "Missing #endif");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
615 complain(&ifstate->startplace, "...opened at this point");
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
616 complain_failed();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
617 ifstate_pop();
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
618 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
619 macro_sendeof(p);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
620 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
621
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
622 ////////////////////////////////////////////////////////////
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
623 // module initialization
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_init(void)
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
627 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
628 ifstate = ifstate_create(NULL, NULL, true);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
629 }
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
630
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
631 void
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
632 directive_cleanup(void)
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
633 {
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
634 assert(ifstate->prev == NULL);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
635 ifstate_destroy(ifstate);
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
636 ifstate = NULL;
f6177d3ed5c2 handle directives
David A. Holland
parents:
diff changeset
637 }