int ecl_boot(const char *root_dir) { int argc = 1; char *argv[256]; argv[0] = "ecl"; GC_allow_register_threads(); GC_register_my_thread((const struct GC_stack_base *)argv); GC_stackbottom = (void*)(argv+255); setenv("ECLDIR", "", 1); cl_boot(argc, argv); main_lib_ECL_HELP(); main_lib_ASDF(); main_lib_SOCKETS(); main_lib_IPHONEPSYSTEM(); si_select_package(ecl_make_simple_base_string("CL-USER", 7)); char tmp[2048]; sprintf(tmp, "(setq *default-pathnames-defaults* #p\"%s\")", root_dir); si_safe_eval(3, c_string_to_object(tmp), Cnil, OBJNULL); init_callbacks_registry(); ecl_toplevel(root_dir); return 0; }
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); } }