Ejemplo n.º 1
0
// Make sure this doesn't get called before 'cl_boot'
int lisp_add(int x, int y)
{
  cl_object sum = cl_funcall(3, c_string_to_object("add"), ecl_make_int(x), ecl_make_int(y));
  return ecl_to_int(sum);
}
Ejemplo n.º 2
0
Archivo: ffi.o.c Proyecto: hoobaa/mecl
void
ecl_foreign_data_set_elt(void *p, enum ecl_ffi_tag tag, cl_object value)
{
	switch (tag) {
	case ECL_FFI_CHAR:
		*(char *)p = (char)ecl_base_char_code(value);
		break;
	case ECL_FFI_UNSIGNED_CHAR:
		*(unsigned char*)p = (unsigned char)ecl_base_char_code(value);
		break;
	case ECL_FFI_BYTE:
		*(int8_t *)p = ecl_to_int8_t(value);
		break;
	case ECL_FFI_UNSIGNED_BYTE:
		*(uint8_t *)p = ecl_to_uint8_t(value);
		break;
	case ECL_FFI_SHORT:
		*(short *)p = ecl_to_short(value);
		break;
	case ECL_FFI_UNSIGNED_SHORT:
		*(unsigned short *)p = ecl_to_ushort(value);
		break;
	case ECL_FFI_INT:
		*(int *)p = ecl_to_int(value);
		break;
	case ECL_FFI_UNSIGNED_INT:
		*(unsigned int *)p = ecl_to_uint(value);
		break;
	case ECL_FFI_LONG:
		*(long *)p = ecl_to_long(value);
		break;
	case ECL_FFI_UNSIGNED_LONG:
		*(unsigned long *)p = ecl_to_ulong(value);
		break;
        case ECL_FFI_INT8_T:
                *(ecl_int8_t *)p = ecl_to_int8_t(value);
                break;
        case ECL_FFI_UINT8_T:
                *(ecl_uint8_t *)p = ecl_to_uint8_t(value);
                break;
#ifdef ecl_uint16_t
        case ECL_FFI_INT16_T:
                *(ecl_int16_t *)p = ecl_to_int16_t(value);
                break;
        case ECL_FFI_UINT16_T:
                *(ecl_uint16_t *)p = ecl_to_uint16_t(value);
                break;
#endif
#ifdef ecl_uint32_t
        case ECL_FFI_INT32_T:
                *(ecl_int32_t *)p = ecl_to_int32_t(value);
                break;
        case ECL_FFI_UINT32_T:
                *(ecl_uint32_t *)p = ecl_to_uint32_t(value);
                break;
#endif
#ifdef ecl_uint64_t
        case ECL_FFI_INT64_T:
                *(ecl_int64_t *)p = ecl_to_int64_t(value);
                break;
        case ECL_FFI_UINT64_T:
                *(ecl_uint64_t *)p = ecl_to_uint64_t(value);
                break;
#endif
#ifdef ecl_long_long_t
        case ECL_FFI_LONG_LONG:
                *(ecl_long_long_t *)p = ecl_to_long_long(value);
                break;
        case ECL_FFI_UNSIGNED_LONG_LONG:
                *(ecl_ulong_long_t *)p = ecl_to_ulong_long(value);
                break;
#endif
	case ECL_FFI_POINTER_VOID:
		*(void **)p = ecl_foreign_data_pointer_safe(value);
		break;
	case ECL_FFI_CSTRING:
		*(char **)p = value == ECL_NIL ? NULL : (char*)value->base_string.self;
		break;
	case ECL_FFI_OBJECT:
		*(cl_object *)p = value;
		break;
	case ECL_FFI_FLOAT:
		*(float *)p = ecl_to_float(value);
		break;
	case ECL_FFI_DOUBLE:
		*(double *)p = ecl_to_double(value);
		break;
	case ECL_FFI_VOID:
		break;
        default:
                wrong_ffi_tag(tag);
	}
}