From 81e7051d6089c4fae6c25171c0a17ee8f39d8e97 Mon Sep 17 00:00:00 2001 From: wes Date: Fri, 4 Dec 2015 22:12:42 -0500 Subject: [PATCH] properly free tokens --- tokenize.cpp | 30 ++++++++++++++++++++++++++---- tokenize.h | 4 ++-- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/tokenize.cpp b/tokenize.cpp index 1f3c10e..1ca866f 100644 --- a/tokenize.cpp +++ b/tokenize.cpp @@ -117,6 +117,12 @@ pop_token(token_stream *tokens) { CHECK(tokens); len = tokens->length; + tok_t ttype = tokens->tokens[len].token_type; + if ((ttype != QUOTE) && + (ttype != WSPACE) && + (ttype != EMPTY)) { + free_token(tokens->tokens[len], ttype); + } assert(len != 0); len--; @@ -423,11 +429,27 @@ tokenize(source_t source, } int -free_token( void *key, - void *val) { +free_token(token_t val, + tok_t ttype) { /* silence warnings about unused parameters, key and val point to the same data*/ - (void)key; - free((char *)val); + switch (ttype) { + case SYMBOL: + free((void *)val.token.symbol); + break; + case IDENTIFIER: + free((void *)val.token.identifier); + break; + case INTEGER: + free((void *)val.token.integer); + break; + case FLOATING: + free((void *)val.token.floating); + break; + case QUOTE: + free((void *)val.token.string); + break; + default: return true; + } return true; } diff --git a/tokenize.h b/tokenize.h index fd83054..d6e7142 100644 --- a/tokenize.h +++ b/tokenize.h @@ -68,7 +68,7 @@ match_symbol(source_t, uint32_t, const uint32_t); #endif int -free_token(const void *, - const void *); +free_token(token_t, + tok_t); token_t testfunc(void);