#!/usr/bin/env bash
#
# Shell script to configure SPIM.
#
# SPIM is covered by a BSD license.
#
# Copyright (c) 1990-2010, James R. Larus.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
#
# Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation and/or
# other materials provided with the distribution.
#
# Neither the name of the James R. Larus nor the names of its contributors may be
# used to endorse or promote products derived from this software without specific
# prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#


#
# Shell script to create proper links to machine-dependent files for SPIM.
#
# Usage: Configure
#
# (Environment variable CC can be set to name a compiler--besides the
# default of cc)


set CC = ${CC:=cc}
echo $CC


export CPU_DIR=../CPU
export TEST_DIR=../Tests


rm -f ./configuration $TEST_DIR/tt.endian.s

echo Check if this machine is big-endian or little-endian.
echo This may take a few minutes.

$CC $CPU_DIR/endian.c -o endian

if ./endian; then
  # Big endian
  rm -f $TEST_DIR/tt.s ./configuration
  ln -s $TEST_DIR/tt.be.s $TEST_DIR/tt.endian.s
  echo "-DBIGENDIAN" > ./configuration
  echo I believe this is a big-endian machine.
else
  # Little endian
  rm -f $TEST_DIR/tt.s ./configuration
  ln -s $TEST_DIR/tt.le.s $TEST_DIR/tt.endian.s
  echo "-DLITTLEENDIAN" > ./configuration
  echo I believe this is a little-endian machine.
fi;
rm -f endian endian.exe


if [ -f /usr/lib/libc.a ]; then
  # BSD Universe:
  echo Looks like a BSD universe exists...
  echo Scaning libc
  nm /usr/lib/libc.a > library_contents
  set flag = -s
else if [ -f /lib/libc.a ]; then
  # System V Universe:
  echo Looks like a System V universe exists...
  echo Scaning libc
  nm /lib/libc.a > library_contents
  set flag = -q
else if [ -f /usr/lib/libc.so ]; then
  # System V Universe?
  echo Looks like a System V universe exists...
  echo Scaning libc
  nm /usr/lib/libc.so > library_contents
  set flag = -q
else if [ -f /usr/lib/libc.dylib ]; then
  # Mac OS X Universe:
  echo Looks like a Mac OS X / OpenStep universe exists...
  echo Scanning libc.dylib
  nm /usr/lib/libc.dylib > library_contents
  set flag = -q
else if [ -f /usr/lib64/libc.a ]; then
  echo Look like a 64 bits linux universe exists...
  echo Scanning libc
  nm /usr/lib64/libc.a > library_contents
  set flag = -q
fi;
fi;
fi;
fi;
fi;


echo
echo Checking if libc on this machine contains:


if  grep $flag 'vsprintf' library_contents > /dev/null; then
  echo "  vsprintf: Yes, I think so"
else
  echo "-DNEED_VSPRINTF" >> ./configuration
  echo "  vsprintf: No, I don't think"

  if  grep $flag '_doprnt' library_contents > /dev/null; then
    echo "    _doprnt: Yes, I think, so I will use it instead"
  else
    echo "    _doprnt: NO, THIS IS A PROBLEM: NO VSPRINTF AND NO _DOPRNT"
    echo "SPIM WILL NOT RUN PROPERLY"
  fi;
fi;


if  grep $flag 'vfprintf' library_contents > /dev/null; then
  echo "  vfprintf: Yes, I think"
else
  echo "-DNO_VFPRINTF" >> ./configuration
  echo "  vfprintf: No, I don't think"

  if  grep $flag '_doprnt' library_contents > /dev/null; then
    echo "    _doprnt: Yes, I think"
  else
    echo "    _doprnt: NO, THIS IS A PROBLEM: NO VFPRINTF AND NO _DOPRNT"
    echo "SPIM WILL NOT RUN PROPERLY"
  fi;
fi;


if grep $flag 'strtoul' library_contents > /dev/null; then
  echo "  strtoul: Yes, I think"
else
  # No strtol
  echo "-DNEED_STRTOUL" >> ./configuration
  echo "  strtoul: No, I don't think"
fi;


if grep $flag 'strtol' library_contents > /dev/null; then
    echo "  strtol: Yes, I think"
else
  # No strtol
  echo "-DNEED_STRTOL" >> ./configuration
  echo "  strtol: No, I don't think"
fi;


if grep $flag 'memcpy' library_contents > /dev/null; then
  echo "  memcpy: Yes, I think"
else
  # No memcpy
  echo "-DNO_MEM_FUNCTIONS" >> ./configuration
  echo "  memcpy: No, I don't think"
fi;


echo
echo Checking for /usr/include/termios.h
if [ -f /usr/include/termios.h ]; then
  echo "-DUSE_TERMIOS" >> ./configuration
  echo "Yes, it is there"
else
  # No termios
  echo "No, it is not there"
fi;


if [ -f /usr/lib/libc.dylib ]; then
  # Darwin headers restricted if _POSIX_SOURCE
  echo "-U_POSIX_SOURCE" >> ./configuration
fi;

rm -f library_contents
