diff options
Diffstat (limited to 'lib/free_eval_context.c')
| -rw-r--r-- | lib/free_eval_context.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/lib/free_eval_context.c b/lib/free_eval_context.c new file mode 100644 index 0000000..5af5220 --- /dev/null +++ b/lib/free_eval_context.c @@ -0,0 +1,70 @@ +/* Aplwc - A Programming Language With Constraints + * + * Copyright (C) 2026 Peter Mikkelsen <petermikkelsen10@gmail.com> + * + * This file is part of aplwc. + * + * Aplwc is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Aplwc is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with aplwc. If not, see <https://www.gnu.org/licenses/>. + */ + +#include <aplwc.h> +#include "aplwc_internal.h" + +static void free_token(struct aplwc_eval_context *, struct aplwc_token *); +static void free_ast(struct aplwc_eval_context *, struct aplwc_ast *); + +void +aplwc_free_eval_context(struct aplwc_eval_context *context) +{ + context->aplwc->free(context->text); + for(size_t i = 0; i < context->n_tokens; i++) + free_token(context, context->tokens[i]); + free_ast(context, context->ast); + context->aplwc->free(context->tokens); + context->aplwc->free(context); +} + +static void +free_token(struct aplwc_eval_context *context, struct aplwc_token *tok) +{ + if(tok == NULL) + return; + + switch(tok->tag){ + case APLWC_TOKEN_SYSCMD: + break; + case APLWC_TOKEN_SYSCMD_ARGS: + break; + case APLWC_TOKEN_ERROR: + break; + } + + context->aplwc->free(tok); +} + +static void +free_ast(struct aplwc_eval_context *context, struct aplwc_ast *ast) +{ + if(ast == NULL) + return; + + switch(ast->tag){ + case APLWC_AST_SYSCMD: + break; + case APLWC_AST_ERROR: + break; + } + + context->aplwc->free(ast); +} |