blob: f66fa1e2abd548f79e9075cca76b6b5aa4f56703 [file] [log] [blame]
Ilya Dmitrichenko8e9482a2014-04-12 16:37:17 +01001#include "misc.h"
2#include "mpconfig.h"
3
4#if MICROPY_ENABLE_LEXER_UNIX
5
Damiena5185f42013-10-20 14:41:27 +01006#include <stdio.h>
7#include <unistd.h>
8#include <fcntl.h>
9
Damien George55baff42014-01-21 21:40:13 +000010#include "qstr.h"
Damiena5185f42013-10-20 14:41:27 +010011#include "lexer.h"
Damien George9193f892014-01-08 15:28:26 +000012#include "lexerunix.h"
Damiena5185f42013-10-20 14:41:27 +010013
Damien Georged3ebe482014-01-07 15:20:33 +000014
xbeefe34222014-03-16 00:14:26 -070015#include <sys/stat.h>
16#include <sys/types.h>
17
Damien Georgeffa9bdd2014-04-10 15:00:58 +010018typedef struct _mp_lexer_file_buf_t {
19 int fd;
20 char buf[20];
21 uint len;
22 uint pos;
23} mp_lexer_file_buf_t;
Damiena5185f42013-10-20 14:41:27 +010024
Damien Georgeffa9bdd2014-04-10 15:00:58 +010025STATIC unichar file_buf_next_char(mp_lexer_file_buf_t *fb) {
26 if (fb->pos >= fb->len) {
27 if (fb->len < sizeof(fb->buf)) {
28 return MP_LEXER_CHAR_EOF;
29 } else {
30 int n = read(fb->fd, fb->buf, sizeof(fb->buf));
31 if (n <= 0) {
32 return MP_LEXER_CHAR_EOF;
33 }
34 fb->len = n;
35 fb->pos = 0;
36 }
37 }
38 return fb->buf[fb->pos++];
39}
40
41STATIC void file_buf_close(mp_lexer_file_buf_t *fb) {
42 close(fb->fd);
43 m_del_obj(mp_lexer_file_buf_t, fb);
44}
45
46mp_lexer_t *mp_lexer_new_from_file(const char *filename) {
47 mp_lexer_file_buf_t *fb = m_new_obj(mp_lexer_file_buf_t);
48 fb->fd = open(filename, O_RDONLY);
49 if (fb->fd < 0) {
50 m_del_obj(mp_lexer_file_buf_t, fb);
51 return NULL;
52 }
53 int n = read(fb->fd, fb->buf, sizeof(fb->buf));
54 fb->len = n;
55 fb->pos = 0;
56 return mp_lexer_new(qstr_from_str(filename), fb, (mp_lexer_stream_next_char_t)file_buf_next_char, (mp_lexer_stream_close_t)file_buf_close);
Damiena5185f42013-10-20 14:41:27 +010057}
Damien George66028ab2014-01-03 14:03:48 +000058
Damien Georged3ebe482014-01-07 15:20:33 +000059#endif // MICROPY_ENABLE_LEXER_UNIX