ddbug 0.5.0

Display debugging information
Documentation
fn diff(name: &str, expect: &str) {
    let mut options = options();
    options.unit("src/diff.c").name(name);
    let mut diff = Vec::new();
    let output_1 = ddbug::File::parse("tests/bin/diff1".into()).unwrap();
    let output_2 = ddbug::File::parse("tests/bin/diff2".into()).unwrap();
    let mut printer = ddbug::TextPrinter::new(&mut diff, &options);
    ddbug::diff(&mut printer, output_1.file(), output_2.file(), &options).unwrap();
    let diff = String::from_utf8(diff).unwrap();
    if !equal(&diff, expect) {
        println!("\nDiff:");
        println!("{diff}");
        println!("Expected:");
        println!("{expect}");
        assert_eq!(diff, expect);
    }
}

fn options() -> ddbug::Options {
    ddbug::Options {
        print_function_variables: true,
        inline_depth: 1,

        category_unit: false,
        category_type: true,
        category_function: true,
        category_variable: true,

        filter_name: None,
        filter_namespace: Vec::new(),
        filter_unit: None,

        sort: ddbug::Sort::None,

        ignore_function_address: true,
        ignore_variable_address: true,
        ..Default::default()
    }
}

fn equal(mut diff: &str, expect: &str) -> bool {
    let mut expects = expect.split("[..]");
    if let Some(e) = expects.next() {
        if !diff.starts_with(e) {
            return false;
        }
        diff = &diff[e.len()..];
    }
    for e in expects {
        loop {
            if diff.starts_with(e) {
                diff = &diff[e.len()..];
                break;
            }
            if diff.is_empty() {
                return false;
            }
            diff = &diff[1..];
        }
    }
    diff.is_empty()
}

macro_rules! test {
    ($name:ident, $($val:expr),*) => {
        #[test]
        fn $name() {
            let expect = concat!($($val),*);
            diff(stringify!($name), expect);
        }
    }
}

include!("src/diff.rs");