brain-rs 0.1.0

Embeddable brainfuck interpreter
Documentation
extern crate clap;
extern crate brain;

use clap::{App, Arg};
use brain::{Compiler, Machine, ByteCode};

use std::io::{self, Read};
use std::fs::File;

const ERROR: &'static str = "[Error]";

fn main() {
    let inp = io::stdin();
    let out = io::stdout();

    let matches = App::new("brain")
        .arg(Arg::with_name("file")
            .takes_value(true)
            .short("f")
            .long("file")
            .required(true)
        ).arg(Arg::with_name("bytecode")
            .short("b")
            .long("bytecode")
        ).get_matches();

    let file_name = match matches.value_of("file") {
        Some(v) => v,
        None => {
            println!("{} Source file needed.", ERROR);
            return
        },
    };

    let mut file = match File::open(file_name) {
        Ok(f) => f,
        Err(_) => {
            println!("{} Source file needed.", ERROR);
            return
        },
    };

    let mut code = String::new();
    match file.read_to_string(&mut code) {
        Ok(_) => { },
        Err(_) => {
            println!("{} Source file not found.", ERROR);
            return
        },
    }

    let mut cmp = Compiler::new(&code);
    let instructions = cmp.compile();
    if matches.is_present("bytecode") {
        let bytecode = ByteCode::generate_bytecode(instructions);
        println!("{}", bytecode);
    } else {
        let mut machine = Machine::new(instructions, inp, out);
        match machine.execute() {
            Ok(_) => {},
            Err(e) => {
                println!("{} {}", ERROR, e);
                return
            }
        }
    }
}