Damien | a5185f4 | 2013-10-20 14:41:27 +0100 | [diff] [blame] | 1 | #include <stdint.h> |
| 2 | #include <stdio.h> |
| 3 | #include <unistd.h> |
| 4 | #include <fcntl.h> |
| 5 | |
| 6 | #include "misc.h" |
Damien George | d3ebe48 | 2014-01-07 15:20:33 +0000 | [diff] [blame] | 7 | #include "mpconfig.h" |
Damien | a5185f4 | 2013-10-20 14:41:27 +0100 | [diff] [blame] | 8 | #include "lexer.h" |
Damien George | 9193f89 | 2014-01-08 15:28:26 +0000 | [diff] [blame] | 9 | #include "lexerunix.h" |
Damien | a5185f4 | 2013-10-20 14:41:27 +0100 | [diff] [blame] | 10 | |
Damien George | d3ebe48 | 2014-01-07 15:20:33 +0000 | [diff] [blame] | 11 | #if MICROPY_ENABLE_LEXER_UNIX |
| 12 | |
Damien | d99b052 | 2013-12-21 18:17:45 +0000 | [diff] [blame] | 13 | mp_lexer_t *mp_lexer_new_from_file(const char *filename) { |
Damien | a5185f4 | 2013-10-20 14:41:27 +0100 | [diff] [blame] | 14 | int fd = open(filename, O_RDONLY); |
| 15 | if (fd < 0) { |
| 16 | printf("cannot open file %s\n", filename); |
| 17 | return NULL; |
| 18 | } |
| 19 | uint size = lseek(fd, 0, SEEK_END); |
| 20 | lseek(fd, 0, SEEK_SET); |
| 21 | char *data = m_new(char, size); |
Paul Sokolovsky | 44d0f3c | 2013-12-29 20:11:05 +0200 | [diff] [blame] | 22 | int read_size = read(fd, data, size); |
Damien | a5185f4 | 2013-10-20 14:41:27 +0100 | [diff] [blame] | 23 | close(fd); |
Paul Sokolovsky | 44d0f3c | 2013-12-29 20:11:05 +0200 | [diff] [blame] | 24 | if (read_size != size) { |
| 25 | printf("error reading file %s\n", filename); |
Damien | 732407f | 2013-12-29 19:33:23 +0000 | [diff] [blame] | 26 | m_del(char, data, size); |
Paul Sokolovsky | 44d0f3c | 2013-12-29 20:11:05 +0200 | [diff] [blame] | 27 | return NULL; |
| 28 | } |
Damien | a5185f4 | 2013-10-20 14:41:27 +0100 | [diff] [blame] | 29 | |
Damien George | 9193f89 | 2014-01-08 15:28:26 +0000 | [diff] [blame] | 30 | return mp_lexer_new_from_str_len(filename, data, size, size); |
Damien | a5185f4 | 2013-10-20 14:41:27 +0100 | [diff] [blame] | 31 | } |
Damien George | 66028ab | 2014-01-03 14:03:48 +0000 | [diff] [blame] | 32 | |
| 33 | /******************************************************************************/ |
| 34 | /* unix implementation of import */ |
| 35 | |
| 36 | // TODO properly! |
| 37 | |
| 38 | static const char *import_base_dir = NULL; |
| 39 | |
| 40 | void mp_import_set_directory(const char *dir) { |
| 41 | import_base_dir = dir; |
| 42 | } |
| 43 | |
| 44 | mp_lexer_t *mp_import_open_file(qstr mod_name) { |
| 45 | vstr_t *vstr = vstr_new(); |
| 46 | if (import_base_dir != NULL) { |
| 47 | vstr_printf(vstr, "%s/", import_base_dir); |
| 48 | } |
| 49 | vstr_printf(vstr, "%s.py", qstr_str(mod_name)); |
| 50 | return mp_lexer_new_from_file(vstr_str(vstr)); // TODO does lexer need to copy the string? can we free it here? |
| 51 | } |
Damien George | d3ebe48 | 2014-01-07 15:20:33 +0000 | [diff] [blame] | 52 | |
| 53 | #endif // MICROPY_ENABLE_LEXER_UNIX |