bfc 1.7.0

An industrial-grade brainfuck compiler
#!/bin/bash

BLACK=$(tput setaf 0)
BLUE=$(tput setaf 1)
GREEN=$(tput setaf 2)
CYAN=$(tput setaf 3)
RED=$(tput setaf 4)
MAGENTA=$(tput setaf 5)
YELLOW=$(tput setaf 6)
WHITE=$(tput setaf 7)

BOLD=$(tput bold)
RESET=$(tput sgr0)

function summary {
    echo -e "$BOLD$GREEN==>$WHITE ${1}$RESET"
}

failed=0

function compile_and_run {
    local test_program=$1

    # Compile the file.
    ./target/release/bfc sample_programs/$test_program
    if [[ $? -ne 0 ]]; then
        echo "Compilation failed!"
        failed=1
        return
    fi

    # Run it, saving output.
    local executable="${test_program%.*}"
    local input=sample_programs/${test_program}.in

    if [ -f $input ]; then
        ./$executable < $input > output.txt
    else
        ./$executable > output.txt
    fi
    if [[ $? -ne 0 ]]; then
        echo "Program crashed!"
        failed=1
        return
    fi

    # Compare output.
    local expected_output=sample_programs/${test_program}.out
    if [ -f $expected_output ]; then
        diff output.txt $expected_output > /dev/null
        if [[ $? -ne 0 ]]; then
            echo "Output differs!"
            failed=1
            return
        fi
    fi
}

function check_program {
    summary "Testing $1"
    compile_and_run $1

    # Cleanup.
    rm -f ${1%.*} output.txt
}

check_program bangbang.bf
check_program hello_world.bf
check_program bottles.bf
check_program factor.bf
check_program mandelbrot.bf
check_program life.bf

exit $failed