#!/usr/bin/env bash
#
# Zephir Parser
#
# Copyright (c) 2013-2017 Zephir Team and contributors
#
# This source file is subject the MIT license, that is bundled with
# this package in the file LICENSE, and is available through the
# world-wide-web at the following url:
# http://zephir-lang.com/license.html
#
# If you did not receive a copy of the MIT license and are unable
# to obtain it through the world-wide-web, please send a note to
# license@zephir-lang.com so we can mail you a copy immediately.

#  Available params:
#  --phpize
#  --php-config
#
#  Example:
#  ./install-development --phpize /usr/bin/phpize5.6 --php-config /usr/bin/php-config5.6

export ZEND_DONT_UNLOAD_MODULES=1
export USE_ZEND_ALLOC=0

CURRENT_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
PARSER_DIR=${CURRENT_DIR}/parser

CC=${CC:-}

GCC_BIN=$(command -v gcc 2>/dev/null)
CLANG_BIN=$(command -v clang 2>/dev/null)
RE2C_BIN=$(command -v re2c 2>/dev/null)
PHPIZE_BIN=$(command -v phpize 2>/dev/null)
PHPCONFIG_BIN=$(command -v php-config 2>/dev/null)

if [ x"$RE2C_BIN" = x ]; then
  echo -e "error: unable to locate the re2c"
  exit 2
fi

if [ x"$CC" == x ]; then
	if [ x"$GCC_BIN" != x ]; then
		export CC="gcc"
	else
		if [ x"$CLANG_BIN" != x ]; then
			export CC="clang"
		fi
	fi
fi

if [ x"$CC" == x ]; then
	echo -e "error: unable to locate the compiler"
	exit 1
fi

export CFLAGS="-g3 -O0 -Wall -Werror -fvisibility=hidden"

if [ x"$CC" == xclang ]; then
	export CFLAGS="${CFLAGS} -fcolor-diagnostics"
fi

# Translate long options to short
for arg in "$@"; do
  shift
  case "$arg" in
    "--phpize") set -- "$@" "-i" ;;
    "--php-config") set -- "$@" "-c" ;;
    *) set -- "$@" "$arg"
  esac
done

# Options switcher
while getopts a:i:c: opts; do
   case ${opts} in
      i) PHPIZE_BIN=${OPTARG} ;;
      c) PHPCONFIG_BIN=${OPTARG} ;;
   esac
done

if [ x"$PHPIZE_BIN" = x ]; then
  echo -e "error: unable to locate the phpize"
  exit 1
fi

if [ x"$PHPCONFIG_BIN" = x ]; then
  echo -e "error: unable to locate the php-config"
  exit 1
fi

PHP_FULL_VERSION=`${PHPCONFIG_BIN} --version`

if [ $? != 0 ]; then
	echo "php-config is not installed"
	exit 1
fi

if [ "${PHP_FULL_VERSION:0:3}" == "5.3" ]; then
	echo "php 5.3 is no longer supported"
	exit 1
fi

cd ${PARSER_DIR}

# Cleanup
rm -f \
	*.o \
	*.lo \
	lemon \
	scanner.c \
	parser.c \
	parser.php5.c \
	parser.php5.h \
	parser.php5.out \
	parser.php7.c \
	parser.php7.h \
	parser.php7.out

${RE2C_BIN} -o scanner.c scanner.re

# Compile lemon
${CC} lemon.c -o lemon

if [ "${PHP_FULL_VERSION:0:1}" == "5" ]; then
	PHP_VERSION="php5"
else
	PHP_VERSION="php7"
fi

echo -e "Generating parser..."
./lemon -s parser.${PHP_VERSION}.lemon

if [ ! -f parser.${PHP_VERSION}.c ]; then
	echo "error: couldn't generate parser"
	exit 1
fi

echo "#include <php.h>" > parser.c
cat parser.${PHP_VERSION}.c >> parser.c
cat base.c >> parser.c

sed s/"\#line"/"\/\/"/g scanner.c > xx && mv -f xx scanner.c
sed s/"#line"/"\/\/"/g parser.c > xx && mv -f xx parser.c

cd ${CURRENT_DIR}

echo

# Clean current compilation
if [ -f Makefile ]; then
	make clean
	${PHPIZE_BIN} --clean
fi

# Perform the compilation
${PHPIZE_BIN}
./configure \
	--with-php-config=${PHPCONFIG_BIN} \
	--enable-zephir_parser

make -j"$(getconf _NPROCESSORS_ONLN)"

make test NO_INTERACTION=1

echo

make install || sudo make install

echo

# Clean current compilation
if [ -f Makefile ]; then
	make clean
	${PHPIZE_BIN} --clean
fi

cd ${CURRENT_DIR}/parser

rm -f *.o *.lo

echo -e "\nThanks for compiling Zephir Parser!\nBuild succeed: Please restart your web server to complete the installation\n"

