diff options
author | c+1 | 2023-10-10 11:26:44 -0400 |
---|---|---|
committer | c+1 | 2023-10-10 11:26:44 -0400 |
commit | 58c7a71a50318940e747c365cc3f207dba432977 (patch) | |
tree | 7d173f5433fba1b01c531610a0bf70684b8ca1de /src/pp.c | |
parent | 78befa147eccfb169bf994da3d9bfba9be3631a6 (diff) |
fixed source.c, fixed preprocessor mem leaks, implemented new lexer
Diffstat (limited to 'src/pp.c')
-rw-r--r-- | src/pp.c | 84 |
1 files changed, 84 insertions, 0 deletions
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 ++; + } +} |