annotate macro.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
parents bbbf71859a21
children 7e4723d34248
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
30
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
1 /*-
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
2 * Copyright (c) 2010 The NetBSD Foundation, Inc.
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
3 * All rights reserved.
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
4 *
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
5 * This code is derived from software contributed to The NetBSD Foundation
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
6 * by David A. Holland.
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
7 *
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
8 * Redistribution and use in source and binary forms, with or without
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
9 * modification, are permitted provided that the following conditions
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
10 * are met:
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
11 * 1. Redistributions of source code must retain the above copyright
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
12 * notice, this list of conditions and the following disclaimer.
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
13 * 2. Redistributions in binary form must reproduce the above copyright
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
14 * notice, this list of conditions and the following disclaimer in the
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
15 * documentation and/or other materials provided with the distribution.
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
16 *
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
17 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
18 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
19 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
20 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
25 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
76c114899f63 copyrights
David A. Holland
parents: 28
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: 28
diff changeset
27 * POSSIBILITY OF SUCH DAMAGE.
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
28 */
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
29
33
a5acb7049e4c need stdint.h for uint16_t
David A. Holland
parents: 30
diff changeset
30 #include <stdint.h>
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
31 #include <stdlib.h>
76da41da923f added macro table
David A. Holland
parents:
diff changeset
32 #include <string.h>
76da41da923f added macro table
David A. Holland
parents:
diff changeset
33
76da41da923f added macro table
David A. Holland
parents:
diff changeset
34 #include "array.h"
76da41da923f added macro table
David A. Holland
parents:
diff changeset
35 #include "mode.h"
76da41da923f added macro table
David A. Holland
parents:
diff changeset
36 #include "place.h"
76da41da923f added macro table
David A. Holland
parents:
diff changeset
37 #include "macro.h"
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
38 #include "output.h"
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
39
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
40 struct expansionitem {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
41 bool isstring;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
42 union {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
43 char *string;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
44 unsigned param;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
45 };
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
46 };
47
2e25e55dba6b Fix inline usage as per the version in dholland-make2.
David A. Holland
parents: 42
diff changeset
47 DECLARRAY(expansionitem, static __unused);
2e25e55dba6b Fix inline usage as per the version in dholland-make2.
David A. Holland
parents: 42
diff changeset
48 DEFARRAY(expansionitem, static);
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
49
76da41da923f added macro table
David A. Holland
parents:
diff changeset
50 struct macro {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
51 struct place defplace;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
52 struct place expansionplace;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
53 unsigned hash;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
54 char *name;
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
55 bool hasparams;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
56 struct stringarray params;
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
57 struct expansionitemarray expansion;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
58 bool inuse;
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
59 };
47
2e25e55dba6b Fix inline usage as per the version in dholland-make2.
David A. Holland
parents: 42
diff changeset
60 DECLARRAY(macro, static __unused);
2e25e55dba6b Fix inline usage as per the version in dholland-make2.
David A. Holland
parents: 42
diff changeset
61 DEFARRAY(macro, static);
2e25e55dba6b Fix inline usage as per the version in dholland-make2.
David A. Holland
parents: 42
diff changeset
62 DECLARRAY(macroarray, static __unused);
2e25e55dba6b Fix inline usage as per the version in dholland-make2.
David A. Holland
parents: 42
diff changeset
63 DEFARRAY(macroarray, static);
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
64
76da41da923f added macro table
David A. Holland
parents:
diff changeset
65 static struct macroarrayarray macros;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
66 static unsigned total_macros;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
67 static unsigned hashmask;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
68
76da41da923f added macro table
David A. Holland
parents:
diff changeset
69 ////////////////////////////////////////////////////////////
76da41da923f added macro table
David A. Holland
parents:
diff changeset
70 // macro structure ops
76da41da923f added macro table
David A. Holland
parents:
diff changeset
71
76da41da923f added macro table
David A. Holland
parents:
diff changeset
72 static
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
73 struct expansionitem *
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
74 expansionitem_create_string(const char *string)
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
75 {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
76 struct expansionitem *ei;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
77
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
78 ei = domalloc(sizeof(*ei));
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
79 ei->isstring = true;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
80 ei->string = dostrdup(string);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
81 return ei;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
82 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
83
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
84 static
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
85 struct expansionitem *
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
86 expansionitem_create_stringlen(const char *string, size_t len)
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
87 {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
88 struct expansionitem *ei;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
89
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
90 ei = domalloc(sizeof(*ei));
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
91 ei->isstring = true;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
92 ei->string = dostrndup(string, len);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
93 return ei;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
94 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
95
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
96 static
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
97 struct expansionitem *
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
98 expansionitem_create_param(unsigned param)
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
99 {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
100 struct expansionitem *ei;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
101
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
102 ei = domalloc(sizeof(*ei));
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
103 ei->isstring = false;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
104 ei->param = param;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
105 return ei;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
106 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
107
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
108 static
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
109 void
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
110 expansionitem_destroy(struct expansionitem *ei)
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
111 {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
112 if (ei->isstring) {
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
113 dostrfree(ei->string);
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
114 }
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
115 dofree(ei, sizeof(*ei));
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
116 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
117
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
118 static
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
119 bool
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
120 expansionitem_eq(const struct expansionitem *ei1,
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
121 const struct expansionitem *ei2)
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
122 {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
123 if (ei1->isstring != ei2->isstring) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
124 return false;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
125 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
126 if (ei1->isstring) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
127 if (strcmp(ei1->string, ei2->string) != 0) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
128 return false;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
129 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
130 } else {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
131 if (ei1->param != ei2->param) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
132 return false;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
133 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
134 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
135 return true;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
136 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
137
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
138 static
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
139 struct macro *
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
140 macro_create(struct place *p1, const char *name, unsigned hash,
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
141 struct place *p2)
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
142 {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
143 struct macro *m;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
144
76da41da923f added macro table
David A. Holland
parents:
diff changeset
145 m = domalloc(sizeof(*m));
76da41da923f added macro table
David A. Holland
parents:
diff changeset
146 m->defplace = *p1;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
147 m->expansionplace = *p2;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
148 m->hash = hash;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
149 m->name = dostrdup(name);
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
150 m->hasparams = false;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
151 stringarray_init(&m->params);
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
152 expansionitemarray_init(&m->expansion);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
153 m->inuse = false;
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
154 return m;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
155 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
156
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
157 DESTROYALL_ARRAY(expansionitem, );
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
158
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
159 static
76da41da923f added macro table
David A. Holland
parents:
diff changeset
160 void
76da41da923f added macro table
David A. Holland
parents:
diff changeset
161 macro_destroy(struct macro *m)
76da41da923f added macro table
David A. Holland
parents:
diff changeset
162 {
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
163 expansionitemarray_destroyall(&m->expansion);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
164 expansionitemarray_cleanup(&m->expansion);
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
165 dostrfree(m->name);
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
166 dofree(m, sizeof(*m));
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
167 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
168
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
169 static
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
170 bool
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
171 macro_eq(const struct macro *m1, const struct macro *m2)
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
172 {
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
173 unsigned num1, num2, i;
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
174 struct expansionitem *ei1, *ei2;
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
175 const char *p1, *p2;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
176
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
177 if (strcmp(m1->name, m2->name) != 0) {
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
178 return false;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
179 }
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
180
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
181 if (m1->hasparams != m2->hasparams) {
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
182 return false;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
183 }
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
184
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
185 num1 = expansionitemarray_num(&m1->expansion);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
186 num2 = expansionitemarray_num(&m2->expansion);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
187 if (num1 != num2) {
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
188 return false;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
189 }
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
190
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
191 for (i=0; i<num1; i++) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
192 ei1 = expansionitemarray_get(&m1->expansion, i);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
193 ei2 = expansionitemarray_get(&m2->expansion, i);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
194 if (!expansionitem_eq(ei1, ei2)) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
195 return false;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
196 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
197 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
198
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
199 num1 = stringarray_num(&m1->params);
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
200 num2 = stringarray_num(&m2->params);
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
201 if (num1 != num2) {
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
202 return false;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
203 }
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
204
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
205 for (i=0; i<num1; i++) {
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
206 p1 = stringarray_get(&m1->params, i);
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
207 p2 = stringarray_get(&m2->params, i);
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
208 if (strcmp(p1, p2) != 0) {
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
209 return false;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
210 }
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
211 }
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
212 return true;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
213 }
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
214
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
215 ////////////////////////////////////////////////////////////
76da41da923f added macro table
David A. Holland
parents:
diff changeset
216 // macro table
76da41da923f added macro table
David A. Holland
parents:
diff changeset
217
76da41da923f added macro table
David A. Holland
parents:
diff changeset
218 /*
76da41da923f added macro table
David A. Holland
parents:
diff changeset
219 * Unless I've screwed up, this is something called Fletcher's Checksum
76da41da923f added macro table
David A. Holland
parents:
diff changeset
220 * that showed up in Dr. Dobbs in, according to my notes, May 1992. The
76da41da923f added macro table
David A. Holland
parents:
diff changeset
221 * implementation is new.
76da41da923f added macro table
David A. Holland
parents:
diff changeset
222 */
76da41da923f added macro table
David A. Holland
parents:
diff changeset
223 static
76da41da923f added macro table
David A. Holland
parents:
diff changeset
224 unsigned
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
225 hashfunc(const char *s, size_t len)
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
226 {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
227 uint16_t x1, x2, a;
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
228 size_t i;
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
229
76da41da923f added macro table
David A. Holland
parents:
diff changeset
230 x1 = (uint16_t) (len >> 16);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
231 x2 = (uint16_t) (len);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
232 if (x1==0) {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
233 x1++;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
234 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
235 if (x2==0) {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
236 x2++;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
237 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
238
76da41da923f added macro table
David A. Holland
parents:
diff changeset
239 for (i=0; i<len; i+=2) {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
240 if (i==len-1) {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
241 a = (unsigned char)s[i];
76da41da923f added macro table
David A. Holland
parents:
diff changeset
242 /* don't run off the end of the array */
76da41da923f added macro table
David A. Holland
parents:
diff changeset
243 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
244 else {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
245 a = (unsigned char)s[i] +
76da41da923f added macro table
David A. Holland
parents:
diff changeset
246 ((uint16_t)(unsigned char)s[i+1] << 8);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
247 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
248 x1 += a;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
249 if (x1 < a) {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
250 x1++;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
251 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
252 x2 += x1;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
253 if (x2 < x1) {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
254 x2++;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
255 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
256 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
257
76da41da923f added macro table
David A. Holland
parents:
diff changeset
258 x1 ^= 0xffff;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
259 x2 ^= 0xffff;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
260 return ((uint32_t)x2)*65535U + x1;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
261 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
262
76da41da923f added macro table
David A. Holland
parents:
diff changeset
263 static
76da41da923f added macro table
David A. Holland
parents:
diff changeset
264 void
76da41da923f added macro table
David A. Holland
parents:
diff changeset
265 macrotable_init(void)
76da41da923f added macro table
David A. Holland
parents:
diff changeset
266 {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
267 unsigned i;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
268
76da41da923f added macro table
David A. Holland
parents:
diff changeset
269 macroarrayarray_init(&macros);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
270 macroarrayarray_setsize(&macros, 4);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
271 for (i=0; i<4; i++) {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
272 macroarrayarray_set(&macros, i, NULL);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
273 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
274 total_macros = 0;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
275 hashmask = 0x3;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
276 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
277
76da41da923f added macro table
David A. Holland
parents:
diff changeset
278 DESTROYALL_ARRAY(macro, );
76da41da923f added macro table
David A. Holland
parents:
diff changeset
279
76da41da923f added macro table
David A. Holland
parents:
diff changeset
280 static
76da41da923f added macro table
David A. Holland
parents:
diff changeset
281 void
76da41da923f added macro table
David A. Holland
parents:
diff changeset
282 macrotable_cleanup(void)
76da41da923f added macro table
David A. Holland
parents:
diff changeset
283 {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
284 struct macroarray *bucket;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
285 unsigned numbuckets, i;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
286
76da41da923f added macro table
David A. Holland
parents:
diff changeset
287 numbuckets = macroarrayarray_num(&macros);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
288 for (i=0; i<numbuckets; i++) {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
289 bucket = macroarrayarray_get(&macros, i);
28
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
290 if (bucket != NULL) {
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
291 macroarray_destroyall(bucket);
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
292 macroarray_destroy(bucket);
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
293 }
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
294 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
295 macroarrayarray_setsize(&macros, 0);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
296 macroarrayarray_cleanup(&macros);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
297 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
298
76da41da923f added macro table
David A. Holland
parents:
diff changeset
299 static
76da41da923f added macro table
David A. Holland
parents:
diff changeset
300 struct macro *
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
301 macrotable_findlen(const char *name, size_t len, bool remove)
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
302 {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
303 unsigned hash;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
304 struct macroarray *bucket;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
305 struct macro *m, *m2;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
306 unsigned i, num;
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
307 size_t mlen;
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
308
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
309 hash = hashfunc(name, len);
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
310 bucket = macroarrayarray_get(&macros, hash & hashmask);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
311 if (bucket == NULL) {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
312 return NULL;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
313 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
314 num = macroarray_num(bucket);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
315 for (i=0; i<num; i++) {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
316 m = macroarray_get(bucket, i);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
317 if (hash != m->hash) {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
318 continue;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
319 }
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
320 mlen = strlen(m->name);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
321 if (len == mlen && !memcmp(name, m->name, len)) {
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
322 if (remove) {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
323 if (i < num-1) {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
324 m2 = macroarray_get(bucket, num-1);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
325 macroarray_set(bucket, i, m2);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
326 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
327 macroarray_setsize(bucket, num-1);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
328 total_macros--;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
329 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
330 return m;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
331 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
332 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
333 return NULL;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
334 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
335
76da41da923f added macro table
David A. Holland
parents:
diff changeset
336 static
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
337 struct macro *
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
338 macrotable_find(const char *name, bool remove)
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
339 {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
340 return macrotable_findlen(name, strlen(name), remove);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
341 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
342
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
343 static
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
344 void
76da41da923f added macro table
David A. Holland
parents:
diff changeset
345 macrotable_rehash(void)
76da41da923f added macro table
David A. Holland
parents:
diff changeset
346 {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
347 struct macroarray *newbucket, *oldbucket;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
348 struct macro *m;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
349 unsigned newmask, tossbit;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
350 unsigned numbuckets, i;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
351 unsigned oldnum, j, k;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
352
76da41da923f added macro table
David A. Holland
parents:
diff changeset
353 numbuckets = macroarrayarray_num(&macros);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
354 macroarrayarray_setsize(&macros, numbuckets*2);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
355
76da41da923f added macro table
David A. Holland
parents:
diff changeset
356 assert(hashmask == numbuckets - 1);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
357 newmask = (hashmask << 1) | 1U;
74
bbbf71859a21 fix stupid bugs
David A. Holland
parents: 47
diff changeset
358 tossbit = newmask & ~hashmask;
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
359 hashmask = newmask;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
360
76da41da923f added macro table
David A. Holland
parents:
diff changeset
361 for (i=0; i<numbuckets; i++) {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
362 newbucket = NULL;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
363 oldbucket = macroarrayarray_get(&macros, i);
74
bbbf71859a21 fix stupid bugs
David A. Holland
parents: 47
diff changeset
364 if (oldbucket == NULL) {
bbbf71859a21 fix stupid bugs
David A. Holland
parents: 47
diff changeset
365 macroarrayarray_set(&macros, numbuckets + i, NULL);
bbbf71859a21 fix stupid bugs
David A. Holland
parents: 47
diff changeset
366 continue;
bbbf71859a21 fix stupid bugs
David A. Holland
parents: 47
diff changeset
367 }
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
368 oldnum = macroarray_num(oldbucket);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
369 for (j=0; j<oldnum; j++) {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
370 m = macroarray_get(oldbucket, j);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
371 if (m->hash & tossbit) {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
372 if (newbucket == NULL) {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
373 newbucket = macroarray_create();
76da41da923f added macro table
David A. Holland
parents:
diff changeset
374 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
375 macroarray_set(oldbucket, j, NULL);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
376 macroarray_add(newbucket, m, NULL);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
377 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
378 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
379 for (j=k=0; j<oldnum; j++) {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
380 m = macroarray_get(oldbucket, j);
74
bbbf71859a21 fix stupid bugs
David A. Holland
parents: 47
diff changeset
381 if (m != NULL) {
bbbf71859a21 fix stupid bugs
David A. Holland
parents: 47
diff changeset
382 if (k < j) {
bbbf71859a21 fix stupid bugs
David A. Holland
parents: 47
diff changeset
383 macroarray_set(oldbucket, k, m);
bbbf71859a21 fix stupid bugs
David A. Holland
parents: 47
diff changeset
384 }
bbbf71859a21 fix stupid bugs
David A. Holland
parents: 47
diff changeset
385 k++;
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
386 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
387 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
388 macroarray_setsize(oldbucket, k);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
389 macroarrayarray_set(&macros, numbuckets + i, newbucket);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
390 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
391 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
392
76da41da923f added macro table
David A. Holland
parents:
diff changeset
393 static
76da41da923f added macro table
David A. Holland
parents:
diff changeset
394 void
76da41da923f added macro table
David A. Holland
parents:
diff changeset
395 macrotable_add(struct macro *m)
76da41da923f added macro table
David A. Holland
parents:
diff changeset
396 {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
397 unsigned hash;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
398 struct macroarray *bucket;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
399 unsigned numbuckets;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
400
76da41da923f added macro table
David A. Holland
parents:
diff changeset
401 numbuckets = macroarrayarray_num(&macros);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
402 if (total_macros > 0 && total_macros / numbuckets > 9) {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
403 macrotable_rehash();
76da41da923f added macro table
David A. Holland
parents:
diff changeset
404 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
405
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
406 hash = hashfunc(m->name, strlen(m->name));
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
407 bucket = macroarrayarray_get(&macros, hash & hashmask);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
408 if (bucket == NULL) {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
409 bucket = macroarray_create();
76da41da923f added macro table
David A. Holland
parents:
diff changeset
410 macroarrayarray_set(&macros, hash & hashmask, bucket);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
411 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
412 macroarray_add(bucket, m, NULL);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
413 total_macros++;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
414 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
415
76da41da923f added macro table
David A. Holland
parents:
diff changeset
416 ////////////////////////////////////////////////////////////
76da41da923f added macro table
David A. Holland
parents:
diff changeset
417 // external macro definition interface
76da41da923f added macro table
David A. Holland
parents:
diff changeset
418
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
419 static
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
420 struct macro *
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
421 macro_define_common_start(struct place *p1, const char *macro,
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
422 struct place *p2)
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
423 {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
424 struct macro *m;
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
425 unsigned hash;
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
426
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
427 if (!is_identifier(macro)) {
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
428 complain(p1, "Invalid macro name %s", macro);
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
429 complain_fail();
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
430 }
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
431
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
432 hash = hashfunc(macro, strlen(macro));
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
433 m = macro_create(p1, macro, hash, p2);
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
434 return m;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
435 }
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
436
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
437 static
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
438 void
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
439 macro_define_common_end(struct macro *m)
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
440 {
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
441 struct macro *oldm;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
442 bool ok;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
443
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
444 oldm = macrotable_find(m->name, false);
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
445 if (oldm != NULL) {
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
446 ok = macro_eq(m, oldm);
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
447 if (ok) {
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
448 complain(&m->defplace,
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
449 "Warning: redefinition of %s", m->name);
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
450 if (mode.werror) {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
451 complain_fail();
76da41da923f added macro table
David A. Holland
parents:
diff changeset
452 }
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
453 } else {
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
454 complain(&m->defplace,
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
455 "Redefinition of %s is not identical",
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
456 m->name);
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
457 complain_fail();
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
458 }
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
459 complain(&oldm->defplace, "Previous definition was here");
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
460 macro_destroy(m);
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
461 return;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
462 }
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
463 macrotable_add(m);
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
464 }
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
465
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
466 static
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
467 void
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
468 macro_parse_parameters(struct macro *m, struct place *p, const char *params)
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
469 {
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
470 size_t len;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
471 const char *s;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
472 char *param;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
473
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
474 while (params != NULL) {
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
475 len = strspn(params, ws);
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
476 params += len;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
477 p->column += len;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
478 s = strchr(params, ',');
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
479 if (s) {
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
480 len = s-params;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
481 param = dostrndup(params, len);
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
482 s++;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
483 } else {
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
484 len = strlen(params);
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
485 param = dostrndup(params, len);
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
486 }
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
487 notrailingws(param, strlen(param));
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
488 if (!is_identifier(param)) {
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
489 complain(p, "Invalid macro parameter name %s", param);
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
490 complain_fail();
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
491 } else {
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
492 stringarray_add(&m->params, param, NULL);
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
493 }
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
494 params = s;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
495 p->column += len;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
496 }
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
497 }
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
498
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
499 static
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
500 bool
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
501 isparam(struct macro *m, const char *name, size_t len, unsigned *num_ret)
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
502 {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
503 unsigned num, i;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
504 const char *param;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
505
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
506 num = stringarray_num(&m->params);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
507 for (i=0; i<num; i++) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
508 param = stringarray_get(&m->params, i);
27
01c3a2088ab4 fix some more bugs
David A. Holland
parents: 25
diff changeset
509 if (strlen(param) == len && !memcmp(name, param, len)) {
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
510 *num_ret = i;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
511 return true;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
512 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
513 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
514 return false;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
515 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
516
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
517 static
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
518 void
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
519 macro_parse_expansion(struct macro *m, const char *buf)
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
520 {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
521 size_t blockstart, wordstart, pos;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
522 struct expansionitem *ei;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
523 unsigned param;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
524
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
525 pos = blockstart = 0;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
526 while (buf[pos] != '\0') {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
527 pos += strspn(buf+pos, ws);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
528 if (strchr(alnum, buf[pos])) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
529 wordstart = pos;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
530 pos += strspn(buf+pos, alnum);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
531 if (isparam(m, buf+wordstart, pos-wordstart, &param)) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
532 if (pos > blockstart) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
533 ei = expansionitem_create_stringlen(
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
534 buf + blockstart,
27
01c3a2088ab4 fix some more bugs
David A. Holland
parents: 25
diff changeset
535 wordstart - blockstart);
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
536 expansionitemarray_add(&m->expansion,
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
537 ei, NULL);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
538 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
539 ei = expansionitem_create_param(param);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
540 expansionitemarray_add(&m->expansion, ei,NULL);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
541 blockstart = pos;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
542 continue;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
543 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
544 continue;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
545 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
546 pos++;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
547 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
548 if (pos > blockstart) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
549 ei = expansionitem_create_stringlen(buf + blockstart,
25
18681e5ae6e4 fix some more bugs
David A. Holland
parents: 21
diff changeset
550 pos - blockstart);
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
551 expansionitemarray_add(&m->expansion, ei, NULL);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
552 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
553 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
554
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
555 void
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
556 macro_define_plain(struct place *p1, const char *macro,
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
557 struct place *p2, const char *expansion)
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
558 {
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
559 struct macro *m;
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
560 struct expansionitem *ei;
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
561
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
562 m = macro_define_common_start(p1, macro, p2);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
563 ei = expansionitem_create_string(expansion);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
564 expansionitemarray_add(&m->expansion, ei, NULL);
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
565 macro_define_common_end(m);
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
566 }
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
567
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
568 void
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
569 macro_define_params(struct place *p1, const char *macro,
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
570 struct place *p2, const char *params,
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
571 struct place *p3, const char *expansion)
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
572 {
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
573 struct macro *m;
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
574
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
575 m = macro_define_common_start(p1, macro, p3);
25
18681e5ae6e4 fix some more bugs
David A. Holland
parents: 21
diff changeset
576 m->hasparams = true;
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
577 macro_parse_parameters(m, p2, params);
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
578 macro_parse_expansion(m, expansion);
18
c08a947d8f30 deal with macro parameters
David A. Holland
parents: 17
diff changeset
579 macro_define_common_end(m);
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
580 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
581
76da41da923f added macro table
David A. Holland
parents:
diff changeset
582 void
76da41da923f added macro table
David A. Holland
parents:
diff changeset
583 macro_undef(const char *macro)
76da41da923f added macro table
David A. Holland
parents:
diff changeset
584 {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
585 struct macro *m;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
586
76da41da923f added macro table
David A. Holland
parents:
diff changeset
587 m = macrotable_find(macro, true);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
588 if (m) {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
589 macro_destroy(m);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
590 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
591 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
592
76da41da923f added macro table
David A. Holland
parents:
diff changeset
593 bool
76da41da923f added macro table
David A. Holland
parents:
diff changeset
594 macro_isdefined(const char *macro)
76da41da923f added macro table
David A. Holland
parents:
diff changeset
595 {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
596 struct macro *m;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
597
76da41da923f added macro table
David A. Holland
parents:
diff changeset
598 m = macrotable_find(macro, false);
76da41da923f added macro table
David A. Holland
parents:
diff changeset
599 return m != NULL;
76da41da923f added macro table
David A. Holland
parents:
diff changeset
600 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
601
76da41da923f added macro table
David A. Holland
parents:
diff changeset
602 ////////////////////////////////////////////////////////////
76da41da923f added macro table
David A. Holland
parents:
diff changeset
603 // macro expansion
76da41da923f added macro table
David A. Holland
parents:
diff changeset
604
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
605 struct expstate {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
606 bool honordefined;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
607 enum { ES_NORMAL, ES_WANTLPAREN, ES_NOARG, ES_HAVEARG } state;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
608 struct macro *curmacro;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
609 struct stringarray args;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
610 unsigned argparens;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
611
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
612 bool tobuf;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
613 char *buf;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
614 size_t bufpos, bufmax;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
615 };
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
616
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
617 static struct expstate mainstate;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
618
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
619 static void doexpand(struct expstate *es, struct place *p,
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
620 char *buf, size_t len);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
621
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
622 static
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
623 void
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
624 expstate_init(struct expstate *es, bool tobuf, bool honordefined)
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
625 {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
626 es->honordefined = honordefined;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
627 es->state = ES_NORMAL;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
628 es->curmacro = NULL;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
629 stringarray_init(&es->args);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
630 es->argparens = 0;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
631 es->tobuf = tobuf;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
632 es->buf = NULL;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
633 es->bufpos = 0;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
634 es->bufmax = 0;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
635 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
636
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
637 static
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
638 void
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
639 expstate_cleanup(struct expstate *es)
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
640 {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
641 assert(es->state == ES_NORMAL);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
642 stringarray_cleanup(&es->args);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
643 if (es->buf) {
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
644 dofree(es->buf, es->bufmax);
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
645 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
646 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
647
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
648 static
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
649 void
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
650 expstate_destroyargs(struct expstate *es)
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
651 {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
652 unsigned i, num;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
653
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
654 num = stringarray_num(&es->args);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
655 for (i=0; i<num; i++) {
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
656 dostrfree(stringarray_get(&es->args, i));
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
657 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
658 stringarray_setsize(&es->args, 0);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
659 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
660
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
661 static
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
662 void
21
e3fab8f1b52c strip comments.
David A. Holland
parents: 19
diff changeset
663 expand_send(struct expstate *es, struct place *p, const char *buf, size_t len)
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
664 {
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
665 size_t oldmax;
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
666
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
667 if (es->tobuf) {
38
b156910b59b2 Wrap free() in dofree() to allow instrumenting it for debugging.
David A. Holland
parents: 33
diff changeset
668 assert(es->bufpos <= es->bufmax);
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
669 if (es->bufpos + len > es->bufmax) {
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
670 oldmax = es->bufmax;
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
671 if (es->bufmax == 0) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
672 es->bufmax = 64;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
673 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
674 while (es->bufpos + len > es->bufmax) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
675 es->bufmax *= 2;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
676 }
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
677 es->buf = dorealloc(es->buf, oldmax, es->bufmax);
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
678 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
679 memcpy(es->buf + es->bufpos, buf, len);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
680 es->bufpos += len;
38
b156910b59b2 Wrap free() in dofree() to allow instrumenting it for debugging.
David A. Holland
parents: 33
diff changeset
681 assert(es->bufpos <= es->bufmax);
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
682 } else {
21
e3fab8f1b52c strip comments.
David A. Holland
parents: 19
diff changeset
683 output(p, buf, len);
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
684 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
685 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
686
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
687 static
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
688 void
21
e3fab8f1b52c strip comments.
David A. Holland
parents: 19
diff changeset
689 expand_send_eof(struct expstate *es, struct place *p)
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
690 {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
691 if (es->tobuf) {
21
e3fab8f1b52c strip comments.
David A. Holland
parents: 19
diff changeset
692 expand_send(es, p, "", 1);
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
693 es->bufpos--;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
694 } else {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
695 output_eof();
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
696 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
697 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
698
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
699 static
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
700 void
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
701 expand_newarg(struct expstate *es, char *buf, size_t len)
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
702 {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
703 char *text;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
704
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
705 text = dostrndup(buf, len);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
706 stringarray_add(&es->args, text, NULL);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
707 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
708
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
709 static
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
710 void
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
711 expand_appendarg(struct expstate *es, char *buf, size_t len)
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
712 {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
713 unsigned num;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
714 char *text;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
715 size_t oldlen;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
716
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
717 num = stringarray_num(&es->args);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
718 assert(num > 0);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
719
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
720 text = stringarray_get(&es->args, num - 1);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
721 oldlen = strlen(text);
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
722 text = dorealloc(text, oldlen + 1, oldlen + len + 1);
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
723 memcpy(text + oldlen, buf, len);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
724 text[oldlen+len] = '\0';
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
725 stringarray_set(&es->args, num - 1, text);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
726 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
727
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
728 static
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
729 char *
28
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
730 expand_substitute(struct place *p, struct expstate *es)
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
731 {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
732 struct expansionitem *ei;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
733 unsigned i, num;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
734 size_t len;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
735 char *arg;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
736 char *ret;
28
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
737 unsigned numargs, numparams;
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
738
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
739 numargs = stringarray_num(&es->args);
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
740 numparams = stringarray_num(&es->curmacro->params);
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
741
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
742 if (numargs == 0 && numparams == 1) {
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
743 /* no arguments <=> one empty argument */
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
744 stringarray_add(&es->args, dostrdup(""), NULL);
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
745 numargs++;
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
746 }
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
747 if (numargs != numparams) {
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
748 complain(p, "Wrong number of arguments for macro %s; "
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
749 "found %u, expected %u",
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
750 es->curmacro->name, numargs, numparams);
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
751 complain_fail();
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
752 while (numargs < numparams) {
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
753 stringarray_add(&es->args, dostrdup(""), NULL);
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
754 numargs++;
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
755 }
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
756 }
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
757
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
758 len = 0;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
759 num = expansionitemarray_num(&es->curmacro->expansion);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
760 for (i=0; i<num; i++) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
761 ei = expansionitemarray_get(&es->curmacro->expansion, i);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
762 if (ei->isstring) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
763 len += strlen(ei->string);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
764 } else {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
765 arg = stringarray_get(&es->args, ei->param);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
766 len += strlen(arg);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
767 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
768 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
769
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
770 ret = domalloc(len+1);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
771 *ret = '\0';
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
772 for (i=0; i<num; i++) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
773 ei = expansionitemarray_get(&es->curmacro->expansion, i);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
774 if (ei->isstring) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
775 strcat(ret, ei->string);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
776 } else {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
777 arg = stringarray_get(&es->args, ei->param);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
778 strcat(ret, arg);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
779 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
780 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
781
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
782 return ret;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
783 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
784
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
785 static
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
786 void
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
787 expand_domacro(struct expstate *es, struct place *p)
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
788 {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
789 struct macro *m;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
790 char *newbuf, *newbuf2;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
791
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
792 if (es->curmacro == NULL) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
793 /* defined() */
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
794 if (stringarray_num(&es->args) != 1) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
795 complain(p, "Too many arguments for defined()");
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
796 complain_fail();
21
e3fab8f1b52c strip comments.
David A. Holland
parents: 19
diff changeset
797 expand_send(es, p, "0", 1);
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
798 return;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
799 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
800 m = macrotable_find(stringarray_get(&es->args, 0), false);
21
e3fab8f1b52c strip comments.
David A. Holland
parents: 19
diff changeset
801 expand_send(es, p, (m != NULL) ? "1" : "0", 1);
25
18681e5ae6e4 fix some more bugs
David A. Holland
parents: 21
diff changeset
802 expstate_destroyargs(es);
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
803 return;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
804 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
805
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
806 assert(es->curmacro->inuse == false);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
807 es->curmacro->inuse = true;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
808
28
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
809 newbuf = expand_substitute(p, es);
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
810 newbuf2 = macroexpand(p, newbuf, strlen(newbuf), false);
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
811 dostrfree(newbuf);
25
18681e5ae6e4 fix some more bugs
David A. Holland
parents: 21
diff changeset
812 expstate_destroyargs(es);
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
813 doexpand(es, p, newbuf2, strlen(newbuf2));
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
814 dostrfree(newbuf2);
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
815
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
816 es->curmacro->inuse = false;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
817 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
818
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
819 static
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
820 void
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
821 expand_got_ws(struct expstate *es, struct place *p, char *buf, size_t len)
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
822 {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
823 switch (es->state) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
824 case ES_NORMAL:
21
e3fab8f1b52c strip comments.
David A. Holland
parents: 19
diff changeset
825 expand_send(es, p, buf, len);
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
826 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
827 case ES_WANTLPAREN:
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
828 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
829 case ES_NOARG:
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
830 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
831 case ES_HAVEARG:
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
832 expand_appendarg(es, buf, len);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
833 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
834 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
835 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
836
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
837 static
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
838 void
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
839 expand_got_word(struct expstate *es, struct place *p, char *buf, size_t len)
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
840 {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
841 struct macro *m;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
842 struct expansionitem *ei;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
843 char *newbuf;
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
844
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
845 switch (es->state) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
846 case ES_NORMAL:
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
847 if (es->honordefined &&
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
848 len == 7 && !memcmp(buf, "defined", 7)) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
849 es->curmacro = NULL;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
850 es->state = ES_WANTLPAREN;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
851 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
852 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
853 m = macrotable_findlen(buf, len, false);
42
ad7763329eba Don't crash if a macro tries to expand itself recursively.
David A. Holland
parents: 40
diff changeset
854 if (m == NULL || m->inuse) {
21
e3fab8f1b52c strip comments.
David A. Holland
parents: 19
diff changeset
855 expand_send(es, p, buf, len);
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
856 } else if (!m->hasparams) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
857 m->inuse = true;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
858 assert(expansionitemarray_num(&m->expansion) == 1);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
859 ei = expansionitemarray_get(&m->expansion, 0);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
860 assert(ei->isstring);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
861 newbuf = macroexpand(p, ei->string,
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
862 strlen(ei->string), false);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
863 doexpand(es, p, newbuf, strlen(newbuf));
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
864 dostrfree(newbuf);
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
865 m->inuse = false;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
866 } else {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
867 es->curmacro = m;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
868 es->state = ES_WANTLPAREN;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
869 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
870 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
871 case ES_WANTLPAREN:
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
872 if (es->curmacro != NULL) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
873 complain(p, "Expected arguments for macro %s",
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
874 es->curmacro->name);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
875 complain_fail();
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
876 } else {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
877 /* "defined foo" means "defined(foo)" */
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
878 expand_newarg(es, buf, len);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
879 es->state = ES_NORMAL;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
880 expand_domacro(es, p);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
881 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
882 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
883 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
884 case ES_NOARG:
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
885 expand_newarg(es, buf, len);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
886 es->state = ES_HAVEARG;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
887 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
888 case ES_HAVEARG:
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
889 expand_appendarg(es, buf, len);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
890 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
891 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
892 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
893
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
894 static
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
895 void
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
896 expand_got_lparen(struct expstate *es, struct place *p, char *buf, size_t len)
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
897 {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
898 switch (es->state) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
899 case ES_NORMAL:
21
e3fab8f1b52c strip comments.
David A. Holland
parents: 19
diff changeset
900 expand_send(es, p, buf, len);
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
901 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
902 case ES_WANTLPAREN:
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
903 es->state = ES_NOARG;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
904 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
905 case ES_NOARG:
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
906 expand_newarg(es, buf, len);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
907 es->state = ES_HAVEARG;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
908 es->argparens++;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
909 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
910 case ES_HAVEARG:
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
911 expand_appendarg(es, buf, len);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
912 es->argparens++;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
913 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
914 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
915 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
916
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
917 static
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
918 void
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
919 expand_got_rparen(struct expstate *es, struct place *p, char *buf, size_t len)
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
920 {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
921 switch (es->state) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
922 case ES_NORMAL:
21
e3fab8f1b52c strip comments.
David A. Holland
parents: 19
diff changeset
923 expand_send(es, p, buf, len);
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
924 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
925 case ES_WANTLPAREN:
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
926 if (es->curmacro) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
927 complain(p, "Expected arguments for macro %s",
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
928 es->curmacro->name);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
929 } else {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
930 complain(p, "Expected arguments for defined()");
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
931 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
932 complain_fail();
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
933 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
934 case ES_NOARG:
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
935 assert(es->argparens == 0);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
936 es->state = ES_NORMAL;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
937 expand_domacro(es, p);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
938 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
939 case ES_HAVEARG:
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
940 if (es->argparens > 0) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
941 es->argparens--;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
942 expand_appendarg(es, buf, len);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
943 } else {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
944 es->state = ES_NORMAL;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
945 expand_domacro(es, p);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
946 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
947 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
948 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
949 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
950
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
951 static
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
952 void
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
953 expand_got_comma(struct expstate *es, struct place *p, char *buf, size_t len)
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
954 {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
955 switch (es->state) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
956 case ES_NORMAL:
21
e3fab8f1b52c strip comments.
David A. Holland
parents: 19
diff changeset
957 expand_send(es, p, buf, len);
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
958 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
959 case ES_WANTLPAREN:
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
960 if (es->curmacro) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
961 complain(p, "Expected arguments for macro %s",
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
962 es->curmacro->name);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
963 } else {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
964 complain(p, "Expected arguments for defined()");
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
965 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
966 complain_fail();
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
967 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
968 case ES_NOARG:
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
969 assert(es->argparens == 0);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
970 expand_newarg(es, buf, 0);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
971 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
972 case ES_HAVEARG:
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
973 if (es->argparens > 0) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
974 expand_appendarg(es, buf, len);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
975 } else {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
976 es->state = ES_NOARG;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
977 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
978 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
979 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
980 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
981
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
982 static
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
983 void
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
984 expand_got_other(struct expstate *es, struct place *p, char *buf, size_t len)
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
985 {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
986 switch (es->state) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
987 case ES_NORMAL:
21
e3fab8f1b52c strip comments.
David A. Holland
parents: 19
diff changeset
988 expand_send(es, p, buf, len);
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
989 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
990 case ES_WANTLPAREN:
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
991 if (es->curmacro) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
992 complain(p, "Expected arguments for macro %s",
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
993 es->curmacro->name);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
994 } else {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
995 complain(p, "Expected arguments for defined()");
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
996 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
997 complain_fail();
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
998 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
999 case ES_NOARG:
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1000 expand_newarg(es, buf, len);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1001 es->state = ES_HAVEARG;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1002 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1003 case ES_HAVEARG:
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1004 expand_appendarg(es, buf, len);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1005 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1006 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1007 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1008
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1009 static
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1010 void
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1011 expand_got_eof(struct expstate *es, struct place *p)
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1012 {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1013 switch (es->state) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1014 case ES_NORMAL:
21
e3fab8f1b52c strip comments.
David A. Holland
parents: 19
diff changeset
1015 expand_send_eof(es, p);
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1016 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1017 case ES_WANTLPAREN:
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1018 if (es->curmacro) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1019 complain(p, "Expected arguments for macro %s",
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1020 es->curmacro->name);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1021 } else {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1022 complain(p, "Expected arguments for defined()");
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1023 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1024 complain_fail();
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1025 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1026 case ES_NOARG:
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1027 case ES_HAVEARG:
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1028 if (es->curmacro) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1029 complain(p, "Unclosed argument list for macro %s",
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1030 es->curmacro->name);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1031 } else {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1032 complain(p, "Unclosed argument list for defined()");
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1033 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1034 complain_fail();
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1035 expstate_destroyargs(es);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1036 break;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1037 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1038 es->state = ES_NORMAL;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1039 es->curmacro = NULL;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1040 es->argparens = 0;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1041 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1042
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1043 static
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1044 void
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1045 doexpand(struct expstate *es, struct place *p, char *buf, size_t len)
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1046 {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1047 size_t x;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1048
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1049 while (len > 0) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1050 x = strspn(buf, ws);
28
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
1051 if (x > len) {
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
1052 /* XXX gross, need strnspn */
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
1053 x = len;
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
1054 }
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
1055
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1056 if (x > 0) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1057 expand_got_ws(es, p, buf, x);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1058 buf += x;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1059 len -= x;
28
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
1060 continue;
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1061 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1062
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1063 x = strspn(buf, alnum);
28
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
1064 if (x > len) {
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
1065 /* XXX gross, need strnspn */
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
1066 x = len;
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
1067 }
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 27
diff changeset
1068
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1069 if (x > 0) {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1070 expand_got_word(es, p, buf, x);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1071 buf += x;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1072 len -= x;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1073 continue;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1074 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1075
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1076 if (buf[0] == '(') {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1077 expand_got_lparen(es, p, buf, 1);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1078 buf++;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1079 len--;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1080 continue;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1081 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1082
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1083 if (buf[0] == ')') {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1084 expand_got_rparen(es, p, buf, 1);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1085 buf++;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1086 len--;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1087 continue;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1088 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1089
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1090 if (buf[0] == ',') {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1091 expand_got_comma(es, p, buf, 1);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1092 buf++;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1093 len--;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1094 continue;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1095 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1096
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1097 expand_got_other(es, p, buf, 1);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1098 buf++;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1099 len--;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1100 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1101 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1102
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1103 char *
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1104 macroexpand(struct place *p, char *buf, size_t len, bool honordefined)
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1105 {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1106 struct expstate es;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1107 char *ret;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1108
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1109 expstate_init(&es, true, honordefined);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1110 doexpand(&es, p, buf, len);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1111 expand_got_eof(&es, p);
40
291fefe664f2 Oops, fix previous.
David A. Holland
parents: 39
diff changeset
1112
291fefe664f2 Oops, fix previous.
David A. Holland
parents: 39
diff changeset
1113 /* trim to fit, so the malloc debugging won't complain */
291fefe664f2 Oops, fix previous.
David A. Holland
parents: 39
diff changeset
1114 es.buf = dorealloc(es.buf, es.bufmax, strlen(es.buf) + 1);
291fefe664f2 Oops, fix previous.
David A. Holland
parents: 39
diff changeset
1115
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1116 ret = es.buf;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1117 es.buf = NULL;
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
1118 es.bufpos = es.bufmax = 0;
40
291fefe664f2 Oops, fix previous.
David A. Holland
parents: 39
diff changeset
1119
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1120 expstate_cleanup(&es);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1121
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1122 return ret;
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1123 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1124
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1125 void
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1126 macro_sendline(struct place *p, char *buf, size_t len)
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1127 {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1128 doexpand(&mainstate, p, buf, len);
21
e3fab8f1b52c strip comments.
David A. Holland
parents: 19
diff changeset
1129 output(p, "\n", 1);
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1130 }
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1131
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1132 void
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1133 macro_sendeof(struct place *p)
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1134 {
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1135 expand_got_eof(&mainstate, p);
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1136 }
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
1137
76da41da923f added macro table
David A. Holland
parents:
diff changeset
1138 ////////////////////////////////////////////////////////////
76da41da923f added macro table
David A. Holland
parents:
diff changeset
1139 // module initialization
76da41da923f added macro table
David A. Holland
parents:
diff changeset
1140
76da41da923f added macro table
David A. Holland
parents:
diff changeset
1141 void
76da41da923f added macro table
David A. Holland
parents:
diff changeset
1142 macros_init(void)
76da41da923f added macro table
David A. Holland
parents:
diff changeset
1143 {
76da41da923f added macro table
David A. Holland
parents:
diff changeset
1144 macrotable_init();
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1145 expstate_init(&mainstate, false, false);
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
1146 }
76da41da923f added macro table
David A. Holland
parents:
diff changeset
1147
76da41da923f added macro table
David A. Holland
parents:
diff changeset
1148 void
76da41da923f added macro table
David A. Holland
parents:
diff changeset
1149 macros_cleanup(void)
76da41da923f added macro table
David A. Holland
parents:
diff changeset
1150 {
19
f9792a9ec704 macro expansion.
David A. Holland
parents: 18
diff changeset
1151 expstate_cleanup(&mainstate);
17
76da41da923f added macro table
David A. Holland
parents:
diff changeset
1152 macrotable_cleanup();
76da41da923f added macro table
David A. Holland
parents:
diff changeset
1153 }