// 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); }
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); } }