blob: 225ed20a7f2ccd4afceb80722fa038d4fe4a0558 [file] [log] [blame]
Damiena5185f42013-10-20 14:41:27 +01001#include <stdint.h>
2#include <stdio.h>
3#include <unistd.h>
4#include <fcntl.h>
5
6#include "misc.h"
Damien Georged3ebe482014-01-07 15:20:33 +00007#include "mpconfig.h"
Damiena5185f42013-10-20 14:41:27 +01008#include "lexer.h"
Damien George9193f892014-01-08 15:28:26 +00009#include "lexerunix.h"
Damiena5185f42013-10-20 14:41:27 +010010
Damien Georged3ebe482014-01-07 15:20:33 +000011#if MICROPY_ENABLE_LEXER_UNIX
12
Damiend99b0522013-12-21 18:17:45 +000013mp_lexer_t *mp_lexer_new_from_file(const char *filename) {
Damiena5185f42013-10-20 14:41:27 +010014 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 Sokolovsky44d0f3c2013-12-29 20:11:05 +020022 int read_size = read(fd, data, size);
Damiena5185f42013-10-20 14:41:27 +010023 close(fd);
Paul Sokolovsky44d0f3c2013-12-29 20:11:05 +020024 if (read_size != size) {
25 printf("error reading file %s\n", filename);
Damien732407f2013-12-29 19:33:23 +000026 m_del(char, data, size);
Paul Sokolovsky44d0f3c2013-12-29 20:11:05 +020027 return NULL;
28 }
Damiena5185f42013-10-20 14:41:27 +010029
Damien George9193f892014-01-08 15:28:26 +000030 return mp_lexer_new_from_str_len(filename, data, size, size);
Damiena5185f42013-10-20 14:41:27 +010031}
Damien George66028ab2014-01-03 14:03:48 +000032
33/******************************************************************************/
34/* unix implementation of import */
35
36// TODO properly!
37
38static const char *import_base_dir = NULL;
39
40void mp_import_set_directory(const char *dir) {
41 import_base_dir = dir;
42}
43
44mp_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 Georged3ebe482014-01-07 15:20:33 +000052
53#endif // MICROPY_ENABLE_LEXER_UNIX