annotate gcc/go/gofrontend/import.h @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 // import.h -- Go frontend import declarations. -*- C++ -*-
kono
parents:
diff changeset
2
kono
parents:
diff changeset
3 // Copyright 2009 The Go Authors. All rights reserved.
kono
parents:
diff changeset
4 // Use of this source code is governed by a BSD-style
kono
parents:
diff changeset
5 // license that can be found in the LICENSE file.
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 #ifndef GO_IMPORT_H
kono
parents:
diff changeset
8 #define GO_IMPORT_H
kono
parents:
diff changeset
9
kono
parents:
diff changeset
10 #include "export.h"
kono
parents:
diff changeset
11 #include "go-linemap.h"
kono
parents:
diff changeset
12
kono
parents:
diff changeset
13 class Gogo;
kono
parents:
diff changeset
14 class Package;
kono
parents:
diff changeset
15 class Type;
kono
parents:
diff changeset
16 class Named_object;
kono
parents:
diff changeset
17 class Named_type;
kono
parents:
diff changeset
18 class Expression;
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 // This class manages importing Go declarations.
kono
parents:
diff changeset
21
kono
parents:
diff changeset
22 class Import
kono
parents:
diff changeset
23 {
kono
parents:
diff changeset
24 public:
kono
parents:
diff changeset
25 // The Stream class is an interface used to read the data. The
kono
parents:
diff changeset
26 // caller should instantiate a child of this class.
kono
parents:
diff changeset
27 class Stream
kono
parents:
diff changeset
28 {
kono
parents:
diff changeset
29 public:
kono
parents:
diff changeset
30 Stream();
kono
parents:
diff changeset
31 virtual ~Stream();
kono
parents:
diff changeset
32
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
33 // Set the position, for error messages.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
34 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
35 set_pos(int pos)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
36 { this->pos_ = pos; }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
37
111
kono
parents:
diff changeset
38 // Return whether we have seen an error.
kono
parents:
diff changeset
39 bool
kono
parents:
diff changeset
40 saw_error() const
kono
parents:
diff changeset
41 { return this->saw_error_; }
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 // Record that we've seen an error.
kono
parents:
diff changeset
44 void
kono
parents:
diff changeset
45 set_saw_error()
kono
parents:
diff changeset
46 { this->saw_error_ = true; }
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 // Return the next character (a value from 0 to 0xff) without
kono
parents:
diff changeset
49 // advancing. Returns -1 at end of stream.
kono
parents:
diff changeset
50 int
kono
parents:
diff changeset
51 peek_char();
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 // Look for LENGTH characters, setting *BYTES to point to them.
kono
parents:
diff changeset
54 // Returns false if the bytes are not available. Does not
kono
parents:
diff changeset
55 // advance.
kono
parents:
diff changeset
56 bool
kono
parents:
diff changeset
57 peek(size_t length, const char** bytes)
kono
parents:
diff changeset
58 { return this->do_peek(length, bytes); }
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 // Return the next character (a value from 0 to 0xff) and advance
kono
parents:
diff changeset
61 // the read position by 1. Returns -1 at end of stream.
kono
parents:
diff changeset
62 int
kono
parents:
diff changeset
63 get_char()
kono
parents:
diff changeset
64 {
kono
parents:
diff changeset
65 int c = this->peek_char();
kono
parents:
diff changeset
66 this->advance(1);
kono
parents:
diff changeset
67 return c;
kono
parents:
diff changeset
68 }
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 // Return true if at the end of the stream.
kono
parents:
diff changeset
71 bool
kono
parents:
diff changeset
72 at_eof()
kono
parents:
diff changeset
73 { return this->peek_char() == -1; }
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 // Return true if the next bytes match STR.
kono
parents:
diff changeset
76 bool
kono
parents:
diff changeset
77 match_c_string(const char* str)
kono
parents:
diff changeset
78 { return this->match_bytes(str, strlen(str)); }
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 // Return true if the next LENGTH bytes match BYTES.
kono
parents:
diff changeset
81 bool
kono
parents:
diff changeset
82 match_bytes(const char* bytes, size_t length);
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 // Give an error if the next bytes do not match STR. Advance the
kono
parents:
diff changeset
85 // read position by the length of STR.
kono
parents:
diff changeset
86 void
kono
parents:
diff changeset
87 require_c_string(Location location, const char* str)
kono
parents:
diff changeset
88 { this->require_bytes(location, str, strlen(str)); }
kono
parents:
diff changeset
89
kono
parents:
diff changeset
90 // Given an error if the next LENGTH bytes do not match BYTES.
kono
parents:
diff changeset
91 // Advance the read position by LENGTH.
kono
parents:
diff changeset
92 void
kono
parents:
diff changeset
93 require_bytes(Location, const char* bytes, size_t length);
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 // Advance the read position by SKIP bytes.
kono
parents:
diff changeset
96 void
kono
parents:
diff changeset
97 advance(size_t skip)
kono
parents:
diff changeset
98 {
kono
parents:
diff changeset
99 this->do_advance(skip);
kono
parents:
diff changeset
100 this->pos_ += skip;
kono
parents:
diff changeset
101 }
kono
parents:
diff changeset
102
kono
parents:
diff changeset
103 // Return the current read position. This returns int because it
kono
parents:
diff changeset
104 // is more convenient in error reporting. FIXME.
kono
parents:
diff changeset
105 int
kono
parents:
diff changeset
106 pos()
kono
parents:
diff changeset
107 { return static_cast<int>(this->pos_); }
kono
parents:
diff changeset
108
kono
parents:
diff changeset
109 protected:
kono
parents:
diff changeset
110 // This function should set *BYTES to point to a buffer holding
kono
parents:
diff changeset
111 // the LENGTH bytes at the current read position. It should
kono
parents:
diff changeset
112 // return false if the bytes are not available. This should not
kono
parents:
diff changeset
113 // change the current read position.
kono
parents:
diff changeset
114 virtual bool
kono
parents:
diff changeset
115 do_peek(size_t length, const char** bytes) = 0;
kono
parents:
diff changeset
116
kono
parents:
diff changeset
117 // This function should advance the current read position LENGTH
kono
parents:
diff changeset
118 // bytes.
kono
parents:
diff changeset
119 virtual void
kono
parents:
diff changeset
120 do_advance(size_t skip) = 0;
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 private:
kono
parents:
diff changeset
123 // The current read position.
kono
parents:
diff changeset
124 size_t pos_;
kono
parents:
diff changeset
125 // True if we've seen an error reading from this stream.
kono
parents:
diff changeset
126 bool saw_error_;
kono
parents:
diff changeset
127 };
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 // Find import data. This searches the file system for FILENAME and
kono
parents:
diff changeset
130 // returns a pointer to a Stream object to read the data that it
kono
parents:
diff changeset
131 // exports. LOCATION is the location of the import statement.
kono
parents:
diff changeset
132 // RELATIVE_IMPORT_PATH is used as a prefix for a relative import.
kono
parents:
diff changeset
133 static Stream*
kono
parents:
diff changeset
134 open_package(const std::string& filename, Location location,
kono
parents:
diff changeset
135 const std::string& relative_import_path);
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 // Constructor.
kono
parents:
diff changeset
138 Import(Stream*, Location);
kono
parents:
diff changeset
139
kono
parents:
diff changeset
140 // Register the builtin types.
kono
parents:
diff changeset
141 void
kono
parents:
diff changeset
142 register_builtin_types(Gogo*);
kono
parents:
diff changeset
143
kono
parents:
diff changeset
144 // Import everything defined in the stream. LOCAL_NAME is the local
kono
parents:
diff changeset
145 // name to be used for bindings; if it is the string "." then
kono
parents:
diff changeset
146 // bindings should be inserted in the global scope. If LOCAL_NAME
kono
parents:
diff changeset
147 // is the empty string then the name of the package itself is the
kono
parents:
diff changeset
148 // local name. This returns the imported package, or NULL on error.
kono
parents:
diff changeset
149 Package*
kono
parents:
diff changeset
150 import(Gogo*, const std::string& local_name, bool is_local_name_exported);
kono
parents:
diff changeset
151
kono
parents:
diff changeset
152 // The location of the import statement.
kono
parents:
diff changeset
153 Location
kono
parents:
diff changeset
154 location() const
kono
parents:
diff changeset
155 { return this->location_; }
kono
parents:
diff changeset
156
kono
parents:
diff changeset
157 // Return the package we are importing.
kono
parents:
diff changeset
158 Package*
kono
parents:
diff changeset
159 package() const
kono
parents:
diff changeset
160 { return this->package_; }
kono
parents:
diff changeset
161
kono
parents:
diff changeset
162 // Return the next character.
kono
parents:
diff changeset
163 int
kono
parents:
diff changeset
164 peek_char()
kono
parents:
diff changeset
165 { return this->stream_->peek_char(); }
kono
parents:
diff changeset
166
kono
parents:
diff changeset
167 // Return the next character and advance.
kono
parents:
diff changeset
168 int
kono
parents:
diff changeset
169 get_char()
kono
parents:
diff changeset
170 { return this->stream_->get_char(); }
kono
parents:
diff changeset
171
kono
parents:
diff changeset
172 // Return true at the end of the stream.
kono
parents:
diff changeset
173 bool
kono
parents:
diff changeset
174 at_eof()
kono
parents:
diff changeset
175 { return this->stream_->at_eof(); }
kono
parents:
diff changeset
176
kono
parents:
diff changeset
177 // Return whether the next bytes match STR.
kono
parents:
diff changeset
178 bool
kono
parents:
diff changeset
179 match_c_string(const char* str)
kono
parents:
diff changeset
180 { return this->stream_->match_c_string(str); }
kono
parents:
diff changeset
181
kono
parents:
diff changeset
182 // Require that the next bytes match STR.
kono
parents:
diff changeset
183 void
kono
parents:
diff changeset
184 require_c_string(const char* str)
kono
parents:
diff changeset
185 { this->stream_->require_c_string(this->location_, str); }
kono
parents:
diff changeset
186
kono
parents:
diff changeset
187 // Advance the stream SKIP bytes.
kono
parents:
diff changeset
188 void
kono
parents:
diff changeset
189 advance(size_t skip)
kono
parents:
diff changeset
190 { this->stream_->advance(skip); }
kono
parents:
diff changeset
191
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
192 // Skip a semicolon if using an older version.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
193 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
194 require_semicolon_if_old_version()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
195 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
196 if (this->version_ == EXPORT_FORMAT_V1
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
197 || this->version_ == EXPORT_FORMAT_V2)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
198 this->require_c_string(";");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
199 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
200
111
kono
parents:
diff changeset
201 // Read an identifier.
kono
parents:
diff changeset
202 std::string
kono
parents:
diff changeset
203 read_identifier();
kono
parents:
diff changeset
204
kono
parents:
diff changeset
205 // Read a name. This is like read_identifier, except that a "?" is
kono
parents:
diff changeset
206 // returned as an empty string. This matches Export::write_name.
kono
parents:
diff changeset
207 std::string
kono
parents:
diff changeset
208 read_name();
kono
parents:
diff changeset
209
kono
parents:
diff changeset
210 // Read a type.
kono
parents:
diff changeset
211 Type*
kono
parents:
diff changeset
212 read_type();
kono
parents:
diff changeset
213
kono
parents:
diff changeset
214 // Read an escape note.
kono
parents:
diff changeset
215 std::string
kono
parents:
diff changeset
216 read_escape();
kono
parents:
diff changeset
217
kono
parents:
diff changeset
218 private:
kono
parents:
diff changeset
219 static Stream*
kono
parents:
diff changeset
220 try_package_in_directory(const std::string&, Location);
kono
parents:
diff changeset
221
kono
parents:
diff changeset
222 static int
kono
parents:
diff changeset
223 try_suffixes(std::string*);
kono
parents:
diff changeset
224
kono
parents:
diff changeset
225 static Stream*
kono
parents:
diff changeset
226 find_export_data(const std::string& filename, int fd, Location);
kono
parents:
diff changeset
227
kono
parents:
diff changeset
228 static Stream*
kono
parents:
diff changeset
229 find_object_export_data(const std::string& filename, int fd,
kono
parents:
diff changeset
230 off_t offset, Location);
kono
parents:
diff changeset
231
kono
parents:
diff changeset
232 static const int archive_magic_len = 8;
kono
parents:
diff changeset
233
kono
parents:
diff changeset
234 static bool
kono
parents:
diff changeset
235 is_archive_magic(const char*);
kono
parents:
diff changeset
236
kono
parents:
diff changeset
237 static Stream*
kono
parents:
diff changeset
238 find_archive_export_data(const std::string& filename, int fd,
kono
parents:
diff changeset
239 Location);
kono
parents:
diff changeset
240
kono
parents:
diff changeset
241 // Read a package line.
kono
parents:
diff changeset
242 void
kono
parents:
diff changeset
243 read_one_package();
kono
parents:
diff changeset
244
kono
parents:
diff changeset
245 // Read an import line.
kono
parents:
diff changeset
246 void
kono
parents:
diff changeset
247 read_one_import();
kono
parents:
diff changeset
248
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
249 // Read an indirectimport line.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
250 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
251 read_one_indirect_import();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
252
111
kono
parents:
diff changeset
253 // Read the import control functions and init graph.
kono
parents:
diff changeset
254 void
kono
parents:
diff changeset
255 read_import_init_fns(Gogo*);
kono
parents:
diff changeset
256
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
257 // Read the types.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
258 bool
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
259 read_types();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
260
111
kono
parents:
diff changeset
261 // Import a constant.
kono
parents:
diff changeset
262 void
kono
parents:
diff changeset
263 import_const();
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 // Import a type.
kono
parents:
diff changeset
266 void
kono
parents:
diff changeset
267 import_type();
kono
parents:
diff changeset
268
kono
parents:
diff changeset
269 // Import a variable.
kono
parents:
diff changeset
270 void
kono
parents:
diff changeset
271 import_var();
kono
parents:
diff changeset
272
kono
parents:
diff changeset
273 // Import a function.
kono
parents:
diff changeset
274 Named_object*
kono
parents:
diff changeset
275 import_func(Package*);
kono
parents:
diff changeset
276
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
277 // Parse a type definition.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
278 bool
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
279 parse_type(int index);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
280
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
281 // Read a named type and store it at this->type_[index].
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
282 Type*
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
283 read_named_type(int index);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
284
111
kono
parents:
diff changeset
285 // Register a single builtin type.
kono
parents:
diff changeset
286 void
kono
parents:
diff changeset
287 register_builtin_type(Gogo*, const char* name, Builtin_code);
kono
parents:
diff changeset
288
kono
parents:
diff changeset
289 // Get an integer from a string.
kono
parents:
diff changeset
290 bool
kono
parents:
diff changeset
291 string_to_int(const std::string&, bool is_neg_ok, int* ret);
kono
parents:
diff changeset
292
kono
parents:
diff changeset
293 // Get an unsigned integer from a string.
kono
parents:
diff changeset
294 bool
kono
parents:
diff changeset
295 string_to_unsigned(const std::string& s, unsigned* ret)
kono
parents:
diff changeset
296 {
kono
parents:
diff changeset
297 int ivalue;
kono
parents:
diff changeset
298 if (!this->string_to_int(s, false, &ivalue))
kono
parents:
diff changeset
299 return false;
kono
parents:
diff changeset
300 *ret = static_cast<unsigned>(ivalue);
kono
parents:
diff changeset
301 return true;
kono
parents:
diff changeset
302 }
kono
parents:
diff changeset
303
kono
parents:
diff changeset
304 // Return the version number of the export data we're reading.
kono
parents:
diff changeset
305 Export_data_version
kono
parents:
diff changeset
306 version() const { return this->version_; }
kono
parents:
diff changeset
307
kono
parents:
diff changeset
308 // The general IR.
kono
parents:
diff changeset
309 Gogo* gogo_;
kono
parents:
diff changeset
310 // The stream from which to read import data.
kono
parents:
diff changeset
311 Stream* stream_;
kono
parents:
diff changeset
312 // The location of the import statement we are processing.
kono
parents:
diff changeset
313 Location location_;
kono
parents:
diff changeset
314 // The package we are importing.
kono
parents:
diff changeset
315 Package* package_;
kono
parents:
diff changeset
316 // Whether to add new objects to the global scope, rather than to a
kono
parents:
diff changeset
317 // package scope.
kono
parents:
diff changeset
318 bool add_to_globals_;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
319 // All type data.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
320 std::string type_data_;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
321 // Position of type data in the stream.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
322 int type_pos_;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
323 // Mapping from type code to offset/length in type_data_.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
324 std::vector<std::pair<size_t, size_t> > type_offsets_;
111
kono
parents:
diff changeset
325 // Mapping from negated builtin type codes to Type structures.
kono
parents:
diff changeset
326 std::vector<Named_type*> builtin_types_;
kono
parents:
diff changeset
327 // Mapping from exported type codes to Type structures.
kono
parents:
diff changeset
328 std::vector<Type*> types_;
kono
parents:
diff changeset
329 // Version of export data we're reading.
kono
parents:
diff changeset
330 Export_data_version version_;
kono
parents:
diff changeset
331 };
kono
parents:
diff changeset
332
kono
parents:
diff changeset
333 // Read import data from a string.
kono
parents:
diff changeset
334
kono
parents:
diff changeset
335 class Stream_from_string : public Import::Stream
kono
parents:
diff changeset
336 {
kono
parents:
diff changeset
337 public:
kono
parents:
diff changeset
338 Stream_from_string(const std::string& str)
kono
parents:
diff changeset
339 : str_(str), pos_(0)
kono
parents:
diff changeset
340 { }
kono
parents:
diff changeset
341
kono
parents:
diff changeset
342 protected:
kono
parents:
diff changeset
343 bool
kono
parents:
diff changeset
344 do_peek(size_t length, const char** bytes)
kono
parents:
diff changeset
345 {
kono
parents:
diff changeset
346 if (this->pos_ + length > this->str_.length())
kono
parents:
diff changeset
347 return false;
kono
parents:
diff changeset
348 *bytes = this->str_.data() + this->pos_;
kono
parents:
diff changeset
349 return true;
kono
parents:
diff changeset
350 }
kono
parents:
diff changeset
351
kono
parents:
diff changeset
352 void
kono
parents:
diff changeset
353 do_advance(size_t len)
kono
parents:
diff changeset
354 { this->pos_ += len; }
kono
parents:
diff changeset
355
kono
parents:
diff changeset
356 private:
kono
parents:
diff changeset
357 // The string of data we are reading.
kono
parents:
diff changeset
358 std::string str_;
kono
parents:
diff changeset
359 // The current position within the string.
kono
parents:
diff changeset
360 size_t pos_;
kono
parents:
diff changeset
361 };
kono
parents:
diff changeset
362
kono
parents:
diff changeset
363 // Read import data from a buffer allocated using malloc.
kono
parents:
diff changeset
364
kono
parents:
diff changeset
365 class Stream_from_buffer : public Import::Stream
kono
parents:
diff changeset
366 {
kono
parents:
diff changeset
367 public:
kono
parents:
diff changeset
368 Stream_from_buffer(char* buf, size_t length)
kono
parents:
diff changeset
369 : buf_(buf), length_(length), pos_(0)
kono
parents:
diff changeset
370 { }
kono
parents:
diff changeset
371
kono
parents:
diff changeset
372 ~Stream_from_buffer()
kono
parents:
diff changeset
373 { free(this->buf_); }
kono
parents:
diff changeset
374
kono
parents:
diff changeset
375 protected:
kono
parents:
diff changeset
376 bool
kono
parents:
diff changeset
377 do_peek(size_t length, const char** bytes)
kono
parents:
diff changeset
378 {
kono
parents:
diff changeset
379 if (this->pos_ + length > this->length_)
kono
parents:
diff changeset
380 return false;
kono
parents:
diff changeset
381 *bytes = this->buf_ + this->pos_;
kono
parents:
diff changeset
382 return true;
kono
parents:
diff changeset
383 }
kono
parents:
diff changeset
384
kono
parents:
diff changeset
385 void
kono
parents:
diff changeset
386 do_advance(size_t len)
kono
parents:
diff changeset
387 { this->pos_ += len; }
kono
parents:
diff changeset
388
kono
parents:
diff changeset
389 private:
kono
parents:
diff changeset
390 // The data we are reading.
kono
parents:
diff changeset
391 char* buf_;
kono
parents:
diff changeset
392 // The length of the buffer.
kono
parents:
diff changeset
393 size_t length_;
kono
parents:
diff changeset
394 // The current position within the buffer.
kono
parents:
diff changeset
395 size_t pos_;
kono
parents:
diff changeset
396 };
kono
parents:
diff changeset
397
kono
parents:
diff changeset
398 // Read import data from an open file descriptor.
kono
parents:
diff changeset
399
kono
parents:
diff changeset
400 class Stream_from_file : public Import::Stream
kono
parents:
diff changeset
401 {
kono
parents:
diff changeset
402 public:
kono
parents:
diff changeset
403 Stream_from_file(int fd);
kono
parents:
diff changeset
404
kono
parents:
diff changeset
405 ~Stream_from_file();
kono
parents:
diff changeset
406
kono
parents:
diff changeset
407 protected:
kono
parents:
diff changeset
408 bool
kono
parents:
diff changeset
409 do_peek(size_t, const char**);
kono
parents:
diff changeset
410
kono
parents:
diff changeset
411 void
kono
parents:
diff changeset
412 do_advance(size_t);
kono
parents:
diff changeset
413
kono
parents:
diff changeset
414 private:
kono
parents:
diff changeset
415 // No copying.
kono
parents:
diff changeset
416 Stream_from_file(const Stream_from_file&);
kono
parents:
diff changeset
417 Stream_from_file& operator=(const Stream_from_file&);
kono
parents:
diff changeset
418
kono
parents:
diff changeset
419 // The file descriptor.
kono
parents:
diff changeset
420 int fd_;
kono
parents:
diff changeset
421 // Data read from the file.
kono
parents:
diff changeset
422 std::string data_;
kono
parents:
diff changeset
423 };
kono
parents:
diff changeset
424
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
425 // Read import data from an offset into a std::string. This uses a
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
426 // reference to the string, to avoid copying, so the string must be
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
427 // kept alive through some other mechanism.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
428
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
429 class Stream_from_string_ref : public Import::Stream
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
430 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
431 public:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
432 Stream_from_string_ref(const std::string& str, size_t offset, size_t length)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
433 : str_(str), pos_(offset), end_(offset + length)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
434 { }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
435
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
436 ~Stream_from_string_ref()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
437 {}
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
438
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
439 protected:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
440 bool
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
441 do_peek(size_t length, const char** bytes)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
442 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
443 if (this->pos_ + length > this->end_)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
444 return false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
445 *bytes = &this->str_[this->pos_];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
446 return true;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
447 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
448
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
449 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
450 do_advance(size_t length)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
451 { this->pos_ += length; }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
452
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
453 private:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
454 // A reference to the string we are reading from.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
455 const std::string& str_;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
456 // The current offset into the string.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
457 size_t pos_;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
458 // The index after the last byte we can read.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
459 size_t end_;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
460 };
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
461
111
kono
parents:
diff changeset
462 #endif // !defined(GO_IMPORT_H)