diff --git a/lib/emscripten/src/io/mod.rs b/lib/emscripten/src/io/mod.rs new file mode 100644 index 00000000000..aea5e6fc28d --- /dev/null +++ b/lib/emscripten/src/io/mod.rs @@ -0,0 +1,11 @@ +#[cfg(unix)] +mod unix; + +#[cfg(windows)] +mod windows; + +#[cfg(unix)] +pub use self::unix::*; + +#[cfg(windows)] +pub use self::windows::*; diff --git a/lib/emscripten/src/io.rs b/lib/emscripten/src/io/unix.rs similarity index 100% rename from lib/emscripten/src/io.rs rename to lib/emscripten/src/io/unix.rs diff --git a/lib/emscripten/src/io/windows.rs b/lib/emscripten/src/io/windows.rs new file mode 100644 index 00000000000..834de69f638 --- /dev/null +++ b/lib/emscripten/src/io/windows.rs @@ -0,0 +1,29 @@ +use libc::{c_char, c_int}; +use wasmer_runtime_core::vm::Ctx; + +// This may be problematic for msvc which uses inline functions for the printf family +// this cfg_attr will try to link with the legacy lib that does not inline printf +// this will allow for compiliation, but will produce a linker error if there is a problem +// finding printf. +#[cfg_attr( + all(windows, target_env = "msvc"), + link(name = "legacy_stdio_definitions", kind = "static-nobundle") +)] +extern "C" { + #[link_name = "printf"] + pub fn _printf(s: *const c_char, ...) -> c_int; +} + +/// putchar +pub fn putchar(chr: i32, ctx: &mut Ctx) { + unsafe { libc::putchar(chr) }; +} + +/// printf +pub fn printf(memory_offset: i32, extra: i32, ctx: &mut Ctx) -> i32 { + debug!("emscripten::printf {}, {}", memory_offset, extra); + unsafe { + let addr = emscripten_memory_pointer!(ctx.memory(0), memory_offset) as _; + _printf(addr, extra) + } +}