From: Michael D. Lowis Date: Fri, 26 Sep 2014 19:27:00 +0000 (-0400) Subject: Switch to reference counted allocations X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=7498371797acb4e5bfd2a31a3471bba8134779a5;p=proto%2Fsclpl.git Switch to reference counted allocations --- diff --git a/source/sclpl/lexer.c b/source/sclpl/lexer.c index 20142b5..c5ea780 100644 --- a/source/sclpl/lexer.c +++ b/source/sclpl/lexer.c @@ -136,7 +136,7 @@ static lex_tok_t* lexer_number(char* text) static lex_tok_t* lexer_integer(char* text, int base) { char* end; - long* p_int = (long*)malloc(sizeof(long)); + long* p_int = (long*)mem_allocate(sizeof(long), NULL); errno = 0; *p_int = strtol(text, &end, base); assert(errno == 0); @@ -146,7 +146,7 @@ static lex_tok_t* lexer_integer(char* text, int base) static lex_tok_t* lexer_float(char* text) { char* end; - double* p_dbl = (double*)malloc(sizeof(double)); + double* p_dbl = (double*)mem_allocate(sizeof(double), NULL); errno = 0; *p_dbl = strtod(text, &end); assert(errno == 0); @@ -207,7 +207,7 @@ static bool is_float(char* text) { static char* lexer_dup(const char* p_old) { size_t length = strlen(p_old); - char* p_str = (char*)malloc(length+1); + char* p_str = (char*)mem_allocate(length+1, NULL); memcpy(p_str, p_old, length); p_str[length] = '\0'; return p_str; diff --git a/source/sclpl/parser.c b/source/sclpl/parser.c index b5b523c..804284a 100644 --- a/source/sclpl/parser.c +++ b/source/sclpl/parser.c @@ -11,6 +11,8 @@ lex_tok_t tok_eof = { T_END_FILE, NULL, 0, 0, NULL }; static void parser_free(void* p_obj) { parser_t* p_parser = (parser_t*)p_obj; + if ((NULL != p_parser->p_tok) && (&tok_eof != p_parser->p_tok)) + mem_release(p_parser->p_tok); mem_release(p_parser->p_lexer); mem_release(p_parser->p_tok_buf); } @@ -53,6 +55,7 @@ bool parser_accept(parser_t* p_parser, lex_tok_type_t type) { bool ret = false; if (parser_peek(p_parser)->type == type) { + vec_push_back(p_parser->p_tok_buf, p_parser->p_tok); p_parser->p_tok = NULL; ret = true; } @@ -63,6 +66,7 @@ bool parser_accept_str(parser_t* p_parser, lex_tok_type_t type, const char* p_te { bool ret = false; if ((parser_peek(p_parser)->type == type) && (0 == strcmp((char*)(p_parser->p_tok->value), p_text))) { + vec_push_back(p_parser->p_tok_buf, p_parser->p_tok); p_parser->p_tok = NULL; ret = true; }