Esempio n. 1
0
cl_object
cl_scale_float(cl_object x, cl_object y)
{
	const cl_env_ptr the_env = ecl_process_env();
	cl_fixnum k;

	if (ECL_FIXNUMP(y)) {
		k = ecl_fixnum(y);
	} else {
		FEwrong_type_nth_arg(ecl_make_fixnum(/*SCALE-FLOAT*/737),2,y,ecl_make_fixnum(/*FIXNUM*/372));
	}
	switch (ecl_t_of(x)) {
	case t_singlefloat:
		x = ecl_make_single_float(ldexpf(ecl_single_float(x), k));
		break;
	case t_doublefloat:
		x = ecl_make_double_float(ldexp(ecl_double_float(x), k));
		break;
#ifdef ECL_LONG_FLOAT
	case t_longfloat:
		x = ecl_make_long_float(ldexpl(ecl_long_float(x), k));
		break;
#endif
	default:
                FEwrong_type_nth_arg(ecl_make_fixnum(/*SCALE-FLOAT*/737),1,x,ecl_make_fixnum(/*FLOAT*/374));
	}
	ecl_return1(the_env, x);
}
Esempio n. 2
0
static void
write_sse_double(double v, cl_object stream)
{
	if (is_all_FF(&v, sizeof(double)))
		writestr_stream(" TRUE", stream);
        else {
                ecl_write_char(' ', stream);
                si_write_ugly_object(ecl_make_double_float(v), stream);
	}
}
Esempio n. 3
0
cl_object
cl_decode_float(cl_object x)
{
	const cl_env_ptr the_env = ecl_process_env();
	int e, s;
	cl_type tx = ecl_t_of(x);
	float f;

	switch (tx) {
	case t_singlefloat: {
		f = ecl_single_float(x);
		if (f >= 0.0) {
			s = 1;
		} else {
			f = -f;
			s = 0;
		}
		f = frexpf(f, &e);
		x = ecl_make_single_float(f);
		break;
	}
	case t_doublefloat: {
		double d = ecl_double_float(x);
		if (d >= 0.0) {
			s = 1;
		} else {
			d = -d;
			s = 0;
		}
		d = frexp(d, &e);
		x = ecl_make_double_float(d);
		break;
	}
#ifdef ECL_LONG_FLOAT
	case t_longfloat: {
		long double d = ecl_long_float(x);
		if (d >= 0.0)
			s = 1;
		else {
			d = -d;
			s = 0;
		}
		d = frexpl(d, &e);
		x = ecl_make_long_float(d);
		break;
	}
#endif
	default:
                FEwrong_type_nth_arg(ecl_make_fixnum(/*DECODE-FLOAT*/275),1,x,ecl_make_fixnum(/*FLOAT*/374));
	}
	ecl_return3(the_env, x, ecl_make_fixnum(e), ecl_make_single_float(s));
}
Esempio n. 4
0
// Create a new plugin instance.
static LV2_Handle
instantiate(const LV2_Descriptor*     descriptor,
            double                    rate,
            const char*               bundle_path,
            const LV2_Feature* const* features)
{
	char *real_string = NULL;
	int lv2_desc_index;
	int lv2_handle_index;
	DescAssoc *da = NULL;
	LV2_Handle ret;


	// lookup the DescAssoc with this descripter pointer
	lv2_desc_index = da_get_index(descriptor);
	da = da_get_da(lv2_desc_index);

	printf("C: instantiate() for LV2_Desc called:\n"
		"\tlv2_desc_index = %d\n"
		"\tdescriptor = %p\n"
		"\trate = %f\n"
		"\tbundle path = %s\n"
		"\tfeatures array = %p\n", 
		lv2_desc_index, descriptor, rate, bundle_path, features);

	// Call the mirrored lisp instantiate function from the associated
	// lisp version of the lv2-descriptor. This is going to return a
	// cl_object that represents an LV2_Handle.

	// first, get the function we need to call from the right lisp lv2
	// descriptor.
	cl_object lisp_instantiate_function = 
		cl_funcall(2,
			c_string_to_object("lv2-instantiate"),
			da->lisp_lv2_desc);

	
	// Then call it, passing the usual stuff. lisp will return to us the
	// handle it wants back.
	real_string = stringify(bundle_path);
	cl_object lisp_handle =
		cl_funcall(5,
			lisp_instantiate_function,
			da->lisp_lv2_desc,
			ecl_make_double_float(rate),
			c_string_to_object(real_string),
			Cnil);
	free(real_string);

	// Associate the lisp_handle with a duck handle we're going to give to the
	// host.

	lv2_handle_index = hda_allocate();
	hda_associate(lv2_handle_index, 
		lv2_desc_index, lisp_handle);

	// Then, return the fake LV2_Handle to the host.

	ret = hda_get_address(lv2_handle_index);

	return ret;
}
Esempio n. 5
0
cl_object
ecl_make_complex(cl_object r, cl_object i)
{
	cl_object c;
	cl_type ti;
 AGAIN:
	ti = ecl_t_of(i);
	/* Both R and I are promoted to a common type */
	switch (ecl_t_of(r)) {
	case t_fixnum:
	case t_bignum:
	case t_ratio:
		switch (ti) {
		case t_fixnum:
			if (i == ecl_make_fixnum(0))
				return(r);
		case t_bignum:
		case t_ratio:
			break;
		case t_singlefloat:
			r = ecl_make_single_float((float)ecl_to_double(r));
			break;
		case t_doublefloat:
			r = ecl_make_double_float(ecl_to_double(r));
			break;
#ifdef ECL_LONG_FLOAT
		case t_longfloat:
			r = ecl_make_long_float(ecl_to_double(r));
			break;
#endif
		default:
			i = ecl_type_error(ECL_SYM("COMPLEX",241),"imaginary part", i, ECL_SYM("REAL",703));
			goto AGAIN;
		}
		break;
	case t_singlefloat:
		switch (ti) {
		case t_fixnum:
		case t_bignum:
		case t_ratio:
			i = ecl_make_single_float((float)ecl_to_double(i));
			break;
		case t_singlefloat:
			break;
		case t_doublefloat:
			r = ecl_make_double_float((double)(ecl_single_float(r)));
			break;
#ifdef ECL_LONG_FLOAT
		case t_longfloat:
			r = ecl_make_long_float((long double)ecl_single_float(r));
			break;
#endif
		default:
			i = ecl_type_error(ECL_SYM("COMPLEX",241),"imaginary part", i, ECL_SYM("REAL",703));
			goto AGAIN;
		}
		break;
	case t_doublefloat:
		switch (ti) {
		case t_fixnum:
		case t_bignum:
		case t_ratio:
		case t_singlefloat:
			i = ecl_make_double_float(ecl_to_double(i));
		case t_doublefloat:
			break;
#ifdef ECL_LONG_FLOAT
		case t_longfloat:
			r = ecl_make_long_float((long double)ecl_double_float(r));
			break;
#endif
		default:
			i = ecl_type_error(ECL_SYM("COMPLEX",241),"imaginary part", i, ECL_SYM("REAL",703));
			goto AGAIN;
		}
		break;
#ifdef ECL_LONG_FLOAT
	case t_longfloat:
		if (ti != t_longfloat)
			i = ecl_make_long_float((long double)ecl_to_double(i));
		break;
#endif
	default:
		r = ecl_type_error(ECL_SYM("COMPLEX",241),"real part", r, ECL_SYM("REAL",703));
		goto AGAIN;

	}
	c = ecl_alloc_object(t_complex);
	c->complex.real = r;
	c->complex.imag = i;
	return(c);
}
Esempio n. 6
0
cl_object cl_float(cl_narg narg, ...)
{
#line 48
// ------------------------------2
#line 48
	const cl_env_ptr the_env = ecl_process_env();
#line 48
	cl_object y;
#line 48
	va_list ARGS;
	va_start(ARGS, narg);
	cl_object x = va_arg(ARGS,cl_object);  
#line 48
// ------------------------------3

	cl_type ty, tx;
#line 51
// ------------------------------4
#line 51
#line 51
	if (ecl_unlikely(narg < 1|| narg > 2)) FEwrong_num_arguments(ecl_make_fixnum(374));
#line 51
	if (narg > 1) {
#line 51
		y = va_arg(ARGS,cl_object);  
#line 51
	} else {
#line 51
		y = OBJNULL;
#line 51
	}
#line 51
// ------------------------------5
	if (y != OBJNULL) {
		ty = ecl_t_of(y);
	} else {
		ty = t_singlefloat;
	}
	switch (tx = ecl_t_of(x)) {
	case t_singlefloat:
	case t_doublefloat:
#ifdef ECL_LONG_FLOAT
	case t_longfloat:
#endif
		if (y == OBJNULL || ty == tx)
			break;
	case t_fixnum:
	case t_bignum:
	case t_ratio:
		switch (ty) {
		case t_singlefloat:
			x = ecl_make_single_float(ecl_to_double(x)); break;
		case t_doublefloat:
			x = ecl_make_double_float(ecl_to_double(x)); break;
#ifdef ECL_LONG_FLOAT
		case t_longfloat:
			x = ecl_make_long_float(ecl_to_long_double(x)); break;
#endif
		default:
                        FEwrong_type_nth_arg(ecl_make_fixnum(/*FLOAT*/374),2,y,ecl_make_fixnum(/*FLOAT*/374));
		}
		break;
	default:
                FEwrong_type_nth_arg(ecl_make_fixnum(/*FLOAT*/374),1,x,ecl_make_fixnum(/*REAL*/703));
	}
	{
#line 83
		#line 83
		cl_object __value0 = x;
#line 83
		the_env->nvalues = 1;
#line 83
		return __value0;
#line 83
	}

}
Esempio n. 7
0
cl_object cl_float_sign(cl_narg narg, ...)
{
#line 245
// ------------------------------2
#line 245
	const cl_env_ptr the_env = ecl_process_env();
#line 245
	cl_object y;
#line 245
	bool yp;
#line 245
	va_list ARGS;
	va_start(ARGS, narg);
	cl_object x = va_arg(ARGS,cl_object);  
#line 245
// ------------------------------3

	int negativep;
#line 248
// ------------------------------4
#line 248
#line 248
	if (ecl_unlikely(narg < 1|| narg > 2)) FEwrong_num_arguments(ecl_make_fixnum(378));
#line 248
	if (narg > 1) {
#line 248
		y = va_arg(ARGS,cl_object);  
#line 248
		yp = TRUE;
#line 248
	} else {
#line 248
		y = x;
#line 248
		yp = FALSE;
#line 248
	}
#line 248
// ------------------------------5
	if (!yp) {
		y = cl_float(2, ecl_make_fixnum(1), x);
	}
	negativep = ecl_signbit(x);
	switch (ecl_t_of(y)) {
	case t_singlefloat: {
		float f = ecl_single_float(y);
                if (signbit(f) != negativep) y = ecl_make_single_float(-f);
		break;
	}
	case t_doublefloat: {
		double f = ecl_double_float(y);
                if (signbit(f) != negativep) y = ecl_make_double_float(-f);
		break;
	}
#ifdef ECL_LONG_FLOAT
	case t_longfloat: {
		long double f = ecl_long_float(y);
                if (signbit(f) != negativep) y = ecl_make_long_float(-f);
		break;
	}
#endif
	default:
                FEwrong_type_nth_arg(ecl_make_fixnum(/*FLOAT-SIGN*/378),2,y,ecl_make_fixnum(/*FLOAT*/374));
	}
	{
#line 273
		#line 273
		cl_object __value0 = y;
#line 273
		the_env->nvalues = 1;
#line 273
		return __value0;
#line 273
	}
;
}
Esempio n. 8
0
MATH_DISPATCH2_BEGIN(x,y)
{
        CASE_FIXNUM_FIXNUM;
        CASE_BIGNUM_FIXNUM {
                if (y == ecl_make_fixnum(0))
                        FEdivision_by_zero(x, y);
        }
        CASE_FIXNUM_BIGNUM;
        CASE_BIGNUM_BIGNUM {
                return ecl_make_ratio(x, y);
        }
        CASE_FIXNUM_RATIO;
        CASE_BIGNUM_RATIO {
                return ecl_make_ratio(ecl_times(x, y->ratio.den),
                                      y->ratio.num);
        }
        CASE_FIXNUM_SINGLE_FLOAT {
                return ecl_make_single_float(ecl_fixnum(x) / ecl_single_float(y));
        }
        CASE_FIXNUM_DOUBLE_FLOAT {
                return ecl_make_double_float(ecl_fixnum(x) / ecl_double_float(y));
        }
        CASE_BIGNUM_SINGLE_FLOAT;
        CASE_RATIO_SINGLE_FLOAT {
                return ecl_make_single_float(ecl_to_float(x) / ecl_single_float(y));
        }
        CASE_BIGNUM_DOUBLE_FLOAT;
        CASE_RATIO_DOUBLE_FLOAT {
                return ecl_make_double_float(ecl_to_double(x) / ecl_double_float(y));
        }
        CASE_RATIO_FIXNUM {
                if (y == ecl_make_fixnum(0)) {
                        FEdivision_by_zero(x,y);
                }
        }
        CASE_RATIO_BIGNUM {
                cl_object z = ecl_times(x->ratio.den, y);
                return ecl_make_ratio(x->ratio.num, z);
        }
        CASE_RATIO_RATIO {
                cl_object num = ecl_times(x->ratio.num,y->ratio.den);
                cl_object den = ecl_times(x->ratio.den,y->ratio.num);
                return ecl_make_ratio(num, den);
        }
        CASE_SINGLE_FLOAT_FIXNUM {
                return ecl_make_single_float(ecl_single_float(x) / ecl_fixnum(y));
        }
        CASE_SINGLE_FLOAT_BIGNUM;
        CASE_SINGLE_FLOAT_RATIO {
                return ecl_make_single_float(ecl_single_float(x) / ecl_to_float(y));
        }
        CASE_SINGLE_FLOAT_SINGLE_FLOAT {
                return ecl_make_single_float(ecl_single_float(x) / ecl_single_float(y));
        }
        CASE_SINGLE_FLOAT_DOUBLE_FLOAT {
                return ecl_make_double_float(ecl_single_float(x) / ecl_double_float(y));
        }
        CASE_DOUBLE_FLOAT_FIXNUM {
                return ecl_make_double_float(ecl_double_float(x) / ecl_fixnum(y));
        }
        CASE_DOUBLE_FLOAT_BIGNUM;
        CASE_DOUBLE_FLOAT_RATIO {
                return ecl_make_double_float(ecl_double_float(x) / ecl_to_double(y));
        }
        CASE_DOUBLE_FLOAT_SINGLE_FLOAT {
                return ecl_make_double_float(ecl_double_float(x) / ecl_single_float(y));
        }
        CASE_DOUBLE_FLOAT_DOUBLE_FLOAT {
                return ecl_make_double_float(ecl_double_float(x) / ecl_double_float(y));
        }
#ifdef ECL_LONG_FLOAT
        CASE_FIXNUM_LONG_FLOAT {
                return ecl_make_long_float(ecl_fixnum(x) / ecl_long_float(y));
        }
        CASE_BIGNUM_LONG_FLOAT;
        CASE_RATIO_LONG_FLOAT {
                return ecl_make_long_float(ecl_to_long_double(x) / ecl_long_float(y));
        }
        CASE_SINGLE_FLOAT_LONG_FLOAT {
                return ecl_make_long_float(ecl_single_float(x) / ecl_long_float(y));
        }
        CASE_DOUBLE_FLOAT_LONG_FLOAT {
                return ecl_make_long_float(ecl_double_float(x) / ecl_long_float(y));
        }
        CASE_LONG_FLOAT_FIXNUM {
                return ecl_make_long_float(ecl_long_float(x) / ecl_fixnum(y));
        }
        CASE_LONG_FLOAT_BIGNUM;
        CASE_LONG_FLOAT_RATIO {
                return ecl_make_long_float(ecl_long_float(x) / ecl_to_long_double(y));
        }
        CASE_LONG_FLOAT_SINGLE_FLOAT {
                return ecl_make_long_float(ecl_long_float(x) / ecl_single_float(y));
        }
        CASE_LONG_FLOAT_DOUBLE_FLOAT {
                return ecl_make_long_float(ecl_long_float(x) / ecl_double_float(y));
        }
        CASE_LONG_FLOAT_LONG_FLOAT {
                return ecl_make_long_float(ecl_long_float(x) / ecl_long_float(y));
        }
        CASE_LONG_FLOAT_COMPLEX {
                goto COMPLEX_Y;
        }
        CASE_COMPLEX_LONG_FLOAT;  {
                goto COMPLEX_X;
        }
#endif
        CASE_COMPLEX_FIXNUM;
        CASE_COMPLEX_BIGNUM;
        CASE_COMPLEX_RATIO;
        CASE_COMPLEX_SINGLE_FLOAT;
        CASE_COMPLEX_DOUBLE_FLOAT; COMPLEX_X: {
                return ecl_make_complex(ecl_divide(x->complex.real, y),
                                        ecl_divide(x->complex.imag, y));
        }
        CASE_BIGNUM_COMPLEX;
        CASE_RATIO_COMPLEX;
        CASE_SINGLE_FLOAT_COMPLEX;
        CASE_DOUBLE_FLOAT_COMPLEX;
        CASE_FIXNUM_COMPLEX {
        COMPLEX_Y:
                return complex_divide(x, ecl_make_fixnum(0), y->complex.real, y->complex.imag);
        }
        CASE_COMPLEX_COMPLEX {
                return complex_divide(x->complex.real, x->complex.imag,
                                      y->complex.real, y->complex.imag);
        }
        CASE_UNKNOWN(ecl_make_fixnum(/*/*/21),x,y,ecl_make_fixnum(/*NUMBER*/606));
}
Esempio n. 9
0
File: ffi.o.c Progetto: hoobaa/mecl
cl_object
ecl_foreign_data_ref_elt(void *p, enum ecl_ffi_tag tag)
{
	switch (tag) {
	case ECL_FFI_CHAR:
		return ECL_CODE_CHAR(*(char *)p);
	case ECL_FFI_UNSIGNED_CHAR:
		return ECL_CODE_CHAR(*(unsigned char *)p);
	case ECL_FFI_BYTE:
		return ecl_make_fixnum(*(int8_t *)p);
	case ECL_FFI_UNSIGNED_BYTE:
		return ecl_make_fixnum(*(uint8_t *)p);
	case ECL_FFI_SHORT:
		return ecl_make_fixnum(*(short *)p);
	case ECL_FFI_UNSIGNED_SHORT:
		return ecl_make_fixnum(*(unsigned short *)p);
	case ECL_FFI_INT:
		return ecl_make_integer(*(int *)p);
	case ECL_FFI_UNSIGNED_INT:
		return ecl_make_unsigned_integer(*(unsigned int *)p);
	case ECL_FFI_LONG:
		return ecl_make_integer(*(long *)p);
#ifdef ecl_uint8_t
        case ECL_FFI_INT8_T:
                return ecl_make_fixnum(*(ecl_int8_t *)p);
        case ECL_FFI_UINT8_T:
                return ecl_make_fixnum(*(ecl_uint8_t *)p);
#endif
#ifdef ecl_uint16_t
        case ECL_FFI_INT16_T:
                return ecl_make_int16_t(*(ecl_int16_t *)p);
        case ECL_FFI_UINT16_T:
                return ecl_make_uint16_t(*(ecl_uint16_t *)p);
#endif
#ifdef ecl_uint32_t
        case ECL_FFI_INT32_T:
                return ecl_make_int32_t(*(ecl_int32_t *)p);
        case ECL_FFI_UINT32_T:
                return ecl_make_uint32_t(*(ecl_uint32_t *)p);
#endif
#ifdef ecl_uint64_t
        case ECL_FFI_INT64_T:
                return ecl_make_int64_t(*(ecl_int64_t *)p);
        case ECL_FFI_UINT64_T:
                return ecl_make_uint64_t(*(ecl_uint64_t *)p);
#endif
#ifdef ecl_long_long_t
        case ECL_FFI_LONG_LONG:
                return ecl_make_long_long(*(ecl_long_long_t *)p);
        case ECL_FFI_UNSIGNED_LONG_LONG:
                return ecl_make_ulong_long(*(ecl_ulong_long_t *)p);
#endif
	case ECL_FFI_UNSIGNED_LONG:
		return ecl_make_unsigned_integer(*(unsigned long *)p);
	case ECL_FFI_POINTER_VOID:
		return ecl_make_foreign_data(ECL_SYM(":POINTER-VOID",1377), 0, *(void **)p);
	case ECL_FFI_CSTRING:
		return *(char **)p ?
                        ecl_make_simple_base_string(*(char **)p, -1) : ECL_NIL;
	case ECL_FFI_OBJECT:
		return *(cl_object *)p;
	case ECL_FFI_FLOAT:
		return ecl_make_single_float(*(float *)p);
	case ECL_FFI_DOUBLE:
		return ecl_make_double_float(*(double *)p);
	case ECL_FFI_VOID:
		return ECL_NIL;
        default:
                wrong_ffi_tag(tag);
	}
}