示例#1
0
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");
   }
}
示例#2
0
文件: main.c 项目: zhuowei/SuperCalc
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;
}
示例#3
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);
}