1 // import.h -- Go frontend import declarations. -*- C++ -*-
3 // Copyright 2009 The Go Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file.
19 // This class manages importing Go declarations.
24 // The Stream class is an interface used to read the data. The
25 // caller should instantiate a child of this class.
32 // Return whether we have seen an error.
35 { return this->saw_error_; }
37 // Record that we've seen an error.
40 { this->saw_error_ = true; }
42 // Return the next character (a value from 0 to 0xff) without
43 // advancing. Returns -1 at end of stream.
47 // Look for LENGTH characters, setting *BYTES to point to them.
48 // Returns false if the bytes are not available. Does not
51 peek(size_t length, const char** bytes)
52 { return this->do_peek(length, bytes); }
54 // Return the next character (a value from 0 to 0xff) and advance
55 // the read position by 1. Returns -1 at end of stream.
59 int c = this->peek_char();
64 // Return true if at the end of the stream.
67 { return this->peek_char() == -1; }
69 // Return true if the next bytes match STR.
71 match_c_string(const char* str)
72 { return this->match_bytes(str, strlen(str)); }
74 // Return true if the next LENGTH bytes match BYTES.
76 match_bytes(const char* bytes, size_t length);
78 // Give an error if the next bytes do not match STR. Advance the
79 // read position by the length of STR.
81 require_c_string(source_location location, const char* str)
82 { this->require_bytes(location, str, strlen(str)); }
84 // Given an error if the next LENGTH bytes do not match BYTES.
85 // Advance the read position by LENGTH.
87 require_bytes(source_location, const char* bytes, size_t length);
89 // Advance the read position by SKIP bytes.
93 this->do_advance(skip);
97 // Return the current read position. This returns int because it
98 // is more convenient in error reporting. FIXME.
101 { return static_cast<int>(this->pos_); }
104 // This function should set *BYTES to point to a buffer holding
105 // the LENGTH bytes at the current read position. It should
106 // return false if the bytes are not available. This should not
107 // change the current read position.
109 do_peek(size_t length, const char** bytes) = 0;
111 // This function should advance the current read position LENGTH
114 do_advance(size_t skip) = 0;
117 // The current read position.
119 // True if we've seen an error reading from this stream.
123 // Find import data. This searches the file system for FILENAME and
124 // returns a pointer to a Stream object to read the data that it
125 // exports. LOCATION is the location of the import statement.
127 open_package(const std::string& filename, source_location location);
130 Import(Stream*, source_location);
132 // Register the builtin types.
134 register_builtin_types(Gogo*);
136 // Import everything defined in the stream. LOCAL_NAME is the local
137 // name to be used for bindings; if it is the string "." then
138 // bindings should be inserted in the global scope. If LOCAL_NAME
139 // is the empty string then the name of the package itself is the
140 // local name. This returns the imported package, or NULL on error.
142 import(Gogo*, const std::string& local_name, bool is_local_name_exported);
144 // The location of the import statement.
147 { return this->location_; }
149 // Return the next character.
152 { return this->stream_->peek_char(); }
154 // Return the next character and advance.
157 { return this->stream_->get_char(); }
159 // Return true at the end of the stream.
162 { return this->stream_->at_eof(); }
164 // Return whether the next bytes match STR.
166 match_c_string(const char* str)
167 { return this->stream_->match_c_string(str); }
169 // Require that the next bytes match STR.
171 require_c_string(const char* str)
172 { this->stream_->require_c_string(this->location_, str); }
174 // Advance the stream SKIP bytes.
177 { this->stream_->advance(skip); }
179 // Read an identifier.
187 // The name used for parameters, receivers, and results in imported
189 static const char* const import_marker;
193 try_package_in_directory(const std::string&, source_location);
196 try_suffixes(std::string*);
199 find_export_data(const std::string& filename, int fd, source_location);
202 find_object_export_data(const std::string& filename, int fd,
203 off_t offset, source_location);
205 static const int archive_magic_len = 8;
208 is_archive_magic(const char*);
211 find_archive_export_data(const std::string& filename, int fd,
214 // Read the import control functions.
216 read_import_init_fns(Gogo*);
218 // Import a constant.
226 // Import a variable.
230 // Import a function.
232 import_func(Package*);
234 // Register a single builtin type.
236 register_builtin_type(Gogo*, const char* name, Builtin_code);
238 // Get an integer from a string.
240 string_to_int(const std::string&, bool is_neg_ok, int* ret);
244 // The stream from which to read import data.
246 // The location of the import statement we are processing.
247 source_location location_;
248 // The package we are importing.
250 // Whether to add new objects to the global scope, rather than to a
252 bool add_to_globals_;
253 // Mapping from negated builtin type codes to Type structures.
254 std::vector<Named_type*> builtin_types_;
255 // Mapping from exported type codes to Type structures.
256 std::vector<Type*> types_;
259 // Read import data from a string.
261 class Stream_from_string : public Import::Stream
264 Stream_from_string(const std::string& str)
270 do_peek(size_t length, const char** bytes)
272 if (this->pos_ + length > this->str_.length())
274 *bytes = this->str_.data() + this->pos_;
279 do_advance(size_t len)
280 { this->pos_ += len; }
283 // The string of data we are reading.
285 // The current position within the string.
289 // Read import data from an allocated buffer.
291 class Stream_from_buffer : public Import::Stream
294 Stream_from_buffer(char* buf, size_t length)
295 : buf_(buf), length_(length), pos_(0)
298 ~Stream_from_buffer()
299 { delete[] this->buf_; }
303 do_peek(size_t length, const char** bytes)
305 if (this->pos_ + length > this->length_)
307 *bytes = this->buf_ + this->pos_;
312 do_advance(size_t len)
313 { this->pos_ += len; }
316 // The data we are reading.
318 // The length of the buffer.
320 // The current position within the buffer.
324 // Read import data from an open file descriptor.
326 class Stream_from_file : public Import::Stream
329 Stream_from_file(int fd);
335 do_peek(size_t, const char**);
342 Stream_from_file(const Stream_from_file&);
343 Stream_from_file& operator=(const Stream_from_file&);
345 // The file descriptor.
347 // Data read from the file.
351 #endif // !defined(GO_IMPORT_H)