lpc4/lib/
lpc4/lib/doc/efun/
lpc4/lib/doc/lfun/
lpc4/lib/doc/operators/
lpc4/lib/doc/simul_efuns/
lpc4/lib/doc/types/
lpc4/lib/etc/
lpc4/lib/include/
lpc4/lib/include/arpa/
lpc4/lib/obj/d/
lpc4/lib/save/
lpc4/lib/secure/
lpc4/lib/std/
lpc4/lib/std/living/
AC_INIT(interpret.c)
AC_PROG_CC

OLD_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -pipe"

OPTIMIZE=""
AC_COMPILE_CHECK(-pipe,
  [ ],
  [ exit(0); ],
  [
    OPTIMIZE="$OPTIMIZE -pipe"
    AC_VERBOSE(-pipe found)
  ],
  [
    CFLAGS="$OLD_CFLAGS"
    AC_VERBOSE(-pipe not found)
  ]
)

OLD_CFLAGS="$CFLAGS"

CFLAGS="$OLD_CFLAGS -O2"
AC_COMPILE_CHECK(-O2, [ ], [ exit(0); ],
[
  OPTIMIZE="$OPTIMIZE -O2"
  AC_VERBOSE(-O2 found)
],
[
  AC_VERBOSE(-O2 not found)
  CFLAGS="$OLD_CFLAGS -O"
  AC_COMPILE_CHECK(-O, [ ], [ exit(0); ],
  [
    OPTIMIZE="$OPTIMIZE -O"
    AC_VERBOSE(-O found)
  ],
  [
    AC_VERBOSE(-O not found)
  ])
])

for a in -g -W -Wunused -Wformat
do
  CFLAGS="$CFLAGS $OPTIMIZE $a"
  AC_COMPILE_CHECK($a, [ ], [ exit(0); ],
  [
     OPTIMIZE="$OPTIMIZE $a" 
     AC_VERBOSE($a found)
  ],
  [
     AC_VERBOSE($a not found)
  ])
done

CFLAGS="$OLD_CFLAGS"

AC_CHECKING(mudlib and source dir)

[
basedir=`(cd $srcdir; cd ..; pwd | sed 's#^/tmp_mnt##' )`
MUD_LIB=$basedir/lib
BINDIR=$basedir/bin
]

AC_PROG_INSTALL
AC_CONFIG_HEADER(machine.h)
AC_PROG_YACC
AC_PROG_CPP
AC_SET_MAKE

AC_PROGRAM_CHECK(COMPARE,diff,diff -wh >/dev/null 2>/dev/null,cmp -s)

[
if test "$COMPARE" = "diff -wh >/dev/null 2>/dev/null" ; then
cat >conftest.tmp1 <<END
a simple test
a simple test
END
cat >conftest.tmp2 <<END
a  simple test
a simple  test
END
cat >conftest.tmp3 <<END
a simple test
a hard test
END

  if diff -hw >/dev/null 2>/dev/null conftest.tmp1 conftest.tmp2; then
     if diff -hw >/dev/null 2>/dev/null conftest.tmp1 conftest.tmp3; then
       COMPARE="cmp -s"
     else
       COMPARE="diff -wh >/dev/null 2>/dev/null"
     fi
   else
     COMPARE="cmp -s"
  fi
  rm -f conftest.tmp1 conftest.tmp2 conftest.tmp3
fi

]

AC_CHECKING(first yacc define)
[
cat >conftest.y <<\EOF
%token GURKA
%%
all: GURKA
%%
EOF

foffset=257;
if $YACC -d conftest.y ; then
  if test -f y.tab.h; then
    foffset=`egrep GURKA y.tab.h | sed 's/^#[^0-9]*\([0-9]*\)[^0-9]*$/\1/'`
    echo $foffset >conftest.out
    if egrep '^[0-9]+$' conftest.out >/dev/null 2>&1; then
      echo >/dev/null
    else
      foffset=257
    fi
  fi
fi
]
AC_DEFINE_UNQUOTED(F_OFFSET,$foffset)

rm -rf conftest.y y.tab.c y.tab.h conftest.out

AC_HAVE_HEADERS(sys/rusage.h sys/time.h unistd.h stdlib.h memory.h values.h \
 string.h fcntl.h sys/filio.h sys/sockio.h netinet/in.h crypt.h \
 sys/socketvar.h)
AC_STDC_HEADERS
AC_DIR_HEADER


AC_SIZEOF_TYPE(char *)
AC_SIZEOF_TYPE(long)
AC_SIZEOF_TYPE(int)
AC_SIZEOF_TYPE(short)
AC_SIZE_T
AC_PID_T
AC_UID_T
AC_RETSIGTYPE

AC_HAVE_FUNCS(memset memcpy memchr memcmp strchr strrchr fchmod getrusage \
 strcspn crypt _crypt getwd getcwd strtod strtok getenv vfprintf bzero bcopy \
 strtol rindex vsprintf)

AC_HEADER_EGREP(strchr,string.h, ,
  AC_HEADER_EGREP(strchr,unistd.h, ,
    AC_HEADER_EGREP(strchr,stdlib.h, ,
      AC_DEFINE(STRCHR_DECL_MISSING))))

AC_HEADER_EGREP(malloc,memory.h, ,
  AC_HEADER_EGREP(malloc,unistd.h, ,
    AC_HEADER_EGREP(malloc,stdlib.h, ,
      AC_DEFINE(MALLOC_DECL_MISSING))))

AC_HEADER_EGREP(getpeername,sys/socket.h, ,
  AC_HEADER_EGREP(getpeername,sys/socketvar.h, ,
    AC_HEADER_EGREP(getpeername,sys/sockio.h, ,
      AC_DEFINE(GETPEERNAME_DECL_MISSING))))

AC_HEADER_EGREP(popen,stdio.h, ,
  AC_DEFINE(POPEN_DECL_MISSING))

AC_HEADER_EGREP(getenv,unistd.h, ,
  AC_HEADER_EGREP(getenv,stdlib.h, ,
    AC_DEFINE(GETENV_DECL_MISSING)))


AC_COMPILE_CHECK(return type of free, [
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif

#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif

#if !defined(STDC_HEADERS) && defined(HAVE_MEMORY_H)
#include <memory.h>
#endif

void free();

],, AC_DEFINE(FREE_RETURNS_VOID))

AC_COMPILE_CHECK([void* or char* from malloc],
[
#include <sys/types.h>

#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif

#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif

#if !defined(STDC_HEADERS) && defined(HAVE_MEMORY_H)
#include <memory.h>
#endif

#define POINTER void *
POINTER malloc(size_t);

#ifdef FREE_RETURNS_VOID
void free(POINTER);
#else
int free(POINTER);
#endif

],,AC_DEFINE(POINTER, void *), AC_DEFINE(POINTER, char *))

AC_HEADER_EGREP(gethostname,unistd.h, ,AC_DEFINE(GETHOSTNAME_DECL_MISSING))

AC_ALLOCA

AC_CONST
AC_INLINE

AC_HAVE_LIBRARY(m)
AC_HAVE_LIBRARY(socket)
dnl AC_HAVE_LIBRARY(ucb, LIBS="$LIBS -lc -lucb")

case "$DEFS" in
  *HAVE_LIBSOCKET* | *HAVE_LIBUCB*)
      AC_HAVE_LIBRARY(nsl)
   ;;
esac

AC_REPLACE_FUNCS(ualarm)

case "$LIBOBJS" in
   *ualarm.o*) ;;
  *)
    AC_DEFINE(HAVE_UALARM)
  ;;
esac

AC_CHECKING(unaligned read/writes)
AC_TEST_PROGRAM([
int main()
{
  char *c;
  c=(char *)malloc(100);

  *((int *)(c+0))=0x1243abcd;
  if(*((int *)(c+0))!=0x1243abcd) return 1;
  *((int *)(c+1))=0x1243abcd;
  if(*((int *)(c+1))!=0x1243abcd) return 1;
  *((int *)(c+2))=0x1243abcd;
  if(*((int *)(c+2))!=0x1243abcd) return 1;
  *((int *)(c+3))=0x1243abcd;
  if(*((int *)(c+3))!=0x1243abcd) return 1;
  *((short *)(c+1))=0x1243;
  if(*((short *)(c+1))!=0x1243) return 1;
  *((short *)(c+0))=0x1243;
  if(*((short *)(c+0))!=0x1243) return 1;
  return 0;
}
],AC_DEFINE(HANDLES_UNALIGNED_MEMORY_ACCESS))

AC_CHECKING(for working memmem)
AC_TEST_PROGRAM([
#include <string.h>
char *a="foo bar gazonk";
char *b="foo";
char *c="bar";
char *d="gazonk";
void main()
{
  if(memmem(b,strlen(b),a,strlen(a))!=a ||
     memmem(c,strlen(c),a,strlen(a))!=(a+4) ||
     memmem(d,strlen(d),a,strlen(a))!=(a+8) ||
     memmem(d,0,a,strlen(a))!=a ||
     memmem(d,strlen(d)+1,a,strlen(a))!=0)
    exit(1);
  exit(0);
}
],AC_DEFINE(HAVE_MEMMEM))

AC_CHECKING(how to extract an unsigned char)
AC_TEST_PROGRAM([
void main()
{
  char i,*p;
  i=-10;
  p=&i;
  if(*(unsigned char *)(p)!= 0x100 - 10) exit(1);
  exit(0);
}
],AC_DEFINE(EXTRACT_UCHAR_BY_CAST))

case "$DEFS" in
  *HAVE_GETRUSAGE*)
AC_COMPILE_CHECK(full availability of struct rusage members, [
#include <sys/time.h>
#ifdef HAVE_SYS_RUSAGE_H
#include <sys/rusage.h>
#endif
#include <sys/resource.h>
#ifndef RUSAGE_SELF
#define RUSAGE_SELF     0
#endif
],[
    struct rusage rus;
    long *v = (long *)main;
    getrusage(RUSAGE_SELF, &rus);
    *v++ = rus.ru_maxrss;
    *v++ = rus.ru_ixrss;
    *v++ = rus.ru_idrss;
    *v++ = rus.ru_isrss;
    *v++ = rus.ru_minflt;
    *v++ = rus.ru_majflt;
    *v++ = rus.ru_nswap;
    *v++ = rus.ru_inblock;
    *v++ = rus.ru_oublock;
    *v++ = rus.ru_msgsnd;
    *v++ = rus.ru_msgrcv;
    *v++ = rus.ru_nsignals;
    *v++ = rus.ru_nvcsw;
    *v++ = rus.ru_nivcsw;
],, AC_DEFINE(GETRUSAGE_RESTRICTED)) ;;
  *)
AC_COMPILE_CHECK(getrusage() through procfs, [
#include <sys/procfs.h>
#include <sys/fcntl.h>
int proc_fd;
char proc_name[20];
],[
  sprintf(proc_name, "/proc/%05d", getpid());
  proc_fd = open(proc_name, O_RDONLY);
], AC_DEFINE(GETRUSAGE_THROUGH_PROCFS) AC_DEFINE(HAVE_GETRUSAGE))
 ;;
esac

AC_CHECKING(for pragma alloca)
AC_TEST_PROGRAM([
#pragma alloca
void main()
{
  char *a=alloca();
  exit(0);
}
], AC_DEFINE(USE_PRAGMA_ALLOCA))


AC_COMPILE_CHECK(checking for volatile, [
],[
  volatile int foo=1;
],AC_DEFINE(VOLATILE,volatile),AC_DEFINE(VOLATILE,))
AC_CHECKING(for gcc function attributes)
AC_TEST_PROGRAM([
#include <stdarg.h>
void fatal(char *foo,...) __attribute__ ((noreturn,format (printf,1,2)));
int sqr(int x) __attribute__ ((const));

int sqr(int x) { return x*x; }

void fatal(char *foo,...)
{
  va_list args;
  va_start(foo,args);
  printf(foo,args);
  va_end(args);
  exit(2);
}
main() {  exit(0); }

], AC_DEFINE(HAVE_FUNCTION_ATTRIBUTES))


AC_CHECKING(how to set things nonblocking)
AC_TEST_PROGRAM([
#define TESTING
#define USE_FCNTL_FNDELAY
#include "$srcdir/socket_ctrl.c"
],AC_DEFINE(USE_FCNTL_FNDELAY),
AC_TEST_PROGRAM([
#define TESTING
#define USE_FCNTL_O_NDELAY
#include "$srcdir/socket_ctrl.c"
],AC_DEFINE(USE_FCNTL_O_NDELAY),
AC_TEST_PROGRAM([
#define TESTING
#define USE_FCNTL_NONBLOCK
#include "$srcdir/socket_ctrl.c"
],AC_DEFINE(USE_FCNTL_NONBLOCK),
AC_TEST_PROGRAM([
#define TESTING
#define USE_IOCTL_FIONBIO
#include "$srcdir/socket_ctrl.c"
],AC_DEFINE(USE_IOCTL_FIONBIO),
echo "Couldn't find nonblock method."
))))


AC_SUBST(WARN)
AC_SUBST(COMPARE)
AC_SUBST(OPTIMIZE)
AC_SUBST(EXTRA_OBJS)
AC_SUBST(MUD_LIB)
AC_SUBST(BINDIR)

AC_OUTPUT(Makefile)