Beispiel #1
0
fs_value fn_numeric_abs(fs_query *q, fs_value a)
{
    if (!fs_is_numeric(&a)) {
        return fs_value_error(FS_ERROR_INVALID_TYPE, "non-numeric arguments to fn:abs");
    }

    if (a.attr == fs_c.xsd_double || a.attr == fs_c.xsd_float) {
        a.fp = fabs(a.fp);
    } else if (a.attr == fs_c.xsd_decimal) {
        if (fs_decimal_less_than(&a.de, fs_decimal_zero)) {
            fs_decimal_negate(&a.de, &a.de);
        }
    } else if (a.attr == fs_c.xsd_integer) {
        if (a.in < 0) {
            a.in = -a.in;
        }
    } else {
        return fs_value_error(FS_ERROR_INVALID_TYPE, "bad arguments to fn:abs");
    }

    if (a.lex != NULL) {
        a.lex = NULL;
    }

    return a;
}
Beispiel #2
0
int fs_decimal_subtract(const fs_decimal *a, const fs_decimal *b, fs_decimal *r)
{
    fs_decimal intl;

    fs_decimal_negate(b, &intl);

    return fs_decimal_add(a, &intl, r);
}
Beispiel #3
0
fs_value fn_minus(fs_query *q, fs_value a)
{
    if (fs_is_numeric(&a)) {
	if (a.attr == fs_c.xsd_double || a.attr == fs_c.xsd_float) {
	    a.fp = -a.fp;
	} else if (a.attr == fs_c.xsd_decimal) {
            fs_decimal_negate(&a.de, &a.de);
	} else if (a.attr == fs_c.xsd_integer) {
	    a.in = -a.in;
	} else {
	    return fs_value_error(FS_ERROR_INVALID_TYPE, "bad arguments to fn:minus");
	}

	return a;
    }

    return fs_value_error(FS_ERROR_INVALID_TYPE, "non-numeric arguments to fn:minus");
}