Mercurial > ~dholland > hg > tradcpp > index.cgi
annotate place.c @ 64:f50b4ea6cbfe
Prune single-line comments from (most) directive lines.
Also, don't pass the string length to the directive processing
functions, as half of them weren't honoring it. Instead, ensure that
the directive line is terminated at the place the directive processing
functions should stop looking at it.
author | David A. Holland |
---|---|
date | Sun, 31 Mar 2013 02:04:56 -0400 |
parents | 2e25e55dba6b |
children | 1c0575f7dd46 |
rev | line source |
---|---|
30 | 1 /*- |
2 * Copyright (c) 2010 The NetBSD Foundation, Inc. | |
3 * All rights reserved. | |
4 * | |
5 * This code is derived from software contributed to The NetBSD Foundation | |
6 * by David A. Holland. | |
7 * | |
8 * Redistribution and use in source and binary forms, with or without | |
9 * modification, are permitted provided that the following conditions | |
10 * are met: | |
11 * 1. Redistributions of source code must retain the above copyright | |
12 * notice, this list of conditions and the following disclaimer. | |
13 * 2. Redistributions in binary form must reproduce the above copyright | |
14 * notice, this list of conditions and the following disclaimer in the | |
15 * documentation and/or other materials provided with the distribution. | |
16 * | |
17 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS | |
18 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | |
19 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |
20 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS | |
21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
25 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
27 * POSSIBILITY OF SUCH DAMAGE. | |
28 */ | |
29 | |
8 | 30 #include <assert.h> |
31 #include <stdarg.h> | |
32 #include <stdio.h> | |
33 #include <stdlib.h> | |
34 | |
35 #include "utils.h" | |
10 | 36 #include "array.h" |
8 | 37 #include "place.h" |
38 | |
13 | 39 struct placefile { |
10 | 40 struct place includedfrom; |
41 char *name; | |
28 | 42 int depth; |
10 | 43 bool fromsystemdir; |
44 }; | |
47
2e25e55dba6b
Fix inline usage as per the version in dholland-make2.
David A. Holland
parents:
39
diff
changeset
|
45 DECLARRAY(placefile, static __unused); |
2e25e55dba6b
Fix inline usage as per the version in dholland-make2.
David A. Holland
parents:
39
diff
changeset
|
46 DEFARRAY(placefile, static); |
10 | 47 |
13 | 48 static struct placefilearray placefiles; |
10 | 49 static bool overall_failure; |
50 | |
51 //////////////////////////////////////////////////////////// | |
52 // seenfiles | |
53 | |
54 static | |
13 | 55 struct placefile * |
56 placefile_create(const struct place *from, const char *name, | |
57 bool fromsystemdir) | |
10 | 58 { |
13 | 59 struct placefile *pf; |
10 | 60 |
13 | 61 pf = domalloc(sizeof(*pf)); |
62 pf->includedfrom = *from; | |
63 pf->name = dostrdup(name); | |
64 pf->fromsystemdir = fromsystemdir; | |
28 | 65 if (from->file != NULL) { |
66 pf->depth = from->file->depth + 1; | |
67 } else { | |
68 pf->depth = 1; | |
69 } | |
13 | 70 return pf; |
10 | 71 } |
72 | |
73 static | |
74 void | |
13 | 75 placefile_destroy(struct placefile *pf) |
10 | 76 { |
39
337110e7240a
Pass the size to free; it makes debug checking easier.
David A. Holland
parents:
38
diff
changeset
|
77 dostrfree(pf->name); |
337110e7240a
Pass the size to free; it makes debug checking easier.
David A. Holland
parents:
38
diff
changeset
|
78 dofree(pf, sizeof(*pf)); |
10 | 79 } |
80 | |
13 | 81 DESTROYALL_ARRAY(placefile, ); |
10 | 82 |
13 | 83 const struct placefile * |
84 place_addfile(const struct place *place, const char *file, bool issystem) | |
10 | 85 { |
13 | 86 struct placefile *pf; |
10 | 87 |
13 | 88 pf = placefile_create(place, file, issystem); |
89 placefilearray_add(&placefiles, pf, NULL); | |
28 | 90 if (pf->depth > 128) { |
91 complain(place, "Maximum include nesting depth exceeded"); | |
92 die(); | |
93 } | |
13 | 94 return pf; |
10 | 95 } |
96 | |
97 //////////////////////////////////////////////////////////// | |
98 // places | |
99 | |
8 | 100 void |
101 place_setnowhere(struct place *p) | |
102 { | |
12 | 103 p->type = P_NOWHERE; |
8 | 104 p->file = NULL; |
12 | 105 p->line = 0; |
8 | 106 p->column = 0; |
107 } | |
108 | |
109 void | |
110 place_setbuiltin(struct place *p, unsigned num) | |
111 { | |
12 | 112 p->type = P_BUILTIN; |
8 | 113 p->file = NULL; |
12 | 114 p->line = num; |
115 p->column = 1; | |
8 | 116 } |
117 | |
118 void | |
14 | 119 place_setcommandline(struct place *p, unsigned line, unsigned column) |
8 | 120 { |
14 | 121 p->type = P_COMMANDLINE; |
8 | 122 p->file = NULL; |
14 | 123 p->line = line; |
8 | 124 p->column = column; |
125 } | |
126 | |
14 | 127 void |
128 place_setfilestart(struct place *p, const struct placefile *pf) | |
129 { | |
28 | 130 p->type = P_FILE; |
14 | 131 p->file = pf; |
132 p->line = 1; | |
133 p->column = 1; | |
134 } | |
135 | |
8 | 136 static |
12 | 137 const char * |
138 place_getname(const struct place *p) | |
8 | 139 { |
12 | 140 switch (p->type) { |
141 case P_NOWHERE: return "<nowhere>"; | |
142 case P_BUILTIN: return "<built-in>"; | |
143 case P_COMMANDLINE: return "<command-line>"; | |
144 case P_FILE: return p->file->name; | |
8 | 145 } |
12 | 146 assert(0); |
147 return NULL; | |
8 | 148 } |
149 | |
150 static | |
151 void | |
152 place_printfrom(const struct place *p) | |
153 { | |
154 const struct place *from; | |
155 | |
10 | 156 from = &p->file->includedfrom; |
12 | 157 if (from->type != P_NOWHERE) { |
8 | 158 place_printfrom(from); |
12 | 159 fprintf(stderr, "In file included from %s:%u:%u:\n", |
160 place_getname(from), from->line, from->column); | |
8 | 161 } |
162 } | |
163 | |
10 | 164 //////////////////////////////////////////////////////////// |
165 // complaints | |
166 | |
8 | 167 void |
168 complain(const struct place *p, const char *fmt, ...) | |
169 { | |
170 va_list ap; | |
171 | |
12 | 172 place_printfrom(p); |
173 fprintf(stderr, "%s:%u:%u: ", place_getname(p), p->line, p->column); | |
8 | 174 va_start(ap, fmt); |
175 vfprintf(stderr, fmt, ap); | |
176 va_end(ap); | |
177 fprintf(stderr, "\n"); | |
178 } | |
179 | |
180 void | |
181 complain_fail(void) | |
182 { | |
183 overall_failure = true; | |
184 } | |
185 | |
186 bool | |
187 complain_failed(void) | |
188 { | |
189 return overall_failure; | |
190 } | |
191 | |
10 | 192 //////////////////////////////////////////////////////////// |
193 // module init and cleanup | |
194 | |
195 void | |
196 place_init(void) | |
197 { | |
13 | 198 placefilearray_init(&placefiles); |
10 | 199 } |
200 | |
201 void | |
202 place_cleanup(void) | |
203 { | |
13 | 204 placefilearray_destroyall(&placefiles); |
205 placefilearray_cleanup(&placefiles); | |
10 | 206 } |