diff --git a/eeshow/kicad/sexpr.c b/eeshow/kicad/sexpr.c index 373b757..d24aa2a 100644 --- a/eeshow/kicad/sexpr.c +++ b/eeshow/kicad/sexpr.c @@ -312,24 +312,30 @@ struct sexpr_ctx *sexpr_new(void) /* ----- Termination ------------------------------------------------------- */ +void sexpr_abort(struct sexpr_ctx *ctx) +{ + free_stack(ctx); + free_expr(ctx->e); + free(ctx); +} + + bool sexpr_finish(struct sexpr_ctx *ctx, struct expr **res) { if (ctx->sp != &ctx->stack) { error("not enough )\n"); ctx->state = failed; - free_stack(ctx); } if (ctx->state != idle && ctx->state != failed) error("invalid end state %d\n", ctx->state); - if (ctx->state == idle) { - if (res) - *res = ctx->e; - else - free_expr(ctx->e); - free(ctx); - return 1; + if (ctx->state != idle) { + sexpr_abort(ctx); + return 0; } - free_expr(ctx->e); + if (res) + *res = ctx->e; + else + free_expr(ctx->e); free(ctx); - return 0; + return 1; } diff --git a/eeshow/kicad/sexpr.h b/eeshow/kicad/sexpr.h index 8c47f28..1e9e8a2 100644 --- a/eeshow/kicad/sexpr.h +++ b/eeshow/kicad/sexpr.h @@ -42,6 +42,7 @@ void free_expr(struct expr *e); struct sexpr_ctx *sexpr_new(void); bool sexpr_parse(struct sexpr_ctx *ctx, const char *s); +void sexpr_abort(struct sexpr_ctx *ctx); bool sexpr_finish(struct sexpr_ctx *ctx, struct expr **res); #endif /* !KICAD_SEXPR_H */