#!/bin/sh
comp="$*"
config="cloudyconfig.h"
rm -f $config
echo "// this file was generated by configure.sh." > $config
rm -f tmp_cloudyconfig.cpp tmp_cloudyconfig.o tmp_cloudyconfig.obj
cat >> tmp_cloudyconfig.cpp <<EOF
int sub()
{
    return 1;
}
EOF
$comp -c tmp_cloudyconfig.cpp > tmp_cloudyconfig.err 2>&1
if [ -r tmp_cloudyconfig.o ]
then
    obj="o"
elif [ -r tmp_cloudyconfig.obj ]
then
    obj="obj"
else
    echo "no object file found, is the compiler working?"
    exit 1
fi
rm -f tmp_cloudyconfig.cpp tmp_cloudyconfig.$obj
cat >> tmp_cloudyconfig.cpp <<EOF
#include "cdstd.h"
#include <cmath>
#include <complex>
using namespace std;
double sub(double x, long i)
{
    return powi(x,i);
}
EOF
$comp -c tmp_cloudyconfig.cpp > tmp_cloudyconfig.err 2>&1
if [ -r tmp_cloudyconfig.$obj ]
then
    echo "#define HAVE_POWI 1" >> $config
else
    echo "#undef HAVE_POWI" >> $config
fi
rm -f tmp_cloudyconfig.cpp tmp_cloudyconfig.$obj tmp_cloudyconfig.err
cat >> tmp_cloudyconfig.cpp <<EOF
#include "cdstd.h"
#include <cmath>
#include <complex>
using namespace std;
double sub(double x, int i)
{
    return pow(x,i);
}
EOF
$comp -c tmp_cloudyconfig.cpp > tmp_cloudyconfig.err 2>&1
if [ -r tmp_cloudyconfig.$obj ]
then
    echo "#define HAVE_POW_DOUBLE_INT 1" >> $config
else
    echo "#undef HAVE_POW_DOUBLE_INT" >> $config
fi
rm -f tmp_cloudyconfig.cpp tmp_cloudyconfig.$obj tmp_cloudyconfig.err
cat >> tmp_cloudyconfig.cpp <<EOF
#include "cdstd.h"
#include <cmath>
#include <complex>
using namespace std;
double sub(double x, long i)
{
    return pow(x,i);
}
EOF
$comp -c tmp_cloudyconfig.cpp > tmp_cloudyconfig.err 2>&1
if [ -r tmp_cloudyconfig.$obj ]
then
    echo "#define HAVE_POW_DOUBLE_LONG 1" >> $config
else
    echo "#undef HAVE_POW_DOUBLE_LONG" >> $config
fi
rm -f tmp_cloudyconfig.cpp tmp_cloudyconfig.$obj tmp_cloudyconfig.err
cat >> tmp_cloudyconfig.cpp <<EOF
#include "cdstd.h"
#include <cmath>
#include <complex>
using namespace std;
float sub(float x, int i)
{
    return pow(x,i);
}
EOF
$comp -c tmp_cloudyconfig.cpp > tmp_cloudyconfig.err 2>&1
if [ -r tmp_cloudyconfig.$obj ]
then
    echo "#define HAVE_POW_FLOAT_INT 1" >> $config
else
    echo "#undef HAVE_POW_FLOAT_INT" >> $config
fi
rm -f tmp_cloudyconfig.cpp tmp_cloudyconfig.$obj tmp_cloudyconfig.err
cat >> tmp_cloudyconfig.cpp <<EOF
#include "cdstd.h"
#include <cmath>
#include <complex>
using namespace std;
float sub(float x, long i)
{
    return pow(x,i);
}
EOF
$comp -c tmp_cloudyconfig.cpp > tmp_cloudyconfig.err 2>&1
if [ -r tmp_cloudyconfig.$obj ]
then
    echo "#define HAVE_POW_FLOAT_LONG 1" >> $config
else
    echo "#undef HAVE_POW_FLOAT_LONG" >> $config
fi
rm -f tmp_cloudyconfig.cpp tmp_cloudyconfig.$obj tmp_cloudyconfig.err
cat >> tmp_cloudyconfig.cpp <<EOF
#include "cdstd.h"
#include <cmath>
#include <complex>
using namespace std;
double sub(double x, float y)
{
    return pow(x,y);
}
EOF
$comp -c tmp_cloudyconfig.cpp > tmp_cloudyconfig.err 2>&1
if [ -r tmp_cloudyconfig.$obj ]
then
    echo "#define HAVE_POW_DOUBLE_FLOAT 1" >> $config
else
    echo "#undef HAVE_POW_DOUBLE_FLOAT" >> $config
fi
rm -f tmp_cloudyconfig.cpp tmp_cloudyconfig.$obj tmp_cloudyconfig.err
cat >> tmp_cloudyconfig.cpp <<EOF
#include "cdstd.h"
#include <cmath>
#include <complex>
using namespace std;
double sub(float x, double y)
{
    return pow(x,y);
}
EOF
$comp -c tmp_cloudyconfig.cpp > tmp_cloudyconfig.err 2>&1
if [ -r tmp_cloudyconfig.$obj ]
then
    echo "#define HAVE_POW_FLOAT_DOUBLE 1" >> $config
else
    echo "#undef HAVE_POW_FLOAT_DOUBLE" >> $config
fi
rm -f tmp_cloudyconfig.cpp tmp_cloudyconfig.$obj tmp_cloudyconfig.err
cat >> tmp_cloudyconfig.cpp <<EOF
#include "cdstd.h"
#include <cstdio>
using namespace std;
void sub()
{
    printf( "%s", __func__ );
}
EOF
$comp -c tmp_cloudyconfig.cpp > tmp_cloudyconfig.err 2>&1
if [ -r tmp_cloudyconfig.$obj ]
then
    echo "#define HAVE_FUNC 1" >> $config
else
    echo "#undef HAVE_FUNC" >> $config
fi
rm -f tmp_cloudyconfig.cpp tmp_cloudyconfig.$obj tmp_cloudyconfig.err
cat >> tmp_cloudyconfig.cpp <<EOF
#include "cdstd.h"
#include <cmath>
using namespace std;
double sub(double x)
{
    return erf(x);
}
EOF
$comp -c tmp_cloudyconfig.cpp > tmp_cloudyconfig.err 2>&1
if [ -r tmp_cloudyconfig.$obj ]
then
    echo "#define HAVE_ERF 1" >> $config
else
    echo "#undef HAVE_ERF" >> $config
fi
rm -f tmp_cloudyconfig.cpp tmp_cloudyconfig.$obj tmp_cloudyconfig.err
cat >> tmp_cloudyconfig.cpp <<EOF
#include "cdstd.h"
#include <cmath>
using namespace std;
double sub(double x)
{
    return erfc(x);
}
EOF
$comp -c tmp_cloudyconfig.cpp > tmp_cloudyconfig.err 2>&1
if [ -r tmp_cloudyconfig.$obj ]
then
    echo "#define HAVE_ERFC 1" >> $config
else
    echo "#undef HAVE_ERFC" >> $config
fi
rm -f tmp_cloudyconfig.cpp tmp_cloudyconfig.$obj tmp_cloudyconfig.err
