Value * IfElseFn (const char *name, State * state, int argc, Expr * argv[]) { if (argc != 2 && argc != 3) { free (state->errmsg); state->errmsg = strdup ("ifelse expects 2 or 3 arguments"); return NULL; } char *cond = Evaluate (state, argv[0]); if (cond == NULL) { return NULL; } if (BooleanString (cond) == true) { free (cond); return EvaluateValue (state, argv[1]); } else { if (argc == 3) { free (cond); return EvaluateValue (state, argv[2]); } else { return StringValue (cond); } } }
Value * SequenceFn (const char *name, State * state, int argc, Expr * argv[]) { Value *left = EvaluateValue (state, argv[0]); if (left == NULL) return NULL; FreeValue (left); return EvaluateValue (state, argv[1]); }
// Evaluate the expressions in argv, giving 'count' Value* (the ... is // zero or more Value** to put them in). If any expression evaluates // to NULL, free the rest and return -1. Return 0 on success. int ReadValueArgs (State * state, Expr * argv[], int count, ...) { Value **args = malloc (count * sizeof (Value *)); va_list v; va_start (v, count); int i; for (i = 0; i < count; ++i) { args[i] = EvaluateValue (state, argv[i]); if (args[i] == NULL) { va_end (v); int j; for (j = 0; j < i; ++j) { FreeValue (args[j]); } free (args); return -1; } *(va_arg (v, Value **)) = args[i]; } va_end (v); free (args); return 0; }
Value* LogicalOrFn(const char* name, State* state, int argc, Expr* argv[]) { char* left = Evaluate(state, argv[0]); if (left == NULL) return NULL; if (BooleanString(left) == false) { free(left); return EvaluateValue(state, argv[1]); } else { return StringValue(left); } }
/* * Evaluate *-------------------------------------------------- * Pre: * Post: *-------------------------------------------------- */ void Hand::Evaluate(){ sort(hand.begin(), hand.end(), CardComparer()); EvaluateType(); EvaluateValue(); }