annotate files.c @ 122:64c4de3709de

Complain if -[DIU] is given an empty argument. (Like many compilers over the years, we don't accept the argument appearing in the next argv word.) Warn about this in the man page too.
author David A. Holland
date Tue, 11 Jun 2013 18:32:41 -0400
parents 1e7144176a42
children 1cda505ddc78
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
30
76c114899f63 copyrights
David A. Holland
parents: 28
diff changeset
1 /*-
99
60184aa42604 add 2013 to copyrights where it seems warranted
David A. Holland
parents: 81
diff changeset
2 * Copyright (c) 2010, 2013 The NetBSD Foundation, Inc.
30
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
6
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
30 #include <stdbool.h>
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
31 #include <stdio.h>
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
32 #include <stdlib.h>
13
120629a5d6bf seenfile -> placefile (clearer)
David A. Holland
parents: 10
diff changeset
33 #include <string.h>
6
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
34 #include <unistd.h>
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
35 #include <fcntl.h>
113
1e7144176a42 Print a warning if we get an unexpected error trying to open a file.
David A. Holland
parents: 112
diff changeset
36 #include <errno.h>
6
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
37 #include <err.h>
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
38
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
39 #include "array.h"
15
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
40 #include "mode.h"
8
97243badae69 split place stuff to its own file
David A. Holland
parents: 7
diff changeset
41 #include "place.h"
6
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
42 #include "files.h"
15
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
43 #include "directive.h"
6
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
44
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
45 struct incdir {
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
46 const char *name;
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
47 bool issystem;
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
48 };
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
49
107
33954a07d013 __unused -> UNUSED
David A. Holland
parents: 104
diff changeset
50 DECLARRAY(incdir, static UNUSED);
47
2e25e55dba6b Fix inline usage as per the version in dholland-make2.
David A. Holland
parents: 39
diff changeset
51 DEFARRAY(incdir, static);
6
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
52
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
53 static struct incdirarray quotepath, bracketpath;
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
54
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
55 ////////////////////////////////////////////////////////////
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
56 // management
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
57
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
58 static
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
59 struct incdir *
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
60 incdir_create(const char *name, bool issystem)
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
61 {
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
62 struct incdir *id;
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
63
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
64 id = domalloc(sizeof(*id));
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
65 id->name = name;
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
66 id->issystem = issystem;
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
67 return id;
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
68 }
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
69
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
70 static
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
71 void
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
72 incdir_destroy(struct incdir *id)
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
73 {
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
74 dofree(id, sizeof(*id));
6
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
75 }
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
76
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
77 void
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
78 files_init(void)
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
79 {
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
80 incdirarray_init(&quotepath);
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
81 incdirarray_init(&bracketpath);
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
82 }
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
83
9
1fbcbd58742e move destroyall to array.h
David A. Holland
parents: 8
diff changeset
84 DESTROYALL_ARRAY(incdir, );
6
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
85
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
86 void
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
87 files_cleanup(void)
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
88 {
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
89 incdirarray_destroyall(&quotepath);
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
90 incdirarray_cleanup(&quotepath);
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
91 incdirarray_destroyall(&bracketpath);
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
92 incdirarray_cleanup(&bracketpath);
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
93 }
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
94
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
95 ////////////////////////////////////////////////////////////
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
96 // path setup
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
97
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
98 void
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
99 files_addquotepath(const char *dir, bool issystem)
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
100 {
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
101 struct incdir *id;
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
102
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
103 id = incdir_create(dir, issystem);
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
104 incdirarray_add(&quotepath, id, NULL);
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
105 }
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
106
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
107 void
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
108 files_addbracketpath(const char *dir, bool issystem)
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
109 {
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
110 struct incdir *id;
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
111
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
112 id = incdir_create(dir, issystem);
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
113 incdirarray_add(&bracketpath, id, NULL);
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
114 }
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
115
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
116 ////////////////////////////////////////////////////////////
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
117 // parsing
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
118
75
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
119 /*
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
120 * Find the end of the logical line. End of line characters that are
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
121 * commented out do not count.
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
122 */
15
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
123 static
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
124 size_t
75
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
125 findeol(const char *buf, size_t start, size_t limit)
15
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
126 {
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
127 size_t i;
75
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
128 int incomment = 0;
81
27c9aafcaca1 Don't recognize comments within double-quote strings.
David A. Holland
parents: 75
diff changeset
129 bool inquote = false;
75
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
130
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
131 for (i=start; i<limit; i++) {
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
132 if (incomment) {
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
133 if (i+1 < limit && buf[i] == '*' && buf[i+1] == '/') {
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
134 i++;
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
135 incomment = 0;
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
136 }
81
27c9aafcaca1 Don't recognize comments within double-quote strings.
David A. Holland
parents: 75
diff changeset
137 } else if (!inquote && i+1 < limit &&
27c9aafcaca1 Don't recognize comments within double-quote strings.
David A. Holland
parents: 75
diff changeset
138 buf[i] == '/' && buf[i+1] == '*') {
27c9aafcaca1 Don't recognize comments within double-quote strings.
David A. Holland
parents: 75
diff changeset
139 i++;
27c9aafcaca1 Don't recognize comments within double-quote strings.
David A. Holland
parents: 75
diff changeset
140 incomment = 1;
27c9aafcaca1 Don't recognize comments within double-quote strings.
David A. Holland
parents: 75
diff changeset
141 } else if (i+1 < limit &&
27c9aafcaca1 Don't recognize comments within double-quote strings.
David A. Holland
parents: 75
diff changeset
142 buf[i] == '\\' && buf[i+1] == '"') {
27c9aafcaca1 Don't recognize comments within double-quote strings.
David A. Holland
parents: 75
diff changeset
143 i++;
27c9aafcaca1 Don't recognize comments within double-quote strings.
David A. Holland
parents: 75
diff changeset
144 } else if (buf[i] == '"') {
27c9aafcaca1 Don't recognize comments within double-quote strings.
David A. Holland
parents: 75
diff changeset
145 inquote = !inquote;
27c9aafcaca1 Don't recognize comments within double-quote strings.
David A. Holland
parents: 75
diff changeset
146 } else if (buf[i] == '\n') {
27c9aafcaca1 Don't recognize comments within double-quote strings.
David A. Holland
parents: 75
diff changeset
147 return i;
75
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
148 }
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
149 }
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
150 return limit;
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
151 }
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
152
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
153 static
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
154 unsigned
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
155 countnls(const char *buf, size_t start, size_t limit)
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
156 {
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
157 size_t i;
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
158 unsigned count = 0;
15
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
159
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
160 for (i=start; i<limit; i++) {
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
161 if (buf[i] == '\n') {
75
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
162 count++;
15
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
163 }
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
164 }
75
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
165 return count;
15
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
166 }
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
167
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
168 static
6
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
169 void
28
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 24
diff changeset
170 file_read(const struct placefile *pf, int fd, const char *name, bool toplevel)
15
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
171 {
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
172 struct place linestartplace, nextlinestartplace, ptmp;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
173 size_t bufend, bufmax, linestart, lineend, nextlinestart, tmp;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
174 ssize_t result;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
175 bool ateof = false;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
176 char *buf;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
177
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
178 place_setfilestart(&linestartplace, pf);
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
179 nextlinestartplace = linestartplace;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
180
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
181 bufmax = 128;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
182 bufend = 0;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
183 linestart = 0;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
184 lineend = 0;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
185 buf = domalloc(bufmax);
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
186
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
187 while (1) {
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
188 if (lineend >= bufend) {
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
189 /* do not have a whole line in the buffer; read more */
75
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
190 assert(bufend >= linestart);
15
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
191 if (linestart > 0 && bufend > linestart) {
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
192 /* slide to beginning of buffer */
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
193 memmove(buf, buf+linestart, bufend-linestart);
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
194 bufend -= linestart;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
195 lineend -= linestart;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
196 linestart = 0;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
197 }
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
198 if (bufend >= bufmax) {
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
199 /* need bigger buffer */
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
200 buf = dorealloc(buf, bufmax, bufmax*2);
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
201 bufmax = bufmax*2;
15
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
202 }
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
203
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
204 if (ateof) {
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
205 /* don't read again, in case it's a socket */
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
206 result = 0;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
207 } else {
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
208 result = read(fd, buf+bufend, bufmax - bufend);
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
209 }
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
210
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
211 if (result == -1) {
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
212 /* read error */
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
213 warn("%s", name);
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
214 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
215 } else if (result == 0 && bufend == linestart) {
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
216 /* eof */
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
217 ateof = true;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
218 break;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
219 } else if (result == 0) {
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
220 /* eof in middle of line */
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
221 ateof = true;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
222 ptmp = linestartplace;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
223 ptmp.column += bufend - linestart;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
224 complain(&ptmp, "No newline at end of file");
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
225 if (mode.werror) {
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
226 complain_fail();
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
227 }
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
228 assert(bufend < bufmax);
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
229 lineend = bufend++;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
230 buf[lineend] = '\n';
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
231 } else {
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
232 bufend += (size_t)result;
81
27c9aafcaca1 Don't recognize comments within double-quote strings.
David A. Holland
parents: 75
diff changeset
233 lineend = findeol(buf, linestart, bufend);
15
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
234 }
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
235 /* loop in case we still don't have a whole line */
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
236 continue;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
237 }
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
238
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
239 /* have a line */
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
240 assert(buf[lineend] == '\n');
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
241 buf[lineend] = '\0';
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
242 nextlinestart = lineend+1;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
243 nextlinestartplace.line++;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
244
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
245 /* check for CR/NL */
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
246 if (lineend > 0 && buf[lineend-1] == '\r') {
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
247 buf[lineend-1] = '\0';
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
248 lineend--;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
249 }
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
250
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
251 /* check for continuation line */
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
252 if (lineend > 0 && buf[lineend-1]=='\\') {
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
253 lineend--;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
254 tmp = nextlinestart - lineend;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
255 if (bufend > nextlinestart) {
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
256 memmove(buf+lineend, buf+nextlinestart,
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
257 bufend - nextlinestart);
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
258 }
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
259 bufend -= tmp;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
260 nextlinestart -= tmp;
81
27c9aafcaca1 Don't recognize comments within double-quote strings.
David A. Holland
parents: 75
diff changeset
261 lineend = findeol(buf, linestart, bufend);
15
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
262 /* might not have a whole line, so loop */
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
263 continue;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
264 }
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
265
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
266 /* line now goes from linestart to lineend */
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
267 assert(buf[lineend] == '\0');
75
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
268
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
269 /* count how many commented-out newlines we swallowed */
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
270 nextlinestartplace.line += countnls(buf, linestart, lineend);
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
271
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
272 /* if the line isn't empty, process it */
15
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
273 if (lineend > linestart) {
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
274 directive_gotline(&linestartplace,
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
275 buf+linestart, lineend-linestart);
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
276 }
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
277
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
278 linestart = nextlinestart;
75
980ed7cb620a More multiline comment fixes.
David A. Holland
parents: 47
diff changeset
279 lineend = findeol(buf, linestart, bufend);
15
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
280 linestartplace = nextlinestartplace;
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
281 }
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
282
28
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 24
diff changeset
283 if (toplevel) {
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 24
diff changeset
284 directive_goteof(&linestartplace);
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 24
diff changeset
285 }
39
337110e7240a Pass the size to free; it makes debug checking easier.
David A. Holland
parents: 38
diff changeset
286 dofree(buf, bufmax);
15
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
287 }
6
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
288
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
289 ////////////////////////////////////////////////////////////
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
290 // path search
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
291
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
292 static
13
120629a5d6bf seenfile -> placefile (clearer)
David A. Holland
parents: 10
diff changeset
293 char *
112
2b0b61fd1a36 Fix handling of relative includes.
David A. Holland
parents: 107
diff changeset
294 mkfilename(struct place *place, const char *dir, const char *file)
13
120629a5d6bf seenfile -> placefile (clearer)
David A. Holland
parents: 10
diff changeset
295 {
120629a5d6bf seenfile -> placefile (clearer)
David A. Holland
parents: 10
diff changeset
296 size_t dlen, flen, rlen;
120629a5d6bf seenfile -> placefile (clearer)
David A. Holland
parents: 10
diff changeset
297 char *ret;
120629a5d6bf seenfile -> placefile (clearer)
David A. Holland
parents: 10
diff changeset
298 bool needslash = false;
120629a5d6bf seenfile -> placefile (clearer)
David A. Holland
parents: 10
diff changeset
299
112
2b0b61fd1a36 Fix handling of relative includes.
David A. Holland
parents: 107
diff changeset
300 if (dir == NULL) {
2b0b61fd1a36 Fix handling of relative includes.
David A. Holland
parents: 107
diff changeset
301 dir = place_getparsedir(place);
2b0b61fd1a36 Fix handling of relative includes.
David A. Holland
parents: 107
diff changeset
302 }
2b0b61fd1a36 Fix handling of relative includes.
David A. Holland
parents: 107
diff changeset
303
13
120629a5d6bf seenfile -> placefile (clearer)
David A. Holland
parents: 10
diff changeset
304 dlen = strlen(dir);
120629a5d6bf seenfile -> placefile (clearer)
David A. Holland
parents: 10
diff changeset
305 flen = strlen(file);
120629a5d6bf seenfile -> placefile (clearer)
David A. Holland
parents: 10
diff changeset
306 if (dlen > 0 && dir[dlen-1] != '/') {
120629a5d6bf seenfile -> placefile (clearer)
David A. Holland
parents: 10
diff changeset
307 needslash = true;
120629a5d6bf seenfile -> placefile (clearer)
David A. Holland
parents: 10
diff changeset
308 }
120629a5d6bf seenfile -> placefile (clearer)
David A. Holland
parents: 10
diff changeset
309
120629a5d6bf seenfile -> placefile (clearer)
David A. Holland
parents: 10
diff changeset
310 rlen = dlen + (needslash ? 1 : 0) + flen;
120629a5d6bf seenfile -> placefile (clearer)
David A. Holland
parents: 10
diff changeset
311 ret = domalloc(rlen + 1);
120629a5d6bf seenfile -> placefile (clearer)
David A. Holland
parents: 10
diff changeset
312 strcpy(ret, dir);
120629a5d6bf seenfile -> placefile (clearer)
David A. Holland
parents: 10
diff changeset
313 if (needslash) {
120629a5d6bf seenfile -> placefile (clearer)
David A. Holland
parents: 10
diff changeset
314 strcat(ret, "/");
120629a5d6bf seenfile -> placefile (clearer)
David A. Holland
parents: 10
diff changeset
315 }
120629a5d6bf seenfile -> placefile (clearer)
David A. Holland
parents: 10
diff changeset
316 strcat(ret, file);
120629a5d6bf seenfile -> placefile (clearer)
David A. Holland
parents: 10
diff changeset
317 return ret;
120629a5d6bf seenfile -> placefile (clearer)
David A. Holland
parents: 10
diff changeset
318 }
120629a5d6bf seenfile -> placefile (clearer)
David A. Holland
parents: 10
diff changeset
319
120629a5d6bf seenfile -> placefile (clearer)
David A. Holland
parents: 10
diff changeset
320 static
6
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
321 int
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
322 file_tryopen(const char *file)
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
323 {
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
324 int fd;
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
325
15
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
326 /* XXX check for non-regular files */
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
327
6
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
328 fd = open(file, O_RDONLY);
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
329 if (fd < 0) {
113
1e7144176a42 Print a warning if we get an unexpected error trying to open a file.
David A. Holland
parents: 112
diff changeset
330 if (errno != ENOENT && errno != ENOTDIR) {
1e7144176a42 Print a warning if we get an unexpected error trying to open a file.
David A. Holland
parents: 112
diff changeset
331 warn("%s", file);
1e7144176a42 Print a warning if we get an unexpected error trying to open a file.
David A. Holland
parents: 112
diff changeset
332 }
6
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
333 return -1;
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
334 }
15
f6177d3ed5c2 handle directives
David A. Holland
parents: 13
diff changeset
335
6
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
336 return fd;
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
337 }
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
338
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
339 static
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
340 void
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
341 file_search(struct place *place, struct incdirarray *path, const char *name)
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
342 {
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
343 unsigned i, num;
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
344 struct incdir *id;
13
120629a5d6bf seenfile -> placefile (clearer)
David A. Holland
parents: 10
diff changeset
345 const struct placefile *pf;
6
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
346 char *file;
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
347 int fd;
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
348
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
349 assert(place != NULL);
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
350
104
91f600e6647b Allow absolute paths in include files.
David A. Holland
parents: 99
diff changeset
351 if (name[0] == '/') {
91f600e6647b Allow absolute paths in include files.
David A. Holland
parents: 99
diff changeset
352 fd = file_tryopen(name);
6
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
353 if (fd >= 0) {
104
91f600e6647b Allow absolute paths in include files.
David A. Holland
parents: 99
diff changeset
354 pf = place_addfile(place, name, true);
91f600e6647b Allow absolute paths in include files.
David A. Holland
parents: 99
diff changeset
355 file_read(pf, fd, name, false);
6
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
356 close(fd);
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
357 return;
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
358 }
104
91f600e6647b Allow absolute paths in include files.
David A. Holland
parents: 99
diff changeset
359 } else {
91f600e6647b Allow absolute paths in include files.
David A. Holland
parents: 99
diff changeset
360 num = incdirarray_num(path);
91f600e6647b Allow absolute paths in include files.
David A. Holland
parents: 99
diff changeset
361 for (i=0; i<num; i++) {
91f600e6647b Allow absolute paths in include files.
David A. Holland
parents: 99
diff changeset
362 id = incdirarray_get(path, i);
112
2b0b61fd1a36 Fix handling of relative includes.
David A. Holland
parents: 107
diff changeset
363 file = mkfilename(place, id->name, name);
104
91f600e6647b Allow absolute paths in include files.
David A. Holland
parents: 99
diff changeset
364 fd = file_tryopen(file);
91f600e6647b Allow absolute paths in include files.
David A. Holland
parents: 99
diff changeset
365 if (fd >= 0) {
91f600e6647b Allow absolute paths in include files.
David A. Holland
parents: 99
diff changeset
366 pf = place_addfile(place, file, id->issystem);
91f600e6647b Allow absolute paths in include files.
David A. Holland
parents: 99
diff changeset
367 file_read(pf, fd, file, false);
91f600e6647b Allow absolute paths in include files.
David A. Holland
parents: 99
diff changeset
368 dostrfree(file);
91f600e6647b Allow absolute paths in include files.
David A. Holland
parents: 99
diff changeset
369 close(fd);
91f600e6647b Allow absolute paths in include files.
David A. Holland
parents: 99
diff changeset
370 return;
91f600e6647b Allow absolute paths in include files.
David A. Holland
parents: 99
diff changeset
371 }
91f600e6647b Allow absolute paths in include files.
David A. Holland
parents: 99
diff changeset
372 dostrfree(file);
91f600e6647b Allow absolute paths in include files.
David A. Holland
parents: 99
diff changeset
373 }
6
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
374 }
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
375 complain(place, "Include file %s not found", name);
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
376 complain_fail();
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
377 }
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
378
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
379 void
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
380 file_readquote(struct place *place, const char *name)
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
381 {
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
382 file_search(place, &quotepath, name);
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
383 }
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
384
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
385 void
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
386 file_readbracket(struct place *place, const char *name)
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
387 {
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
388 file_search(place, &bracketpath, name);
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
389 }
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
390
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
391 void
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
392 file_readabsolute(struct place *place, const char *name)
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
393 {
13
120629a5d6bf seenfile -> placefile (clearer)
David A. Holland
parents: 10
diff changeset
394 const struct placefile *pf;
6
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
395 int fd;
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
396
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
397 assert(place != NULL);
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
398
24
daa801fe719e fix some bugs
David A. Holland
parents: 15
diff changeset
399 if (name == NULL) {
daa801fe719e fix some bugs
David A. Holland
parents: 15
diff changeset
400 fd = STDIN_FILENO;
daa801fe719e fix some bugs
David A. Holland
parents: 15
diff changeset
401 pf = place_addfile(place, "<standard-input>", false);
daa801fe719e fix some bugs
David A. Holland
parents: 15
diff changeset
402 } else {
daa801fe719e fix some bugs
David A. Holland
parents: 15
diff changeset
403 fd = file_tryopen(name);
daa801fe719e fix some bugs
David A. Holland
parents: 15
diff changeset
404 if (fd < 0) {
daa801fe719e fix some bugs
David A. Holland
parents: 15
diff changeset
405 warn("%s", name);
daa801fe719e fix some bugs
David A. Holland
parents: 15
diff changeset
406 die();
daa801fe719e fix some bugs
David A. Holland
parents: 15
diff changeset
407 }
daa801fe719e fix some bugs
David A. Holland
parents: 15
diff changeset
408 pf = place_addfile(place, name, false);
6
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
409 }
24
daa801fe719e fix some bugs
David A. Holland
parents: 15
diff changeset
410
28
8a955e3dda2c two more tests, more fixes
David A. Holland
parents: 24
diff changeset
411 file_read(pf, fd, name, true);
24
daa801fe719e fix some bugs
David A. Holland
parents: 15
diff changeset
412
daa801fe719e fix some bugs
David A. Holland
parents: 15
diff changeset
413 if (name != NULL) {
daa801fe719e fix some bugs
David A. Holland
parents: 15
diff changeset
414 close(fd);
daa801fe719e fix some bugs
David A. Holland
parents: 15
diff changeset
415 }
6
0601b6e8e53d checkpoint - can find files
David A. Holland
parents:
diff changeset
416 }