extern "C" int Channel9_environment_initialize(Channel9::Environment *env, const std::string &boot_path) { FFIDefinition *args = new FFIDefinition("Puts Arguments"); args->add_pointer(); FFICall *puts_call = new FFICall("puts", ffi_fn(puts), &ffi_type_sint, args); env->set_special_channel("ffi_puts", Channel9::value(puts_call)); env->set_special_channel("hello_test_channel", Channel9::value(test_channel)); return 0; }
void send(Environment *env, const Value &val, const Value &ret) { if (is(val, MESSAGE)) { Message *msg = ptr<Message>(val); if (msg->arg_count() >= 2) { FFIDefinition *types = new FFIDefinition("sprintf args"); types->add_pointer(m_string_holder); // output pointer types->add_pointer(); // format string Message::const_iterator it; for (it = msg->args()+2; it != msg->args_end(); it++) { switch (type(*it)) { case POSITIVE_NUMBER: case NEGATIVE_NUMBER: types->add(&ffi_type_sint); break; case FLOAT_NUM: types->add(&ffi_type_double); break; case NIL: case UNDEF: case STRING: types->add_pointer(); break; case BFALSE: case BTRUE: types->add(&ffi_type_uint); break; default: throw std::runtime_error("Invalid input given to sprintf"); } } FFICall *sprintf_call = new FFICall("asprintf", ffi_fn(asprintf), &ffi_type_sint, types); sprintf_call->send(env, value(msg), ret); return; } } channel_send(env, ret, val, value(&no_return_ctx)); }