]> git.mdlowis.com Git - proto/sclpl.git/commitdiff
Switch to reference counted allocations
authorMichael D. Lowis <mike@mdlowis.com>
Fri, 26 Sep 2014 19:27:00 +0000 (15:27 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Fri, 26 Sep 2014 19:27:00 +0000 (15:27 -0400)
source/sclpl/lexer.c
source/sclpl/parser.c

index 20142b5bb0309f44223dd1ddaf6a7adb823a3a75..c5ea780e97038eb7d5e22649e2fb3b56a3b14477 100644 (file)
@@ -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;
index b5b523c25d76716ed4b8abf41480d49dd144c2b4..804284a9e29f837cdc9ddc0c773a901643129026 100644 (file)
@@ -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;
     }