cardinal-c 0.1.1

A C target for the Cardinal code generator.
Documentation
extern crate cardinal_c;
extern crate cardinal_codegen;

use cardinal_c::CBackend;
use cardinal_codegen::entities::{AbiParam, AbiType, Named, Type};
use cardinal_codegen::function::{Function, FunctionSignature};
use cardinal_codegen::instbuilder::InstBuilder;
use cardinal_codegen::Module;

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    pub fn test_function() {
        let mut m = Module::new();

        let sig = FunctionSignature::new();
        let mut func = Function::new("main".into(), sig);

        let v = func.declare_var("my_var".into(), AbiType("int".into(), Type::Plain));
        
        let block0;
        {
            let block = func.create_block();
            block0 = func.use_block(block);
        }

        block0.require_import("stdio.h".into());

        {
            let tmp0 = block0.iconst_int(21);
            let tmp1 = block0.iconst_int(21);
            let tmp2 = block0.iadd(tmp0, tmp1);

            let tmp3 = block0.iuse(v.named());
            block0.set(tmp3, tmp2);
        }

        {
            let tmp0 = Named::new("printf".into());
            let tmp1 = block0.iuse(tmp0);
            let tmp2 = block0.iuse(v.named());

            let str = block0.iconst_str("%d".into());

            block0.call(tmp1, vec![str, tmp2]);
        }

        m.define_function(func);

        let mut gen = CBackend::new(m);
        println!("{}", gen.emit());
    }

}