Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
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;
}