#! /bin/bash

selinux_lib_dir=$1
selinux_exec_name=$2
selinux_gen_dir=$3

function exec_check_md5() {
    local output_file="$1"
    local input_file="$2"
    local md5_file="$3"
    local tool="$4"

    echo "exec_check_md5 $output_file $input_file $md5_file using $tool"
    check_config_result=$(bash "$selinux_lib_dir/check_md5.sh" "$output_file" "$input_file" "$md5_file")

    if [[ -n "$check_config_result" ]]; then
        if [[ "$tool" == "flex" ]]; then
            flex -o "$output_file" "$input_file"
        elif [[ "$tool" == "bison" ]]; then
            bison -y -d "$input_file" -o "$output_file"
        fi
    fi
}

libsepol="libsepol"
checkpolicy="checkpolicy"

case "$selinux_exec_name" in
    "$libsepol")
        exec_check_md5 "$selinux_gen_dir/libsepol/cil/src/cil_lexer.c" \
                       "$selinux_lib_dir/libsepol/cil/src/cil_lexer.l" \
                       "$selinux_lib_dir/libsepol/cil/src/cil_lexer.md5" \
                       "flex"
        ;;
    "$checkpolicy")
        exec_check_md5 "$selinux_gen_dir/checkpolicy/y.tab.c" \
                       "$selinux_lib_dir/checkpolicy/policy_parse.y" \
                       "$selinux_lib_dir/checkpolicy/y.tab.md5" \
                       "bison"

        exec_check_md5 "$selinux_gen_dir/checkpolicy/policy_scan.c" \
                       "$selinux_lib_dir/checkpolicy/policy_scan.l" \
                       "$selinux_lib_dir/checkpolicy/policy_scan.md5" \
                       "flex"
        ;;
    *)
        echo "Unknown exec_name: $selinux_exec_name"
        ;;
esac