fix: lexer_context is now freed on errors
This commit is contained in:
parent
64e3fb26c3
commit
d95b0fd220
3 changed files with 16 additions and 16 deletions
|
|
@ -257,16 +257,15 @@ struct token *new_token(char *begin, ssize_t size, struct token_info *info)
|
||||||
return tok;
|
return tok;
|
||||||
}
|
}
|
||||||
|
|
||||||
void destroy_lexer_context(struct lexer_context **ctx)
|
void destroy_lexer_context(struct lexer_context *ctx)
|
||||||
{
|
{
|
||||||
if (ctx == NULL || *ctx == NULL)
|
if (ctx == NULL)
|
||||||
return;
|
return;
|
||||||
if ((*ctx)->previous_token != NULL)
|
if (ctx->previous_token != NULL)
|
||||||
free((*ctx)->previous_token);
|
free(ctx->previous_token);
|
||||||
if ((*ctx)->current_token != NULL)
|
if (ctx->current_token != NULL)
|
||||||
free((*ctx)->current_token);
|
free(ctx->current_token);
|
||||||
free(*ctx);
|
free(ctx);
|
||||||
*ctx = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void free_token(struct token **tok)
|
void free_token(struct token **tok)
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ struct lexer_context
|
||||||
|
|
||||||
/* @brief: frees all fields of ctx and sets ctx to NULL.
|
/* @brief: frees all fields of ctx and sets ctx to NULL.
|
||||||
*/
|
*/
|
||||||
void destroy_lexer_context(struct lexer_context **ctx);
|
void destroy_lexer_context(struct lexer_context *ctx);
|
||||||
|
|
||||||
enum lexing_mode
|
enum lexing_mode
|
||||||
{
|
{
|
||||||
|
|
|
||||||
15
src/main.c
15
src/main.c
|
|
@ -21,9 +21,10 @@
|
||||||
/* @brief: frees the hash map.
|
/* @brief: frees the hash map.
|
||||||
* @return: always ERR_INPUT_PROCESSING.
|
* @return: always ERR_INPUT_PROCESSING.
|
||||||
*/
|
*/
|
||||||
static int err_input(struct hash_map **vars)
|
static int err_input(struct hash_map **vars, struct lexer_context *ctx)
|
||||||
{
|
{
|
||||||
hash_map_free(vars);
|
hash_map_free(vars);
|
||||||
|
destroy_lexer_context(ctx);
|
||||||
return ERR_INPUT_PROCESSING;
|
return ERR_INPUT_PROCESSING;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -64,7 +65,7 @@ static int main_loop(struct lexer_context *ctx, struct args_options *options,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (command_ast == NULL)
|
if (command_ast == NULL)
|
||||||
return err_input(&vars);
|
return err_input(&vars, ctx);
|
||||||
|
|
||||||
// === free
|
// === free
|
||||||
|
|
||||||
|
|
@ -90,7 +91,7 @@ int main(int argc, char **argv)
|
||||||
if (return_code != 0)
|
if (return_code != 0)
|
||||||
{
|
{
|
||||||
print_usage(stderr, argv[0]);
|
print_usage(stderr, argv[0]);
|
||||||
return err_input(&vars);
|
return err_input(&vars, NULL);
|
||||||
}
|
}
|
||||||
// args_print(&options);
|
// args_print(&options);
|
||||||
|
|
||||||
|
|
@ -105,7 +106,7 @@ int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Error: Failed to configure IO Backend from arguments\n");
|
"Error: Failed to configure IO Backend from arguments\n");
|
||||||
return err_input(&vars);
|
return err_input(&vars, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Init IO Backend (with the context struct)
|
// Init IO Backend (with the context struct)
|
||||||
|
|
@ -115,13 +116,13 @@ int main(int argc, char **argv)
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Error: IO Backend initialization failed with code %d\n",
|
"Error: IO Backend initialization failed with code %d\n",
|
||||||
return_code);
|
return_code);
|
||||||
return err_input(&vars);
|
return err_input(&vars, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// init lexer context
|
// init lexer context
|
||||||
struct lexer_context ctx = { 0 };
|
struct lexer_context *ctx = calloc(1, sizeof(struct lexer_context));
|
||||||
|
|
||||||
return_code = main_loop(&ctx, &options, vars);
|
return_code = main_loop(ctx, &options, vars);
|
||||||
|
|
||||||
return return_code;
|
return return_code;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue