owi 0.2.0

Bindings to the C symbolic API of the owi bug finding tool
Documentation
pub mod alloc;
mod symbolic;
pub use symbolic::{LazyArray, Symbolic, SymbolicInBounds};

pub mod harness;

mod sys {
    #[link(wasm_import_module = "owi")]
    extern "C" {
        pub(super) fn bool_symbol() -> bool;
        pub(super) fn i8_symbol() -> i32;
        pub(super) fn i32_symbol() -> u32;
        pub(super) fn f32_symbol() -> f32;
        pub(super) fn i64_symbol() -> u64;
        pub(super) fn f64_symbol() -> f64;
        pub(super) fn assert(condition: bool);
        pub(super) fn assume(condition: bool);
        pub fn in_replay_mode() -> u32;
        pub fn print_char(byte: u32);
        pub fn alloc(base: *mut u8, size: u32) -> *mut u8;
        pub fn dealloc(base: *mut u8) -> *mut u8;
        pub fn abort() -> !;
    }
}

pub fn assert(b: bool) {
    unsafe { sys::assert(b) }
}

pub fn assume(b: bool) {
    unsafe { sys::assume(b) }
}

pub(crate) fn in_replay_mode() -> bool {
    unsafe { sys::in_replay_mode() == 1 }
}

pub fn write_to_stdout(s: &[u8]) {
    s.iter().copied().for_each(|b| unsafe {
        sys::print_char(b as u32);
    });
}

pub fn stop_exploration() -> ! {
    unsafe {
        sys::abort();
    }
}

pub fn ascii_char() -> char {
    let code = u8::symbol_in(..=127);
    unsafe { char::from_u32_unchecked(code as u32) }
}