#!/bin/sh

execute_binary() {
  binary="$1"
  input="$2"
  output="$3"
  is_debug="$4"

  start=$(date '+%s.%N')
  if [ -n "$is_debug" ]; then
    asan="$(ldconfig -p | grep libasan.so | head -n1 | awk '{print $4}')"
    LD_PRELOAD="$asan" timeout 2s ./"$binary" <"$input" >"$output" 2>&1
  else
    timeout 2s ./"$binary" <"$input" >"$output" 2>&1
  fi
  CODE=$?
  end=$(date '+%s.%N')
  truncate -s "$(head -n 1000 "$output" | wc -c)" "$output"

  if [ $CODE -ge 124 ]; then
    MSG=''
    case $CODE in
    124) MSG='TIMEOUT' ;;
    128) MSG='SIGILL' ;;
    130) MSG='SIGABRT' ;;
    131) MSG='SIGBUS' ;;
    136) MSG='SIGFPE' ;;
    135) MSG='SIGSEGV' ;;
    137) MSG='SIGPIPE' ;;
    139) MSG='SIGTERM' ;;
    esac
    [ $CODE -ne 124 ] && sed -i '$d' "$output"
    test -n "$MSG" && printf '\n[code]: %s (%s)' "$CODE" "$MSG" >>"$output"
  else
    printf '\n[code]: %s' "$CODE" >>"$output"
  fi

  printf '\n[time]: %s ms' "$(awk "BEGIN {print ($end - $start) * 1000}")" >>$output
  test -n "$is_debug" && is_debug_string=true || is_debug_string=false
  printf '\n[debug]: %s' "$is_debug_string" >>$output
  return $CODE
}

compile_source() {
  src="$1"
  bin="$2"
  output="$3"
  flags="$4"

  test -f "$bin" && rm "$bin" || true
  g++ @compile_flags.txt $flags "$src" -o "$bin" 2>"$output"
  CODE=$?

  if [ $CODE -gt 0 ]; then
    printf '\n[code]: %s' "$CODE" >>"$output"
    return $CODE
  else
    echo '' >"$output"
    return 0
  fi
}
