diff options
| author | Damien <damien.p.george@gmail.com> | 2013-10-20 14:41:27 +0100 | 
|---|---|---|
| committer | Damien <damien.p.george@gmail.com> | 2013-10-20 14:41:27 +0100 | 
| commit | a5185f4bc8f60fb2be82580e6f2d93fec53d0a33 (patch) | |
| tree | 7864b4b9f64e87c5164f5b094c35601dc0a12743 /unix/lexerunix.c | |
| parent | 68f59a96e3cfda47a8c903c1eb8a64cf78ecea4f (diff) | |
Abstract out back-end stream functionality from lexer.
Diffstat (limited to 'unix/lexerunix.c')
| -rw-r--r-- | unix/lexerunix.c | 55 | 
1 files changed, 55 insertions, 0 deletions
| diff --git a/unix/lexerunix.c b/unix/lexerunix.c new file mode 100644 index 000000000..617d92bb8 --- /dev/null +++ b/unix/lexerunix.c @@ -0,0 +1,55 @@ +#include <stdint.h> +#include <stdio.h> +#include <unistd.h> +#include <fcntl.h> + +#include "misc.h" +#include "lexer.h" + +typedef struct _str_buf_t { +    bool free;                  // free src_beg when done +    const char *src_beg;        // beginning of source +    const char *src_cur;        // current location in source +    const char *src_end;        // end (exclusive) of source +} str_buf_t; + +unichar str_buf_next_char(str_buf_t *sb) { +    if (sb->src_cur < sb->src_end) { +        return *sb->src_cur++; +    } else { +        return PY_LEXER_CHAR_EOF; +    } +} + +void str_buf_free(str_buf_t *sb) { +    if (sb) { +        if (sb->free) { +            m_free((char*)sb->src_beg); +        } +        m_free(sb); +    } +} + +py_lexer_t *py_lexer_new_from_str_len(const char *src_name, const char *str, uint len, bool free_str) { +    str_buf_t *sb = m_new(str_buf_t, 1); +    sb->free = free_str; +    sb->src_beg = str; +    sb->src_cur = str; +    sb->src_end = str + len; +    return py_lexer_new(src_name, sb, (py_lexer_stream_next_char_t)str_buf_next_char, (py_lexer_stream_free_t)str_buf_free); +} + +py_lexer_t *py_lexer_new_from_file(const char *filename) { +    int fd = open(filename, O_RDONLY); +    if (fd < 0) { +        printf("cannot open file %s\n", filename); +        return NULL; +    } +    uint size = lseek(fd, 0, SEEK_END); +    lseek(fd, 0, SEEK_SET); +    char *data = m_new(char, size); +    read(fd, data, size); +    close(fd); + +    return py_lexer_new_from_str_len(filename, data, size, true); +} | 
