static void Term_free(ExprTerm term) { switch (term.t) { case TERM_ID: free(term.id); break; case TERM_LITERAL: Literal_free(term.val); break; case TERM_NULL: break; case TERM_COLREF: if (term.ref->tableName) free(term.ref->tableName); free(term.ref->columnName); break; case TERM_FUNC: switch (term.f.t) { case FUNC_AVG: Expression_free(term.f.expr); break; case FUNC_COUNT: Expression_free(term.f.expr); break; case FUNC_MAX: Expression_free(term.f.expr); break; case FUNC_MIN: Expression_free(term.f.expr); break; case FUNC_SUM: Expression_free(term.f.expr); break; default: printf("Can't delete unknown function\n"); } default: printf("Can't delete, unknown term type"); } }
int main(int argc, char* argv[]) { Context* ctx = Context_new(); register_math(ctx); for(nextLine(); !feof(stdin); nextLine()) { /* Strip trailing newline */ char* end; if((end = strchr(line, '\n')) != NULL) *end = '\0'; if((end = strchr(line, '\r')) != NULL) *end = '\0'; if((end = strchr(line, '#')) != NULL) *end = '\0'; const char* p = line; /* Get verbosity level */ int verbose = 0; while(p[0] == '?') { verbose++; p++; } trimSpaces(&p); if(*p == '~') { /* Variable deletion */ p++; char* name = nextToken(&p); if(name == NULL) { /* '~~~' means reset interpreter */ if(p[0] == '~' && p[1] == '~') { /* Wipe out context */ Context_free(ctx); ctx = Context_new(); register_math(ctx); continue; } if(*p == '\0') { RAISE(earlyEnd()); continue; } RAISE(badChar(*p)); continue; } Context_del(ctx, name); free(name); continue; } /* Parse the user's input */ Expression* expr = Expression_parse(&p); /* Print expression depending on verbosity */ Expression_print(expr, ctx, verbose); /* Error? Go to next loop iteration */ if(Expression_didError(expr)) { Expression_free(expr); continue; } /* Evaluate expression */ Value* result = Expression_eval(expr, ctx); Expression_free(expr); /* Print result */ Value_print(result, ctx); Value_free(result); } Context_free(ctx); return 0; }
void Expression_free(Expression_t *expr) { switch (expr->t) { case EXPR_CONCAT: Expression_free(expr->expr.binary.expr1); Expression_free(expr->expr.binary.expr2); break; case EXPR_PLUS: Expression_free(expr->expr.binary.expr1); Expression_free(expr->expr.binary.expr2); break; case EXPR_MINUS: Expression_free(expr->expr.binary.expr1); Expression_free(expr->expr.binary.expr2); break; case EXPR_MULTIPLY: Expression_free(expr->expr.binary.expr1); Expression_free(expr->expr.binary.expr2); break; case EXPR_DIVIDE: Expression_free(expr->expr.binary.expr1); Expression_free(expr->expr.binary.expr2); break; case EXPR_NEG: Expression_free(expr->expr.unary.expr); break; case EXPR_TERM: Term_free(expr->expr.term); break; default: printf("Can't delete unknown expression type '%d')", expr->t); } if (expr->alias) free(expr->alias); free(expr); }