From 58c7a71a50318940e747c365cc3f207dba432977 Mon Sep 17 00:00:00 2001 From: c+1 Date: Tue, 10 Oct 2023 11:26:44 -0400 Subject: fixed source.c, fixed preprocessor mem leaks, implemented new lexer --- src/pp.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 src/pp.c (limited to 'src/pp.c') diff --git a/src/pp.c b/src/pp.c new file mode 100644 index 0000000..6664879 --- /dev/null +++ b/src/pp.c @@ -0,0 +1,84 @@ +#include "include/pp.h" + +pp_t* pp_init(char* src) { + pp_t* pp; + + pp = ecalloc(1, sizeof(pp_t)); + + pp->src = src; + pp->psrc = (char*) emalloc(1); + pp->psrc[0] = '\0'; + + pp->state = PP_STATE_REG; + + return pp; +} + +void pp_destroy(pp_t* pp) { + free(pp); +} + +void pp_cpy_char(pp_t* pp) { + int plen = strlen(pp->psrc); + pp->psrc = erealloc(pp->psrc, (plen + 2) * sizeof(char)); + + pp->psrc[plen] = *pp->src; + pp->psrc[plen + 1] = '\0'; +} + +void pp_do_reg(pp_t* pp) { + switch (*pp->src) { + case SYNTAX_COMMENT_DELIM: + pp->state = PP_STATE_COM; + break; + case SYNTAX_STR_DELIM: + pp_cpy_char(pp); + pp->state = PP_STATE_STR; + break; + case ' ': + case '\n': + case '\r': + case '\t': + /* skip whitespace */ + break; + + default: + pp_cpy_char(pp); + } +} + +void pp_do_str(pp_t* pp) { + if (pp->state == PP_STATE_ESC) { + pp_cpy_char(pp); + pp->state = PP_STATE_STR; + } else { + if (*pp->src == SYNTAX_ESC) { + pp_cpy_char(pp); + pp->state = PP_STATE_ESC; + } else if (*pp->src == SYNTAX_STR_DELIM) { + pp_cpy_char(pp); + pp->state = PP_STATE_REG; + } + else { + pp_cpy_char(pp); + } + } +} + +void pp_do_com(pp_t* pp) { + if (*pp->src == SYNTAX_COMMENT_DELIM) { + pp->state = PP_STATE_REG; + } + + /* let pp_run skip chars in comments */ +} + +void pp_run(pp_t* pp) { + while (*pp->src) { + if (pp->state == PP_STATE_REG) { pp_do_reg(pp); } + else if (pp->state == PP_STATE_STR || pp->state == PP_STATE_ESC) { pp_do_str(pp); } + else if (pp->state == PP_STATE_COM) { pp_do_com(pp); } + + pp->src ++; + } +} -- cgit v1.2.3