Add free function for freeing the custom structs.

This commit is contained in:
Danila Fedorin 2018-04-17 11:22:48 -07:00
parent af87c6646d
commit b1a113a57d
4 changed files with 32 additions and 3 deletions

View File

@ -8,7 +8,7 @@ project(libabacus)
add_compile_options(-pedantic -Wall) add_compile_options(-pedantic -Wall)
add_library(abacus STATIC src/lexer.c src/util.c src/table.c src/parser.c src/libabacus.c src/tree.c src/debug.c src/parsetype.c src/reserved.c src/trie.c src/refcount.c src/ref_vec.c src/ref_trie.c src/basetype.c src/type.c src/value.c) add_library(abacus STATIC src/lexer.c src/util.c src/table.c src/parser.c src/libabacus.c src/tree.c src/debug.c src/parsetype.c src/reserved.c src/trie.c src/refcount.c src/ref_vec.c src/ref_trie.c src/basetype.c src/type.c src/value.c src/custom.c)
add_executable(libabacus src/main.c) add_executable(libabacus src/main.c)
add_subdirectory(external/liblex) add_subdirectory(external/liblex)

View File

@ -76,4 +76,20 @@ typedef struct libab_behavior_s libab_behavior;
typedef struct libab_operator_s libab_operator; typedef struct libab_operator_s libab_operator;
typedef struct libab_function_s libab_function; typedef struct libab_function_s libab_function;
/**
* Frees the given behavior.
* @param behavior the behavior to free.
*/
void libab_behavior_free(libab_behavior* behavior);
/**
* Frees the given operator.
* @param op the operator to free.
*/
void libab_operator_free(libab_operator* op);
/**
* Frees the given function.
* @param fun the function to free.
*/
void libab_function_free(libab_function* fun);
#endif #endif

13
src/custom.c Normal file
View File

@ -0,0 +1,13 @@
#include "custom.h"
void libab_behavior_free(libab_behavior* behavior) {
libab_parsetype_free_recursive(behavior->type);
}
void libab_operator_free(libab_operator* op) {
libab_behavior_free(&op->behavior);
}
void libab_function_free(libab_function* fun) {
libab_behavior_free(&fun->behavior);
}

View File

@ -69,8 +69,8 @@ void libab_table_free(libab_table* table) {
} }
void libab_table_entry_free(libab_table_entry* entry) { void libab_table_entry_free(libab_table_entry* entry) {
if(entry->variant == ENTRY_OP) { if(entry->variant == ENTRY_OP) {
libab_parsetype_free_recursive(entry->data_u.op.behavior.type); libab_operator_free(&entry->data_u.op);
} else if(entry->variant == ENTRY_FUN) { } else if(entry->variant == ENTRY_FUN) {
libab_parsetype_free_recursive(entry->data_u.function.behavior.type); libab_function_free(&entry->data_u.function);
} }
} }