static int fun_add (env_t * env, int args_nr, val_t * result, val_t * args) { if (TY (0) == TY_INT && TY (1) == TY_INT) { /* Integer addition */ RESULTINT = ARGINT (0) + ARGINT (1); result->ty = TY_INT; } else if (ARG_MAY_BE_AREA (0) && ARG_MAY_BE_AREA (1)) { /* Area union */ make_area (&args[0]); make_area (&args[1]); RESULTAREA = area_union (ARGAREA (0), ARGAREA (1)); ARGAREA (0) = NULL; ARGAREA (1) = NULL; result->ty = TY_AREA; } else { /* Anything else -> string concatenation */ stringify (&args[0], 1); stringify (&args[1], 1); /* Yes, we could speed this up. */ RESULTSTR = (char *) malloc (1 + strlen (ARGSTR (0)) + strlen (ARGSTR (1))); strcpy (RESULTSTR, ARGSTR (0)); strcat (RESULTSTR, ARGSTR (1)); result->ty = TY_STRING; } return 0; }
static int fun_add(dumb_ptr<env_t>, val_t *result, const_array<val_t> args) { if (ARG_TYPE(0) == TYPE::INT && ARG_TYPE(1) == TYPE::INT) { /* Integer addition */ RESULTINT = ARGINT(0) + ARGINT(1); result->ty = TYPE::INT; } else if (ARG_MAY_BE_AREA(0) && ARG_MAY_BE_AREA(1)) { /* Area union */ make_area(&args[0]); make_area(&args[1]); RESULTAREA = area_union(ARGAREA(0), ARGAREA(1)); ARGAREA(0) = NULL; ARGAREA(1) = NULL; result->ty = TYPE::AREA; } else { /* Anything else -> string concatenation */ stringify(&args[0], 1); stringify(&args[1], 1); /* Yes, we could speed this up. */ // ugh MString m; m += ARGSTR(0); m += ARGSTR(1); RESULTSTR = dumb_string::copys(FString(m)); result->ty = TYPE::STRING; } return 0; }