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