ValueStruct doRealDiv(ValueStruct v1, ValueStruct v2, nodep t) { /* * Propagate null value if either is operand is null. */ if ((v1 == null) or (v2 == null)) return null; /* * Handled the overload for real or integer operands. */ switch (v1->tag) { case RealTag: if (v2->tag == IntTag) { if (v2->val.IntVal == 0) { free(v2); lerror(t, "Divide by zero.\n"); return null; } v1->val.RealVal = v1->val.RealVal / v2->val.IntVal; } else { if (v2->val.RealVal == 0) { free(v2); lerror(t, "Divide by zero.\n"); } v1->val.RealVal = v1->val.RealVal / v2->val.RealVal; } free(v2); return v1; case IntTag: if (v2->tag == RealTag) { if (v2->val.RealVal == 0) { free(v2); lerror(t, "Divide by zero.\n"); return null; } v1->val.RealVal = v1->val.IntVal / v2->val.RealVal; v1->tag = RealTag; } else { if (v2->val.IntVal == 0) { free(v2); lerror(t, "Divide by zero.\n"); return null; } v1->val.IntVal = v1->val.IntVal / v2->val.IntVal; } free(v2); return v1; } }