the cothreads library now builds, but it's untested the public api is in cothreads.h
authorAndy Wingo <wingo@pobox.com>
Mon, 28 Jan 2002 01:29:10 +0000 (01:29 +0000)
committerAndy Wingo <wingo@pobox.com>
Mon, 28 Jan 2002 01:29:10 +0000 (01:29 +0000)
Original commit message from CVS:
the cothreads library now builds, but it's untested
the public api is in cothreads.h

13 files changed:
gst/cothreads/Makefile.am
gst/cothreads/acinclude.m4
gst/cothreads/autogen.sh
gst/cothreads/configure.ac
gst/cothreads/cothread-stack.c
gst/cothreads/cothreads-private.h [new file with mode: 0644]
gst/cothreads/cothreads.c [new file with mode: 0644]
gst/cothreads/cothreads.h [new file with mode: 0644]
gst/cothreads/m4/glib.m4 [new file with mode: 0644]
gst/cothreads/m4/gst-feature.m4 [new file with mode: 0644]
gst/cothreads/m4/linuxthreads.m4 [new file with mode: 0644]
gst/cothreads/m4/pkg.m4 [new file with mode: 0644]
gst/cothreads/m4/pth-acinclude.m4 [new file with mode: 0644]

index 2f45005..3014df1 100644 (file)
@@ -4,12 +4,16 @@
                              # ``UNIX -- where you can do anything
                              #   in two keystrokes, or less...''
 
-noinst_LTLIBRARIES = libpth-mctx.la
+noinst_LTLIBRARIES = libpth-mctx.la libgstcothreads.la
 
 libpth_mctx_la_SOURCES = pth_mctx.c pth_p.h pth_vers.c pth.h pth_acdef.h pth_acmac.h
 
+libgstcothreads_la_SOURCES = cothreads.c cothread-stack.c cothreads.h
+libgstcothreads_la_LIBADD = libpth-mctx.la $(GLIB_LIBS)
+libgstcothreads_la_CFLAGS = $(GLIB_CFLAGS)
+
 noinst_PROGRAMS = test-pth test-pth-pthreads test-pthreads test-pth-pthreads2
-noinst_HEADERS = linuxthreads.h
+noinst_HEADERS = linuxthreads.h cothreads-private.h cothreads.h
 
 test_pth_LDADD = libpth-mctx.la
 test_pth_pthreads_LDADD = libpth-mctx.la -lpthread
index f54cb34..798f409 100644 (file)
@@ -1,3 +1,452 @@
+# Configure paths for GLIB
+# Owen Taylor     97-11-3
+
+dnl AM_PATH_GLIB([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]])
+dnl Test for GLIB, and define GLIB_CFLAGS and GLIB_LIBS, if "gmodule" or 
+dnl gthread is specified in MODULES, pass to glib-config
+dnl
+AC_DEFUN(AM_PATH_GLIB,
+[dnl 
+dnl Get the cflags and libraries from the glib-config script
+dnl
+AC_ARG_WITH(glib-prefix,[  --with-glib-prefix=PFX   Prefix where GLIB is installed (optional)],
+            glib_config_prefix="$withval", glib_config_prefix="")
+AC_ARG_WITH(glib-exec-prefix,[  --with-glib-exec-prefix=PFX Exec prefix where GLIB is installed (optional)],
+            glib_config_exec_prefix="$withval", glib_config_exec_prefix="")
+AC_ARG_ENABLE(glibtest, [  --disable-glibtest       Do not try to compile and run a test GLIB program],
+                   , enable_glibtest=yes)
+
+  if test x$glib_config_exec_prefix != x ; then
+     glib_config_args="$glib_config_args --exec-prefix=$glib_config_exec_prefix"
+     if test x${GLIB_CONFIG+set} != xset ; then
+        GLIB_CONFIG=$glib_config_exec_prefix/bin/glib-config
+     fi
+  fi
+  if test x$glib_config_prefix != x ; then
+     glib_config_args="$glib_config_args --prefix=$glib_config_prefix"
+     if test x${GLIB_CONFIG+set} != xset ; then
+        GLIB_CONFIG=$glib_config_prefix/bin/glib-config
+     fi
+  fi
+
+  for module in . $4
+  do
+      case "$module" in
+         gmodule) 
+             glib_config_args="$glib_config_args gmodule"
+         ;;
+         gthread) 
+             glib_config_args="$glib_config_args gthread"
+         ;;
+      esac
+  done
+
+  AC_PATH_PROG(GLIB_CONFIG, glib-config, no)
+  min_glib_version=ifelse([$1], ,0.99.7,$1)
+  AC_MSG_CHECKING(for GLIB - version >= $min_glib_version)
+  no_glib=""
+  if test "$GLIB_CONFIG" = "no" ; then
+    no_glib=yes
+  else
+    GLIB_CFLAGS=`$GLIB_CONFIG $glib_config_args --cflags`
+    GLIB_LIBS=`$GLIB_CONFIG $glib_config_args --libs`
+    glib_config_major_version=`$GLIB_CONFIG $glib_config_args --version | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+    glib_config_minor_version=`$GLIB_CONFIG $glib_config_args --version | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+    glib_config_micro_version=`$GLIB_CONFIG $glib_config_args --version | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+    if test "x$enable_glibtest" = "xyes" ; then
+      ac_save_CFLAGS="$CFLAGS"
+      ac_save_LIBS="$LIBS"
+      CFLAGS="$CFLAGS $GLIB_CFLAGS"
+      LIBS="$GLIB_LIBS $LIBS"
+dnl
+dnl Now check if the installed GLIB is sufficiently new. (Also sanity
+dnl checks the results of glib-config to some extent
+dnl
+      rm -f conf.glibtest
+      AC_TRY_RUN([
+#include <glib.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int 
+main ()
+{
+  int major, minor, micro;
+  char *tmp_version;
+
+  system ("touch conf.glibtest");
+
+  /* HP/UX 9 (%@#!) writes to sscanf strings */
+  tmp_version = g_strdup("$min_glib_version");
+  if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
+     printf("%s, bad version string\n", "$min_glib_version");
+     exit(1);
+   }
+
+  if ((glib_major_version != $glib_config_major_version) ||
+      (glib_minor_version != $glib_config_minor_version) ||
+      (glib_micro_version != $glib_config_micro_version))
+    {
+      printf("\n*** 'glib-config --version' returned %d.%d.%d, but GLIB (%d.%d.%d)\n", 
+             $glib_config_major_version, $glib_config_minor_version, $glib_config_micro_version,
+             glib_major_version, glib_minor_version, glib_micro_version);
+      printf ("*** was found! If glib-config was correct, then it is best\n");
+      printf ("*** to remove the old version of GLIB. You may also be able to fix the error\n");
+      printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
+      printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
+      printf("*** required on your system.\n");
+      printf("*** If glib-config was wrong, set the environment variable GLIB_CONFIG\n");
+      printf("*** to point to the correct copy of glib-config, and remove the file config.cache\n");
+      printf("*** before re-running configure\n");
+    } 
+  else if ((glib_major_version != GLIB_MAJOR_VERSION) ||
+          (glib_minor_version != GLIB_MINOR_VERSION) ||
+           (glib_micro_version != GLIB_MICRO_VERSION))
+    {
+      printf("*** GLIB header files (version %d.%d.%d) do not match\n",
+            GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION);
+      printf("*** library (version %d.%d.%d)\n",
+            glib_major_version, glib_minor_version, glib_micro_version);
+    }
+  else
+    {
+      if ((glib_major_version > major) ||
+        ((glib_major_version == major) && (glib_minor_version > minor)) ||
+        ((glib_major_version == major) && (glib_minor_version == minor) && (glib_micro_version >= micro)))
+      {
+        return 0;
+       }
+     else
+      {
+        printf("\n*** An old version of GLIB (%d.%d.%d) was found.\n",
+               glib_major_version, glib_minor_version, glib_micro_version);
+        printf("*** You need a version of GLIB newer than %d.%d.%d. The latest version of\n",
+              major, minor, micro);
+        printf("*** GLIB is always available from ftp://ftp.gtk.org.\n");
+        printf("***\n");
+        printf("*** If you have already installed a sufficiently new version, this error\n");
+        printf("*** probably means that the wrong copy of the glib-config shell script is\n");
+        printf("*** being found. The easiest way to fix this is to remove the old version\n");
+        printf("*** of GLIB, but you can also set the GLIB_CONFIG environment to point to the\n");
+        printf("*** correct copy of glib-config. (In this case, you will have to\n");
+        printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
+        printf("*** so that the correct libraries are found at run-time))\n");
+      }
+    }
+  return 1;
+}
+],, no_glib=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+       CFLAGS="$ac_save_CFLAGS"
+       LIBS="$ac_save_LIBS"
+     fi
+  fi
+  if test "x$no_glib" = x ; then
+     AC_MSG_RESULT(yes)
+     ifelse([$2], , :, [$2])     
+  else
+     AC_MSG_RESULT(no)
+     if test "$GLIB_CONFIG" = "no" ; then
+       echo "*** The glib-config script installed by GLIB could not be found"
+       echo "*** If GLIB was installed in PREFIX, make sure PREFIX/bin is in"
+       echo "*** your path, or set the GLIB_CONFIG environment variable to the"
+       echo "*** full path to glib-config."
+     else
+       if test -f conf.glibtest ; then
+        :
+       else
+          echo "*** Could not run GLIB test program, checking why..."
+          CFLAGS="$CFLAGS $GLIB_CFLAGS"
+          LIBS="$LIBS $GLIB_LIBS"
+          AC_TRY_LINK([
+#include <glib.h>
+#include <stdio.h>
+],      [ return ((glib_major_version) || (glib_minor_version) || (glib_micro_version)); ],
+        [ echo "*** The test program compiled, but did not run. This usually means"
+          echo "*** that the run-time linker is not finding GLIB or finding the wrong"
+          echo "*** version of GLIB. If it is not finding GLIB, you'll need to set your"
+          echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+          echo "*** to the installed location  Also, make sure you have run ldconfig if that"
+          echo "*** is required on your system"
+         echo "***"
+          echo "*** If you have an old version installed, it is best to remove it, although"
+          echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
+          echo "***"
+          echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that"
+          echo "*** came with the system with the command"
+          echo "***"
+          echo "***    rpm --erase --nodeps gtk gtk-devel" ],
+        [ echo "*** The test program failed to compile or link. See the file config.log for the"
+          echo "*** exact error that occured. This usually means GLIB was incorrectly installed"
+          echo "*** or that you have moved GLIB since it was installed. In the latter case, you"
+          echo "*** may want to edit the glib-config script: $GLIB_CONFIG" ])
+          CFLAGS="$ac_save_CFLAGS"
+          LIBS="$ac_save_LIBS"
+       fi
+     fi
+     GLIB_CFLAGS=""
+     GLIB_LIBS=""
+     ifelse([$3], , :, [$3])
+  fi
+  AC_SUBST(GLIB_CFLAGS)
+  AC_SUBST(GLIB_LIBS)
+  rm -f conf.glibtest
+])
+dnl Perform a check for a feature for GStreamer
+dnl Richard Boulton <richard-alsa@tartarus.org>
+dnl Thomas Vander Stichele <thomas@apestaart.org> added useful stuff
+dnl Last modification: 25/06/2001
+dnl GST_CHECK_FEATURE(FEATURE-NAME, FEATURE-DESCRIPTION,
+dnl                   DEPENDENT-PLUGINS, TEST-FOR-FEATURE,
+dnl                   DISABLE-BY-DEFAULT, ACTION-IF-USE, ACTION-IF-NOTUSE)
+dnl
+dnl This macro adds a command line argument to enable the user to enable
+dnl or disable a feature, and if the feature is enabled, performs a supplied
+dnl test to check if the feature is available.
+dnl
+dnl The test should define HAVE_<FEATURE-NAME> to "yes" or "no" depending
+dnl on whether the feature is available.
+dnl
+dnl The macro will set USE_<FEATURE-NAME> to "yes" or "no" depending on
+dnl whether the feature is to be used.
+dnl Thomas changed this, so that when USE_<FEATURE-NAME> was already set
+dnl to no, then it stays that way.
+dnl
+dnl The macro will call AM_CONDITIONAL(USE_<<FEATURE-NAME>, ...) to allow
+dnl the feature to control what is built in Makefile.ams.  If you want
+dnl additional actions resulting from the test, you can add them with the
+dnl ACTION-IF-USE and ACTION-IF-NOTUSE parameters.
+dnl 
+dnl FEATURE-NAME        is the name of the feature, and should be in
+dnl                     purely upper case characters.
+dnl FEATURE-DESCRIPTION is used to describe the feature in help text for
+dnl                     the command line argument.
+dnl DEPENDENT-PLUGINS   lists any plugins which depend on this feature.
+dnl TEST-FOR-FEATURE    is a test which sets HAVE_<FEATURE-NAME> to "yes"
+dnl                     or "no" depending on whether the feature is
+dnl                     available.
+dnl DISABLE-BY-DEFAULT  if "disabled", the feature is disabled by default,
+dnl                     if any other value, the feature is enabled by default.
+dnl ACTION-IF-USE       any extra actions to perform if the feature is to be
+dnl                     used.
+dnl ACTION-IF-NOTUSE    any extra actions to perform if the feature is not to
+dnl                     be used.
+dnl
+dnl
+dnl thomas :
+dnl we also added a history.  
+dnl GST_PLUGINS_YES will contain all plugins to be built
+dnl                 that were checked through GST_CHECK_FEATURE
+dnl GST_PLUGINS_NO will contain those that won't be built
+
+AC_DEFUN(GST_CHECK_FEATURE,
+[dnl
+builtin(define, [gst_endisable], ifelse($5, [disabled], [enable], [disable]))dnl
+dnl if it is set to NO, then don't even consider it for building
+NOUSE=
+if test "x$USE_[$1]" = "xno"; then
+  NOUSE="yes"
+fi
+AC_ARG_ENABLE(translit([$1], A-Z, a-z),
+  [  ]builtin(format, --%-26s gst_endisable %s, gst_endisable-translit([$1], A-Z, a-z), [$2]ifelse([$3],,,: [$3])),
+  [ case "${enableval}" in
+      yes) USE_[$1]=yes;;
+      no) USE_[$1]=no;;
+      *) AC_MSG_ERROR(bad value ${enableval} for --enable-translit([$1], A-Z, a-z)) ;;
+    esac],
+  [ USE_$1=]ifelse($5, [disabled], [no], [yes]))           dnl DEFAULT
+
+dnl *** set it back to no if it was preset to no
+if test "x$NOUSE" = "xyes"; then
+  USE_[$1]="no"
+  AC_MSG_WARN(*** $3 pre-configured not to be built)
+fi
+NOUSE=
+
+dnl *** If it's enabled
+
+if test x$USE_[$1] = xyes; then
+  gst_check_save_LIBS=$LIBS
+  gst_check_save_LDFLAGS=$LDFLAGS
+  gst_check_save_CFLAGS=$CFLAGS
+  gst_check_save_CPPFLAGS=$CPPFLAGS
+  gst_check_save_CXXFLAGS=$CXXFLAGS
+  HAVE_[$1]=no
+  $4
+  LIBS=$gst_check_save_LIBS
+  LDFLAGS=$gst_check_save_LDFLAGS
+  CFLAGS=$gst_check_save_CFLAGS
+  CPPFLAGS=$gst_check_save_CPPFLAGS
+  CXXFLAGS=$gst_check_save_CXXFLAGS
+
+  dnl If it isn't found, unset USE_[$1]
+  if test x$HAVE_[$1] = xno; then
+    USE_[$1]=no
+  fi
+fi
+dnl *** Warn if it's disabled or not found
+if test x$USE_[$1] = xyes; then
+  ifelse([$6], , :, [$6])
+  GST_PLUGINS_YES="$GST_PLUGINS_YES \n\t[$3]"
+else
+  ifelse([$3], , :, [AC_MSG_NOTICE(
+These plugins will not be built: [$3]
+)])
+  GST_PLUGINS_NO="$GST_PLUGINS_NO \n\t[$3]"
+  ifelse([$7], , :, [$7])
+fi
+dnl *** Define the conditional as appropriate
+AM_CONDITIONAL(USE_[$1], test x$USE_[$1] = xyes)
+])
+
+dnl Use a -config program which accepts --cflags and --libs parameters
+dnl to set *_CFLAGS and *_LIBS and check existence of a feature.
+dnl Richard Boulton <richard-alsa@tartarus.org>
+dnl Last modification: 26/06/2001
+dnl GST_CHECK_CONFIGPROG(FEATURE-NAME, CONFIG-PROG-FILENAME, MODULES)
+dnl
+dnl This check was written for GStreamer: it should be renamed and checked
+dnl for portability if you decide to use it elsewhere.
+dnl
+AC_DEFUN(GST_CHECK_CONFIGPROG,
+[
+  AC_PATH_PROG([$1]_CONFIG, [$2], no)
+  if test x$[$1]_CONFIG = xno; then
+    [$1]_LIBS=
+    [$1]_CFLAGS=
+    HAVE_[$1]=no
+  else
+    [$1]_LIBS=`[$2] --libs [$3]`
+    [$1]_CFLAGS=`[$2] --cflags [$3]`
+    HAVE_[$1]=yes
+  fi
+  AC_SUBST([$1]_LIBS)
+  AC_SUBST([$1]_CFLAGS)
+])
+
+dnl Use AC_CHECK_LIB and AC_CHECK_HEADER to do both tests at once
+dnl sets HAVE_module if we have it
+dnl Richard Boulton <richard-alsa@tartarus.org>
+dnl Last modification: 26/06/2001
+dnl GST_CHECK_LIBHEADER(FEATURE-NAME, LIB NAME, LIB FUNCTION, EXTRA LD FLAGS, 
+dnl                     HEADER NAME, ACTION-IF-FOUND, ACTION-IF-NOT-FOUND)
+dnl
+dnl This check was written for GStreamer: it should be renamed and checked
+dnl for portability if you decide to use it elsewhere.
+dnl
+AC_DEFUN(GST_CHECK_LIBHEADER,
+[
+  AC_CHECK_LIB([$2], [$3], HAVE_[$1]=yes, HAVE_[$1]=no,[$4])
+  if test "x$HAVE_[$1]" = "xyes"; then
+    AC_CHECK_HEADER([$5], :, HAVE_[$1]=no)
+    if test "x$HAVE_[$1]" = "xyes"; then
+      dnl execute what needs to be
+      ifelse([$6], , :, [$6])
+    else
+      ifelse([$7], , :, [$7])
+    fi
+  else
+    AC_MSG_WARN([$1] not found)
+  fi
+  AC_SUBST(HAVE_[$1])
+]
+)
+
+dnl
+dnl Add a subsystem --disable flag and all the necessary symbols and substitions
+dnl
+dnl GST_SUBSYSTEM_DISABLE(SYSNAME, [subsystem name])
+dnl
+AC_DEFUN(GST_SUBSYSTEM_DISABLE,
+[AC_ARG_ENABLE(translit([$1], A-Z, a-z), 
+[  ]builtin(format, --disable-%-17s  disable %s, translit([$1], A-Z, a-z), $2),
+[ case "${enableval}" in
+    yes) GST_DISABLE_[$1]=no ;;
+    no) GST_DISABLE_[$1]=yes ;;
+    *) AC_MSG_ERROR(bad value ${enableval} for --enable-translit([$1], A-Z, a-z)) ;;
+  esac],
+[GST_DISABLE_[$1]=no]) dnl Default value
+if test x$GST_DISABLE_[$1] = xyes; then
+  AC_DEFINE(GST_DISABLE_[$1], 1, [Disable $2])
+  GST_DISABLE_[$1]_DEFINE=-DGST_DISABLE_[$1]
+fi
+AM_CONDITIONAL(GST_DISABLE_[$1], test x$GST_DISABLE_[$1] = xyes)
+AC_SUBST(GST_DISABLE_[$1]_DEFINE)
+GST_SUBSYSTEM_DISABLE_DEFINES="$GST_SUBSYTEM_DISABLE_DEFINES $GST_DISABLE_[$1]_DEFINE"
+])
+dnl Check for LinuxThreads
+dnl COTHREADS_CHECK_LINUXTHREADS
+dnl no arguments
+AC_DEFUN([COTHREADS_CHECK_LINUXTHREADS], [
+       AC_CACHE_CHECK([for LinuxThreads],
+               [cothreads_cv_linuxthreads],
+               [AC_EGREP_CPP(pthread_kill_other_threads_np,
+                       [#include <pthread.h>],
+                       [cothreads_cv_linuxthreads=yes],
+                       [cothreads_cv_linuxthreads=no])
+               ])
+       if test $cothreads_cv_linuxthreads = yes; then
+               AC_DEFINE(HAVE_LINUXTHREADS,1,[if you have LinuxThreads])
+       fi
+])
+
+dnl PKG_CHECK_MODULES(GSTUFF, gtk+-2.0 >= 1.3 glib = 1.3.4, action-if, action-not)
+dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page
+dnl also defines GSTUFF_PKG_ERRORS on error
+AC_DEFUN(PKG_CHECK_MODULES, [
+  succeeded=no
+
+  if test -z "$PKG_CONFIG"; then
+    AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
+  fi
+
+  if test "$PKG_CONFIG" = "no" ; then
+     echo "*** The pkg-config script could not be found. Make sure it is"
+     echo "*** in your path, or set the PKG_CONFIG environment variable"
+     echo "*** to the full path to pkg-config."
+     echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config."
+  else
+     if ! $PKG_CONFIG --atleast-pkgconfig-version 0.7.0; then
+        echo "*** Your version of pkg-config is too old. You need version 0.7.0 or newer."
+        echo "*** See http://www.freedesktop.org/software/pkgconfig"
+     else
+        AC_MSG_CHECKING(for $2)
+
+        if $PKG_CONFIG --exists "$2" ; then
+            AC_MSG_RESULT(yes)
+            succeeded=yes
+
+            AC_MSG_CHECKING($1_CFLAGS)
+            $1_CFLAGS=`$PKG_CONFIG --cflags "$2"`
+            AC_MSG_RESULT($$1_CFLAGS)
+
+            AC_MSG_CHECKING($1_LIBS)
+            $1_LIBS=`$PKG_CONFIG --libs "$2"`
+            AC_MSG_RESULT($$1_LIBS)
+        else
+            $1_CFLAGS=""
+            $1_LIBS=""
+            ## If we have a custom action on failure, don't print errors, but 
+            ## do set a variable so people can do so.
+            $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
+            ifelse([$4], ,echo $$1_PKG_ERRORS,)
+        fi
+
+        AC_SUBST($1_CFLAGS)
+        AC_SUBST($1_LIBS)
+     fi
+  fi
+
+  if test $succeeded = yes; then
+     ifelse([$3], , :, [$3])
+  else
+     ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4])
+  fi
+])
+
+
 dnl ##
 dnl ##  NGPT - Next Generation POSIX Threading
 dnl ##  Copyright (c) 2001 IBM Corporation <babt@us.ibm.com>
@@ -1763,19 +2212,3 @@ dnl #   display results in detail
 AC_MSG_VERBOSE([$]$2)
 AC_MSG_VERBOSE([$]$3)
 ])
-
-dnl Check for LinuxThreads
-dnl COTHREADS_CHECK_LINUXTHREADS
-dnl no arguments
-AC_DEFUN([COTHREADS_CHECK_LINUXTHREADS], [
-       AC_CACHE_CHECK([for LinuxThreads],
-               [cothreads_cv_linuxthreads],
-               [AC_EGREP_CPP(pthread_kill_other_threads_np,
-                       [#include <pthread.h>],
-                       [cothreads_cv_linuxthreads=yes],
-                       [cothreads_cv_linuxthreads=no])
-               ])
-       if test $cothreads_cv_linuxthreads = yes; then
-               AC_DEFINE(HAVE_LINUXTHREADS,1,[if you have LinuxThreads])
-       fi
-])
index c40a42c..ba97e06 100755 (executable)
@@ -137,6 +137,9 @@ if test -z "$*"; then
         echo "to pass any to it, please specify them on the $0 command line."
 fi
 
+echo "+ creating acinclude.m4"
+cat m4/*.m4 > acinclude.m4
+
 echo "+ running aclocal ..."
 aclocal $ACLOCAL_FLAGS || {
        echo
index 7cc6c27..6b25ae6 100644 (file)
@@ -259,6 +259,34 @@ AC_MSG_VERBOSE([decided mctx method: $mctx_mth])
 AC_MSG_VERBOSE([decided mctx dispatching: $mctx_dsp])
 AC_MSG_VERBOSE([decided mctx stack setup: $mctx_stk])
 
+AC_MSG_PART(Checking for GLib)
+
+dnl Check for glib2
+translit(dnm, m, l) AM_CONDITIONAL(USE_GLIB2, true)
+GST_CHECK_FEATURE(GLIB2, [use of glib-2.0 and GObject], , [
+  PKG_CHECK_MODULES(GLIB2, glib-2.0 gthread-2.0,
+    HAVE_GLIB2=yes,HAVE_GLIB2=no)
+  GLIB_LIBS=$GLIB2_LIBS
+  GLIB_CFLAGS=$GLIB2_CFLAGS
+  AC_SUBST(GLIB_LIBS)
+  AC_SUBST(GLIB_CFLAGS)
+  # if we've gotten this far, the user has specifically asked that glib2 be
+  # used. if we have no glib2, that is an error.
+  if test "x$HAVE_GLIB2" = "xno"; then
+    AC_MSG_ERROR([no glib2 found, try --disable-glib2])
+  fi
+], enabled, [
+dnl  AC_DEFINE(USE_GLIB2)
+])
+dnl AC_SUBST(USE_GLIB2)
+
+if test x$USE_GLIB2 = xno; then
+  dnl Check for glib and gtk
+  AM_PATH_GLIB(1.2.0,,
+              AC_MSG_ERROR(Cannot find glib: Is glib-config in path?),
+              glib gmodule gthread)
+fi
+
 
 dnl ##  Additional support for some special platform/compiler options
 case "$PLATFORM:$CC" in
index efe6a4d..9e963ab 100644 (file)
  * Boston, MA 02111-1307, USA.
  */
 
-/* chunks can contain 1 or more blocks, each block contains one cothread stack */
+#include "cothreads-private.h"
+#include "linuxthreads.h"
 
-enum cothread_attr_method 
+typedef enum _cothread_block_state cothread_block_state;
+typedef struct _cothread_chunk cothread_chunk;
+
+enum _cothread_block_state
 {
-  COTHREAD_ATTR_METHOD_MALLOC,        /* cothread stacks on the heap, one block per chunk */
-  COTHREAD_ATTR_METHOD_GTHREAD_STACK, /* cothread stacks within the current gthread's stack */
-  COTHREAD_ATTR_METHOD_LINUXTHREADS,  /* a hack that allows for linuxthreads compatibility */
-}
+  COTHREAD_BLOCK_STATE_UNUSED=0,
+  COTHREAD_BLOCK_STATE_IN_USE
+};
+
+struct _cothread_chunk {
+  cothread_chunk *next;
+  cothread_block_state *block_states;
+  char *chunk;
+  int size;
+  int reserved_bottom;
+  gboolean needs_free;
+  int nblocks;
+};
 
-struct cothread_attr {
-  enum cothread_attr_method method;
-  int chunk_size;
-  int blocks_per_chunk;
-}
 
-#ifdef HAVE_LINUXTHREADS
-static struct cothread_attr cothread_attr_default = 
+static cothread_chunk* cothread_chunk_new              (unsigned long size, gboolean allocate);
+static void            cothread_chunk_free             (cothread_chunk *chunk);
+static gboolean                cothread_stack_alloc_chunked    (cothread_chunk *chunk, char **low, char **high, 
+                                                         cothread_chunk *(*chunk_new)(cothread_chunk*));
+static cothread_chunk* cothread_chunk_new_linuxthreads (cothread_chunk* old);
+
+
+gboolean
+cothread_stack_alloc_on_heap (char **low, char **high)
 {
-  COTHREAD_ATTR_METHOD_LINUXTHREADS,  /* use the linuxthreads hack */
-  0x20000,                            /* 2 MB */
-  8                                   /* for a stack size of 256 KB */
+  *low = g_malloc (_cothread_attr_global->chunk_size / _cothread_attr_global->blocks_per_chunk);
+  *high = *low + sizeof (*low) - 1;
+  return TRUE;
 }
-#else
-static struct cothread_attr cothread_attr_default = 
+
+gboolean
+cothread_stack_alloc_on_gthread_stack (char **low, char **high)
 {
-  COTHREAD_ATTR_METHOD_GTHREAD_STACK, /* this is what the old cothreads code does */
-  0x10000,                            /* only 1 MB due the the FreeBSD defaults */
-  8                                   /* for a stack size of 128 KB */
+  cothread_chunk *chunk = NULL;
+  static GStaticPrivate chunk_key = G_STATIC_PRIVATE_INIT;
+  
+  if (!(chunk = g_static_private_get(&chunk_key))) {
+    chunk = cothread_chunk_new (_cothread_attr_global->chunk_size, FALSE);
+    g_static_private_set (&chunk_key, chunk, cothread_chunk_free);
+  }
+  
+  return cothread_stack_alloc_chunked (chunk, low, high, NULL);
 }
-#endif
-
-static struct cothread_attr *_attr = NULL; /* set in cothread_init() */
 
-enum cothread_block_state
+gboolean
+cothread_stack_alloc_linuxthreads (char **low, char **high)
 {
-  COTHREAD_BLOCK_STATE_UNUSED=0,
-  COTHREAD_BLOCK_STATE_IN_USE
+  cothread_chunk *chunk = NULL;
+  static GStaticPrivate chunk_key = G_STATIC_PRIVATE_INIT;
+  
+  if (!(chunk = g_static_private_get(&chunk_key))) {
+    chunk = cothread_chunk_new (_cothread_attr_global->chunk_size, FALSE);
+    g_static_private_set (&chunk_key, chunk, cothread_chunk_free);
+  }
+  
+  return cothread_stack_alloc_chunked (chunk, low, high, cothread_chunk_new_linuxthreads);
 }
 
-struct cothread_chunk {
-  struct cothread_chunk *next;
-  enum cothread_block_state *block_states;
-  char *chunk;
-  int size;
-  int reserved_bottom;
-  gboolean needs_free;
-}
 
 /* size must be a power of two. */
-struct cothread_chunk*
+static cothread_chunk*
 cothread_chunk_new (unsigned long size, gboolean allocate)
 {
-  struct cothread_chunk *ret;
+  cothread_chunk *ret;
   char *sp = CURRENT_STACK_FRAME;
   
-  ret = g_new0 (struct cothread_chunk, 1);
-  ret->block_states = g_new0 (enum cothread_block_state, _attr->blocks_per_chunk);
+  ret = g_new0 (cothread_chunk, 1);
+  ret->nblocks = _cothread_attr_global->blocks_per_chunk;
+  ret->block_states = g_new0 (cothread_block_state, ret->nblocks);
   
   if (allocate) {
     if (!posix_memalign(&ret->chunk, size, size))
@@ -83,7 +103,7 @@ cothread_chunk_new (unsigned long size, gboolean allocate)
   } else {
     /* if we don't allocate the chunk, we must already be in it. */
 
-    ret->chunk = (unsigned long) sp &~ (size - 1);
+    ret->chunk = (char*) ((unsigned long) sp &~ (size - 1));
 #if PTH_STACK_GROWTH > 0
     ret->reserved_bottom = sp - ret->chunk;
 #else
@@ -97,51 +117,43 @@ cothread_chunk_new (unsigned long size, gboolean allocate)
   return ret;
 }
 
-gboolean
-cothread_stack_alloc_on_heap (char **low, char **high)
-{
-  *low = g_malloc (_attr->chunk_size / _attr->blocks_per_chunk);
-  *high = *low + sizeof (*low);
-  return TRUE;
-}
-
 /**
  * cothread_stack_alloc_chunked:
  * @chunk: the chunk for the 
  * Make a new cothread stack out of a chunk. Chunks are assumed to be aligned on
- * boundaries of _attr->chunk_size.
+ * boundaries of _cothread_attr_global->chunk_size.
  *
  * Returns: the new cothread context
  */
-  /* we assume that the stack is aligned on _attr->chunk_size boundaries */
+  /* we assume that the stack is aligned on _cothread_attr_global->chunk_size boundaries */
 static gboolean
-cothread_stack_alloc_chunked (struct cothread_chunk *chunk, char **low, char **high, 
-                              (struct cothread_chunk*)(*chunk_new)(struct cothread_chunk*))
+cothread_stack_alloc_chunked (cothread_chunk *chunk, char **low, char **high, 
+                              cothread_chunk *(*chunk_new)(cothread_chunk*))
 {
   int block;
-  struct cothread_chunk *walk, *last;
+  cothread_chunk *walk, *last;
   
   for (walk=chunk; walk; last=walk, walk=walk->next) {
-    if (chunk->block_states[0] == COTHREAD_BLOCK_STATE_UNUSED) {
-      chunk->block_states[0] = COTHREAD_BLOCK_STATE_IN_USE;
+    if (walk->block_states[0] == COTHREAD_BLOCK_STATE_UNUSED) {
+      walk->block_states[0] = COTHREAD_BLOCK_STATE_IN_USE;
 #if PTH_STACK_GROWTH > 0
-      *low  = chunk->chunk + chunk->reserved_bottom;
-      *high = chunk->chunk + chunk->chunk_size / _attr->blocks_per_chunk;
+      *low  = walk->chunk + walk->reserved_bottom;
+      *high = walk->chunk + walk->size / walk->nblocks;
 #else
-      *low  = chunk->chunk + chunk->size * (chunk->nblocks - 1) / chunk->nblocks;
-      *high = chunk->chunk + chunk->size - chunk->reserved_bottom;
+      *low  = walk->chunk + walk->size * (walk->nblocks - 1) / walk->nblocks;
+      *high = walk->chunk + walk->size - walk->reserved_bottom;
 #endif
       return TRUE;
     }
     
-    for (block = 1; block < _attr->blocks_per_chunk; block++) {
-      if (chunk->block_states[block] == COTHREAD_BLOCK_STATE_UNUSED) {
+    for (block = 1; block < walk->nblocks; block++) {
+      if (walk->block_states[block] == COTHREAD_BLOCK_STATE_UNUSED) {
 #if PTH_STACK_GROWTH > 0
-        *low  = chunk->chunk + chunk->size * (chunk->nblocks - block - 1) / chunk->nblocks;
+        *low  = walk->chunk + walk->size * (walk->nblocks - block - 1) / walk->nblocks;
 #else
-        *low  = chunk->chunk + chunk->size * (block - 1) / chunk->nblocks;
+        *low  = walk->chunk + walk->size * (block - 1) / walk->nblocks;
 #endif
-        *high = *low + chunk->size / chunk->nblocks;
+        *high = *low + walk->size / walk->nblocks;
         return TRUE;
       }
     }
@@ -153,41 +165,19 @@ cothread_stack_alloc_chunked (struct cothread_chunk *chunk, char **low, char **h
     return cothread_stack_alloc_chunked (chunk_new (last), low, high, NULL);
 }
 
-gboolean
-cothread_stack_alloc_on_gthread_stack (char **low, char **high)
-{
-  struct cothread_chunk *chunk = NULL;
-  static GStaticPrivate chunk_key = G_STATIC_PRIVATE_INIT;
-  
-  if (!(chunk = g_static_private_get(&chunk_key))) {
-    chunk = cothread_chunk_new (_attr->size, FALSE);
-    g_static_private_set (&chunk_key, chunk, cothread_chunk_free);
-  }
-  
-  return cothread_stack_alloc_chunked (chunk, low, high, NULL);
-}
-
-gboolean
-cothread_stack_alloc_linuxthreads (char **low, char **high)
+static void
+cothread_chunk_free (cothread_chunk *chunk) 
 {
-  struct cothread_chunk *chunk = NULL;
-  static GStaticPrivate chunk_key = G_STATIC_PRIVATE_INIT;
-  
-  if (!(chunk = g_static_private_get(&chunk_key))) {
-    chunk = cothread_chunk_new (_attr->size, FALSE);
-    g_static_private_set (&chunk_key, chunk, cothread_chunk_free);
-  }
-  
-  return cothread_stack_alloc_chunked (chunk, low, high, cothread_chunk_new_linuxthreads);
+  /* FIXME: implement me please */
 }
 
-struct cothread_chunk*
-cothread_chunk_new_linuxthreads (struct cothread_chunk* old)
+static cothread_chunk*
+cothread_chunk_new_linuxthreads (cothread_chunk* old)
 {
-  struct cothread_chunk *new;
+  cothread_chunk *new;
   void *pthread_descr;
   
-  new = cothread_chunk_new (_attr->chunk_size, TRUE);
+  new = cothread_chunk_new (_cothread_attr_global->chunk_size, TRUE);
   pthread_descr = __linuxthreads_self();
 #if PTH_STACK_GROWTH > 0
   /* we don't really know pthread_descr's size in this case, but we can be
@@ -196,12 +186,10 @@ cothread_chunk_new_linuxthreads (struct cothread_chunk* old)
   new->reserved_bottom = 2048;
   memcpy(new->chunk, pthread_descr, 2048);
 #else
-  new->reserved_bottom = ((unsigned long) pthread_descr | (_attr->chunk_size - 1)) - (unsigned long) pthread_descr;
+  new->reserved_bottom = ((unsigned long) pthread_descr | (new->size - 1)) - (unsigned long) pthread_descr;
   memcpy(new->chunk + new->size - new->reserved_bottom - 1, pthread_descr, new->reserved_bottom);
 #endif
   
   old->next = new;
   return new;
 }
-
-    
diff --git a/gst/cothreads/cothreads-private.h b/gst/cothreads/cothreads-private.h
new file mode 100644 (file)
index 0000000..a2d49b4
--- /dev/null
@@ -0,0 +1,35 @@
+/* Pthread-friendly coroutines with pth
+ * Copyright (C) 2002 Andy Wingo <wingo@pobox.com>
+ *
+ * cothread-private.h: private prototypes
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __COTHREAD_PRIVATE_H__
+#define __COTHREAD_PRIVATE_H__
+
+#include <cothreads.h>
+
+
+extern cothread_attr *_cothread_attr_global;
+
+gboolean cothread_stack_alloc_on_gthread_stack (char **low, char **high);
+gboolean cothread_stack_alloc_linuxthreads (char **low, char **high);
+gboolean cothread_stack_alloc_on_heap (char **low, char **high);
+
+
+#endif /* __COTHREAD_PRIVATE_H__ */
diff --git a/gst/cothreads/cothreads.c b/gst/cothreads/cothreads.c
new file mode 100644 (file)
index 0000000..3ea4e8d
--- /dev/null
@@ -0,0 +1,112 @@
+/* Pthread-friendly coroutines with pth
+ * Copyright (C) 2002 Andy Wingo <wingo@pobox.com>
+ *
+ * cothread.c: public API implementation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "cothreads-private.h"
+
+
+#ifdef HAVE_LINUXTHREADS
+static cothread_attr cothread_attr_default = 
+{
+  COTHREAD_ATTR_METHOD_LINUXTHREADS,  /* use the linuxthreads hack */
+  0x200000,                           /* 2 MB */
+  8,                                  /* for a stack size of 256 KB */
+  TRUE                                /* set up the first chunk */
+};
+#else
+static cothread_attr cothread_attr_default = 
+{
+  COTHREAD_ATTR_METHOD_GTHREAD_STACK, /* this is what the old cothreads code does */
+  0x100000,                           /* only 1 MB due the the FreeBSD defaults */
+  8,                                  /* for a stack size of 128 KB */
+  TRUE                                /* set up the first chunk */
+};
+#endif
+
+cothread_attr *_cothread_attr_global = NULL;
+
+static gboolean (*stack_alloc_func) (char**, char**);
+
+cothread*
+cothread_init (cothread_attr *attr)
+{
+  static cothread_attr _attr;
+  
+  if (_cothread_attr_global) {
+    g_warning ("cothread system has already been initialized");
+    return;
+  }
+  
+  if (!attr)
+    _attr = cothread_attr_default;
+  else 
+    _attr = *attr;
+  
+  _cothread_attr_global = &_attr;
+  
+  switch (_cothread_attr_global->method) {
+  case COTHREAD_ATTR_METHOD_MALLOC:
+    stack_alloc_func = cothread_stack_alloc_on_heap;
+    break;
+  case COTHREAD_ATTR_METHOD_GTHREAD_STACK:
+    stack_alloc_func = cothread_stack_alloc_on_gthread_stack;
+    break;
+  case COTHREAD_ATTR_METHOD_LINUXTHREADS:
+    stack_alloc_func = cothread_stack_alloc_linuxthreads;
+    break;
+  default:
+    g_error ("unexpected value for attr method %d", _cothread_attr_global->method);
+  }
+  
+  return cothread_create (NULL);
+}
+
+cothread*
+cothread_create (void (*func)(void))
+{
+  char *low, *high;
+  cothread *ret = g_new0 (cothread, 1);
+  
+  if (!func) {
+    /* we are being asked to save the current thread into a new cothread. this
+     * only happens for the first cothread. */
+    if (_cothread_attr_global->alloc_cothread_0)
+      if (!stack_alloc_func (&low, &high))
+        g_error ("couldn't create cothread 0");
+    
+    pth_mctx_save (ret);
+    return ret;
+  }
+  
+  if (!stack_alloc_func (&low, &high))
+    g_error ("could not allocate a new cothread stack");
+  
+  pth_mctx_set (ret, func, low, high);
+  
+  return ret;
+}
+
+void
+cothread_destroy (cothread *thread)
+{
+  /* FIXME: have method-specific destroy functions. */
+  
+  g_free (thread);
+}
diff --git a/gst/cothreads/cothreads.h b/gst/cothreads/cothreads.h
new file mode 100644 (file)
index 0000000..9429e6a
--- /dev/null
@@ -0,0 +1,55 @@
+/* Pthread-friendly coroutines with pth
+ * Copyright (C) 2002 Andy Wingo <wingo@pobox.com>
+ *
+ * cothread.h: public API
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __COTHREAD_H__
+#define __COTHREAD_H__
+
+#include <glib.h>
+#include <pth_p.h>
+
+
+typedef pth_mctx_t cothread;
+typedef enum _cothread_attr_method cothread_attr_method;
+typedef struct _cothread_attr cothread_attr;
+
+
+enum _cothread_attr_method 
+{
+  COTHREAD_ATTR_METHOD_MALLOC,        /* cothread stacks on the heap, one block per chunk */
+  COTHREAD_ATTR_METHOD_GTHREAD_STACK, /* cothread stacks within the current gthread's stack */
+  COTHREAD_ATTR_METHOD_LINUXTHREADS,  /* a hack that allows for linuxthreads compatibility */
+};
+
+struct _cothread_attr {
+  cothread_attr_method method;
+  int chunk_size;
+  int blocks_per_chunk;
+  gboolean alloc_cothread_0;
+};
+
+
+cothread*      cothread_init           (cothread_attr *attr);
+cothread*      cothread_create         (void (*func)(void));
+void           cothread_destroy        (cothread *thread);
+
+#define cothread_switch(old,new) pth_mctx_switch(old,new)
+
+#endif /* __COTHREAD_H__ */
diff --git a/gst/cothreads/m4/glib.m4 b/gst/cothreads/m4/glib.m4
new file mode 100644 (file)
index 0000000..b8094bb
--- /dev/null
@@ -0,0 +1,196 @@
+# Configure paths for GLIB
+# Owen Taylor     97-11-3
+
+dnl AM_PATH_GLIB([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]])
+dnl Test for GLIB, and define GLIB_CFLAGS and GLIB_LIBS, if "gmodule" or 
+dnl gthread is specified in MODULES, pass to glib-config
+dnl
+AC_DEFUN(AM_PATH_GLIB,
+[dnl 
+dnl Get the cflags and libraries from the glib-config script
+dnl
+AC_ARG_WITH(glib-prefix,[  --with-glib-prefix=PFX   Prefix where GLIB is installed (optional)],
+            glib_config_prefix="$withval", glib_config_prefix="")
+AC_ARG_WITH(glib-exec-prefix,[  --with-glib-exec-prefix=PFX Exec prefix where GLIB is installed (optional)],
+            glib_config_exec_prefix="$withval", glib_config_exec_prefix="")
+AC_ARG_ENABLE(glibtest, [  --disable-glibtest       Do not try to compile and run a test GLIB program],
+                   , enable_glibtest=yes)
+
+  if test x$glib_config_exec_prefix != x ; then
+     glib_config_args="$glib_config_args --exec-prefix=$glib_config_exec_prefix"
+     if test x${GLIB_CONFIG+set} != xset ; then
+        GLIB_CONFIG=$glib_config_exec_prefix/bin/glib-config
+     fi
+  fi
+  if test x$glib_config_prefix != x ; then
+     glib_config_args="$glib_config_args --prefix=$glib_config_prefix"
+     if test x${GLIB_CONFIG+set} != xset ; then
+        GLIB_CONFIG=$glib_config_prefix/bin/glib-config
+     fi
+  fi
+
+  for module in . $4
+  do
+      case "$module" in
+         gmodule) 
+             glib_config_args="$glib_config_args gmodule"
+         ;;
+         gthread) 
+             glib_config_args="$glib_config_args gthread"
+         ;;
+      esac
+  done
+
+  AC_PATH_PROG(GLIB_CONFIG, glib-config, no)
+  min_glib_version=ifelse([$1], ,0.99.7,$1)
+  AC_MSG_CHECKING(for GLIB - version >= $min_glib_version)
+  no_glib=""
+  if test "$GLIB_CONFIG" = "no" ; then
+    no_glib=yes
+  else
+    GLIB_CFLAGS=`$GLIB_CONFIG $glib_config_args --cflags`
+    GLIB_LIBS=`$GLIB_CONFIG $glib_config_args --libs`
+    glib_config_major_version=`$GLIB_CONFIG $glib_config_args --version | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+    glib_config_minor_version=`$GLIB_CONFIG $glib_config_args --version | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+    glib_config_micro_version=`$GLIB_CONFIG $glib_config_args --version | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+    if test "x$enable_glibtest" = "xyes" ; then
+      ac_save_CFLAGS="$CFLAGS"
+      ac_save_LIBS="$LIBS"
+      CFLAGS="$CFLAGS $GLIB_CFLAGS"
+      LIBS="$GLIB_LIBS $LIBS"
+dnl
+dnl Now check if the installed GLIB is sufficiently new. (Also sanity
+dnl checks the results of glib-config to some extent
+dnl
+      rm -f conf.glibtest
+      AC_TRY_RUN([
+#include <glib.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int 
+main ()
+{
+  int major, minor, micro;
+  char *tmp_version;
+
+  system ("touch conf.glibtest");
+
+  /* HP/UX 9 (%@#!) writes to sscanf strings */
+  tmp_version = g_strdup("$min_glib_version");
+  if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
+     printf("%s, bad version string\n", "$min_glib_version");
+     exit(1);
+   }
+
+  if ((glib_major_version != $glib_config_major_version) ||
+      (glib_minor_version != $glib_config_minor_version) ||
+      (glib_micro_version != $glib_config_micro_version))
+    {
+      printf("\n*** 'glib-config --version' returned %d.%d.%d, but GLIB (%d.%d.%d)\n", 
+             $glib_config_major_version, $glib_config_minor_version, $glib_config_micro_version,
+             glib_major_version, glib_minor_version, glib_micro_version);
+      printf ("*** was found! If glib-config was correct, then it is best\n");
+      printf ("*** to remove the old version of GLIB. You may also be able to fix the error\n");
+      printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
+      printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
+      printf("*** required on your system.\n");
+      printf("*** If glib-config was wrong, set the environment variable GLIB_CONFIG\n");
+      printf("*** to point to the correct copy of glib-config, and remove the file config.cache\n");
+      printf("*** before re-running configure\n");
+    } 
+  else if ((glib_major_version != GLIB_MAJOR_VERSION) ||
+          (glib_minor_version != GLIB_MINOR_VERSION) ||
+           (glib_micro_version != GLIB_MICRO_VERSION))
+    {
+      printf("*** GLIB header files (version %d.%d.%d) do not match\n",
+            GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION);
+      printf("*** library (version %d.%d.%d)\n",
+            glib_major_version, glib_minor_version, glib_micro_version);
+    }
+  else
+    {
+      if ((glib_major_version > major) ||
+        ((glib_major_version == major) && (glib_minor_version > minor)) ||
+        ((glib_major_version == major) && (glib_minor_version == minor) && (glib_micro_version >= micro)))
+      {
+        return 0;
+       }
+     else
+      {
+        printf("\n*** An old version of GLIB (%d.%d.%d) was found.\n",
+               glib_major_version, glib_minor_version, glib_micro_version);
+        printf("*** You need a version of GLIB newer than %d.%d.%d. The latest version of\n",
+              major, minor, micro);
+        printf("*** GLIB is always available from ftp://ftp.gtk.org.\n");
+        printf("***\n");
+        printf("*** If you have already installed a sufficiently new version, this error\n");
+        printf("*** probably means that the wrong copy of the glib-config shell script is\n");
+        printf("*** being found. The easiest way to fix this is to remove the old version\n");
+        printf("*** of GLIB, but you can also set the GLIB_CONFIG environment to point to the\n");
+        printf("*** correct copy of glib-config. (In this case, you will have to\n");
+        printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
+        printf("*** so that the correct libraries are found at run-time))\n");
+      }
+    }
+  return 1;
+}
+],, no_glib=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+       CFLAGS="$ac_save_CFLAGS"
+       LIBS="$ac_save_LIBS"
+     fi
+  fi
+  if test "x$no_glib" = x ; then
+     AC_MSG_RESULT(yes)
+     ifelse([$2], , :, [$2])     
+  else
+     AC_MSG_RESULT(no)
+     if test "$GLIB_CONFIG" = "no" ; then
+       echo "*** The glib-config script installed by GLIB could not be found"
+       echo "*** If GLIB was installed in PREFIX, make sure PREFIX/bin is in"
+       echo "*** your path, or set the GLIB_CONFIG environment variable to the"
+       echo "*** full path to glib-config."
+     else
+       if test -f conf.glibtest ; then
+        :
+       else
+          echo "*** Could not run GLIB test program, checking why..."
+          CFLAGS="$CFLAGS $GLIB_CFLAGS"
+          LIBS="$LIBS $GLIB_LIBS"
+          AC_TRY_LINK([
+#include <glib.h>
+#include <stdio.h>
+],      [ return ((glib_major_version) || (glib_minor_version) || (glib_micro_version)); ],
+        [ echo "*** The test program compiled, but did not run. This usually means"
+          echo "*** that the run-time linker is not finding GLIB or finding the wrong"
+          echo "*** version of GLIB. If it is not finding GLIB, you'll need to set your"
+          echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+          echo "*** to the installed location  Also, make sure you have run ldconfig if that"
+          echo "*** is required on your system"
+         echo "***"
+          echo "*** If you have an old version installed, it is best to remove it, although"
+          echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
+          echo "***"
+          echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that"
+          echo "*** came with the system with the command"
+          echo "***"
+          echo "***    rpm --erase --nodeps gtk gtk-devel" ],
+        [ echo "*** The test program failed to compile or link. See the file config.log for the"
+          echo "*** exact error that occured. This usually means GLIB was incorrectly installed"
+          echo "*** or that you have moved GLIB since it was installed. In the latter case, you"
+          echo "*** may want to edit the glib-config script: $GLIB_CONFIG" ])
+          CFLAGS="$ac_save_CFLAGS"
+          LIBS="$ac_save_LIBS"
+       fi
+     fi
+     GLIB_CFLAGS=""
+     GLIB_LIBS=""
+     ifelse([$3], , :, [$3])
+  fi
+  AC_SUBST(GLIB_CFLAGS)
+  AC_SUBST(GLIB_LIBS)
+  rm -f conf.glibtest
+])
diff --git a/gst/cothreads/m4/gst-feature.m4 b/gst/cothreads/m4/gst-feature.m4
new file mode 100644 (file)
index 0000000..a0dc39c
--- /dev/null
@@ -0,0 +1,182 @@
+dnl Perform a check for a feature for GStreamer
+dnl Richard Boulton <richard-alsa@tartarus.org>
+dnl Thomas Vander Stichele <thomas@apestaart.org> added useful stuff
+dnl Last modification: 25/06/2001
+dnl GST_CHECK_FEATURE(FEATURE-NAME, FEATURE-DESCRIPTION,
+dnl                   DEPENDENT-PLUGINS, TEST-FOR-FEATURE,
+dnl                   DISABLE-BY-DEFAULT, ACTION-IF-USE, ACTION-IF-NOTUSE)
+dnl
+dnl This macro adds a command line argument to enable the user to enable
+dnl or disable a feature, and if the feature is enabled, performs a supplied
+dnl test to check if the feature is available.
+dnl
+dnl The test should define HAVE_<FEATURE-NAME> to "yes" or "no" depending
+dnl on whether the feature is available.
+dnl
+dnl The macro will set USE_<FEATURE-NAME> to "yes" or "no" depending on
+dnl whether the feature is to be used.
+dnl Thomas changed this, so that when USE_<FEATURE-NAME> was already set
+dnl to no, then it stays that way.
+dnl
+dnl The macro will call AM_CONDITIONAL(USE_<<FEATURE-NAME>, ...) to allow
+dnl the feature to control what is built in Makefile.ams.  If you want
+dnl additional actions resulting from the test, you can add them with the
+dnl ACTION-IF-USE and ACTION-IF-NOTUSE parameters.
+dnl 
+dnl FEATURE-NAME        is the name of the feature, and should be in
+dnl                     purely upper case characters.
+dnl FEATURE-DESCRIPTION is used to describe the feature in help text for
+dnl                     the command line argument.
+dnl DEPENDENT-PLUGINS   lists any plugins which depend on this feature.
+dnl TEST-FOR-FEATURE    is a test which sets HAVE_<FEATURE-NAME> to "yes"
+dnl                     or "no" depending on whether the feature is
+dnl                     available.
+dnl DISABLE-BY-DEFAULT  if "disabled", the feature is disabled by default,
+dnl                     if any other value, the feature is enabled by default.
+dnl ACTION-IF-USE       any extra actions to perform if the feature is to be
+dnl                     used.
+dnl ACTION-IF-NOTUSE    any extra actions to perform if the feature is not to
+dnl                     be used.
+dnl
+dnl
+dnl thomas :
+dnl we also added a history.  
+dnl GST_PLUGINS_YES will contain all plugins to be built
+dnl                 that were checked through GST_CHECK_FEATURE
+dnl GST_PLUGINS_NO will contain those that won't be built
+
+AC_DEFUN(GST_CHECK_FEATURE,
+[dnl
+builtin(define, [gst_endisable], ifelse($5, [disabled], [enable], [disable]))dnl
+dnl if it is set to NO, then don't even consider it for building
+NOUSE=
+if test "x$USE_[$1]" = "xno"; then
+  NOUSE="yes"
+fi
+AC_ARG_ENABLE(translit([$1], A-Z, a-z),
+  [  ]builtin(format, --%-26s gst_endisable %s, gst_endisable-translit([$1], A-Z, a-z), [$2]ifelse([$3],,,: [$3])),
+  [ case "${enableval}" in
+      yes) USE_[$1]=yes;;
+      no) USE_[$1]=no;;
+      *) AC_MSG_ERROR(bad value ${enableval} for --enable-translit([$1], A-Z, a-z)) ;;
+    esac],
+  [ USE_$1=]ifelse($5, [disabled], [no], [yes]))           dnl DEFAULT
+
+dnl *** set it back to no if it was preset to no
+if test "x$NOUSE" = "xyes"; then
+  USE_[$1]="no"
+  AC_MSG_WARN(*** $3 pre-configured not to be built)
+fi
+NOUSE=
+
+dnl *** If it's enabled
+
+if test x$USE_[$1] = xyes; then
+  gst_check_save_LIBS=$LIBS
+  gst_check_save_LDFLAGS=$LDFLAGS
+  gst_check_save_CFLAGS=$CFLAGS
+  gst_check_save_CPPFLAGS=$CPPFLAGS
+  gst_check_save_CXXFLAGS=$CXXFLAGS
+  HAVE_[$1]=no
+  $4
+  LIBS=$gst_check_save_LIBS
+  LDFLAGS=$gst_check_save_LDFLAGS
+  CFLAGS=$gst_check_save_CFLAGS
+  CPPFLAGS=$gst_check_save_CPPFLAGS
+  CXXFLAGS=$gst_check_save_CXXFLAGS
+
+  dnl If it isn't found, unset USE_[$1]
+  if test x$HAVE_[$1] = xno; then
+    USE_[$1]=no
+  fi
+fi
+dnl *** Warn if it's disabled or not found
+if test x$USE_[$1] = xyes; then
+  ifelse([$6], , :, [$6])
+  GST_PLUGINS_YES="$GST_PLUGINS_YES \n\t[$3]"
+else
+  ifelse([$3], , :, [AC_MSG_NOTICE(
+These plugins will not be built: [$3]
+)])
+  GST_PLUGINS_NO="$GST_PLUGINS_NO \n\t[$3]"
+  ifelse([$7], , :, [$7])
+fi
+dnl *** Define the conditional as appropriate
+AM_CONDITIONAL(USE_[$1], test x$USE_[$1] = xyes)
+])
+
+dnl Use a -config program which accepts --cflags and --libs parameters
+dnl to set *_CFLAGS and *_LIBS and check existence of a feature.
+dnl Richard Boulton <richard-alsa@tartarus.org>
+dnl Last modification: 26/06/2001
+dnl GST_CHECK_CONFIGPROG(FEATURE-NAME, CONFIG-PROG-FILENAME, MODULES)
+dnl
+dnl This check was written for GStreamer: it should be renamed and checked
+dnl for portability if you decide to use it elsewhere.
+dnl
+AC_DEFUN(GST_CHECK_CONFIGPROG,
+[
+  AC_PATH_PROG([$1]_CONFIG, [$2], no)
+  if test x$[$1]_CONFIG = xno; then
+    [$1]_LIBS=
+    [$1]_CFLAGS=
+    HAVE_[$1]=no
+  else
+    [$1]_LIBS=`[$2] --libs [$3]`
+    [$1]_CFLAGS=`[$2] --cflags [$3]`
+    HAVE_[$1]=yes
+  fi
+  AC_SUBST([$1]_LIBS)
+  AC_SUBST([$1]_CFLAGS)
+])
+
+dnl Use AC_CHECK_LIB and AC_CHECK_HEADER to do both tests at once
+dnl sets HAVE_module if we have it
+dnl Richard Boulton <richard-alsa@tartarus.org>
+dnl Last modification: 26/06/2001
+dnl GST_CHECK_LIBHEADER(FEATURE-NAME, LIB NAME, LIB FUNCTION, EXTRA LD FLAGS, 
+dnl                     HEADER NAME, ACTION-IF-FOUND, ACTION-IF-NOT-FOUND)
+dnl
+dnl This check was written for GStreamer: it should be renamed and checked
+dnl for portability if you decide to use it elsewhere.
+dnl
+AC_DEFUN(GST_CHECK_LIBHEADER,
+[
+  AC_CHECK_LIB([$2], [$3], HAVE_[$1]=yes, HAVE_[$1]=no,[$4])
+  if test "x$HAVE_[$1]" = "xyes"; then
+    AC_CHECK_HEADER([$5], :, HAVE_[$1]=no)
+    if test "x$HAVE_[$1]" = "xyes"; then
+      dnl execute what needs to be
+      ifelse([$6], , :, [$6])
+    else
+      ifelse([$7], , :, [$7])
+    fi
+  else
+    AC_MSG_WARN([$1] not found)
+  fi
+  AC_SUBST(HAVE_[$1])
+]
+)
+
+dnl
+dnl Add a subsystem --disable flag and all the necessary symbols and substitions
+dnl
+dnl GST_SUBSYSTEM_DISABLE(SYSNAME, [subsystem name])
+dnl
+AC_DEFUN(GST_SUBSYSTEM_DISABLE,
+[AC_ARG_ENABLE(translit([$1], A-Z, a-z), 
+[  ]builtin(format, --disable-%-17s  disable %s, translit([$1], A-Z, a-z), $2),
+[ case "${enableval}" in
+    yes) GST_DISABLE_[$1]=no ;;
+    no) GST_DISABLE_[$1]=yes ;;
+    *) AC_MSG_ERROR(bad value ${enableval} for --enable-translit([$1], A-Z, a-z)) ;;
+  esac],
+[GST_DISABLE_[$1]=no]) dnl Default value
+if test x$GST_DISABLE_[$1] = xyes; then
+  AC_DEFINE(GST_DISABLE_[$1], 1, [Disable $2])
+  GST_DISABLE_[$1]_DEFINE=-DGST_DISABLE_[$1]
+fi
+AM_CONDITIONAL(GST_DISABLE_[$1], test x$GST_DISABLE_[$1] = xyes)
+AC_SUBST(GST_DISABLE_[$1]_DEFINE)
+GST_SUBSYSTEM_DISABLE_DEFINES="$GST_SUBSYTEM_DISABLE_DEFINES $GST_DISABLE_[$1]_DEFINE"
+])
diff --git a/gst/cothreads/m4/linuxthreads.m4 b/gst/cothreads/m4/linuxthreads.m4
new file mode 100644 (file)
index 0000000..7f65fac
--- /dev/null
@@ -0,0 +1,15 @@
+dnl Check for LinuxThreads
+dnl COTHREADS_CHECK_LINUXTHREADS
+dnl no arguments
+AC_DEFUN([COTHREADS_CHECK_LINUXTHREADS], [
+       AC_CACHE_CHECK([for LinuxThreads],
+               [cothreads_cv_linuxthreads],
+               [AC_EGREP_CPP(pthread_kill_other_threads_np,
+                       [#include <pthread.h>],
+                       [cothreads_cv_linuxthreads=yes],
+                       [cothreads_cv_linuxthreads=no])
+               ])
+       if test $cothreads_cv_linuxthreads = yes; then
+               AC_DEFINE(HAVE_LINUXTHREADS,1,[if you have LinuxThreads])
+       fi
+])
diff --git a/gst/cothreads/m4/pkg.m4 b/gst/cothreads/m4/pkg.m4
new file mode 100644 (file)
index 0000000..874a120
--- /dev/null
@@ -0,0 +1,56 @@
+
+dnl PKG_CHECK_MODULES(GSTUFF, gtk+-2.0 >= 1.3 glib = 1.3.4, action-if, action-not)
+dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page
+dnl also defines GSTUFF_PKG_ERRORS on error
+AC_DEFUN(PKG_CHECK_MODULES, [
+  succeeded=no
+
+  if test -z "$PKG_CONFIG"; then
+    AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
+  fi
+
+  if test "$PKG_CONFIG" = "no" ; then
+     echo "*** The pkg-config script could not be found. Make sure it is"
+     echo "*** in your path, or set the PKG_CONFIG environment variable"
+     echo "*** to the full path to pkg-config."
+     echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config."
+  else
+     if ! $PKG_CONFIG --atleast-pkgconfig-version 0.7.0; then
+        echo "*** Your version of pkg-config is too old. You need version 0.7.0 or newer."
+        echo "*** See http://www.freedesktop.org/software/pkgconfig"
+     else
+        AC_MSG_CHECKING(for $2)
+
+        if $PKG_CONFIG --exists "$2" ; then
+            AC_MSG_RESULT(yes)
+            succeeded=yes
+
+            AC_MSG_CHECKING($1_CFLAGS)
+            $1_CFLAGS=`$PKG_CONFIG --cflags "$2"`
+            AC_MSG_RESULT($$1_CFLAGS)
+
+            AC_MSG_CHECKING($1_LIBS)
+            $1_LIBS=`$PKG_CONFIG --libs "$2"`
+            AC_MSG_RESULT($$1_LIBS)
+        else
+            $1_CFLAGS=""
+            $1_LIBS=""
+            ## If we have a custom action on failure, don't print errors, but 
+            ## do set a variable so people can do so.
+            $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
+            ifelse([$4], ,echo $$1_PKG_ERRORS,)
+        fi
+
+        AC_SUBST($1_CFLAGS)
+        AC_SUBST($1_LIBS)
+     fi
+  fi
+
+  if test $succeeded = yes; then
+     ifelse([$3], , :, [$3])
+  else
+     ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4])
+  fi
+])
+
+
diff --git a/gst/cothreads/m4/pth-acinclude.m4 b/gst/cothreads/m4/pth-acinclude.m4
new file mode 100644 (file)
index 0000000..ad0f6ed
--- /dev/null
@@ -0,0 +1,1765 @@
+dnl ##
+dnl ##  NGPT - Next Generation POSIX Threading
+dnl ##  Copyright (c) 2001 IBM Corporation <babt@us.ibm.com>
+dnl ##  Copyright (c) 1999-2000 Ralf S. Engelschall <rse@engelschall.com>
+dnl ##
+dnl ##  This file is part of NGPT, a non-preemptive thread scheduling
+dnl ##  library which can be found at http://www.ibm.com/developer
+dnl ##
+dnl ##  This library is free software; you can redistribute it and/or
+dnl ##  modify it under the terms of the GNU Lesser General Public
+dnl ##  License as published by the Free Software Foundation; either
+dnl ##  version 2.1 of the License, or (at your option) any later version.
+dnl ##
+dnl ##  This library is distributed in the hope that it will be useful,
+dnl ##  but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl ##  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+dnl ##  Lesser General Public License for more details.
+dnl ##
+dnl ##  You should have received a copy of the GNU Lesser General Public
+dnl ##  License along with this library; if not, write to the Free Software
+dnl ##  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+dnl ##  USA, or contact Bill Abt <babt@us.ibm.com>
+dnl ##
+dnl ##  aclocal.m4: Pth Autoconf macros
+dnl ##
+                        dnl # ``"Reuse an expert's code" is the right
+                        dnl #   advice for most people. But it's a useless 
+                        dnl #   advice for the experts writing the code 
+                        dnl #   in the first place.'
+                        dnl #               -- Dan J. Bernstein
+
+dnl ##
+dnl ##  Display Configuration Headers
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_MSG_PART(<text>)
+dnl ##
+
+define(AC_MSG_PART,[dnl
+if test ".$enable_subdir" != .yes; then
+    AC_MSG_RESULT()
+    AC_MSG_RESULT(${TB}$1:${TN})
+fi
+])dnl
+
+dnl ##
+dnl ##  Display a message under --verbose
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_MSG_VERBOSE(<text>)
+dnl ##
+
+define(AC_MSG_VERBOSE,[dnl
+if test ".$verbose" = .yes; then
+    AC_MSG_RESULT([  $1])
+fi
+])
+
+dnl ##
+dnl ##  Do not display message for a command
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_MSG_SILENT(...)
+dnl ##
+
+define(AC_FD_TMP, 9)
+define(AC_MSG_SILENT,[dnl
+exec AC_FD_TMP>&AC_FD_MSG AC_FD_MSG>/dev/null
+$1
+exec AC_FD_MSG>&AC_FD_TMP AC_FD_TMP>&-
+])
+
+dnl ##
+dnl ##  Perform something only once
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_ONCE(<action>)
+dnl ##
+
+define(AC_ONCE,[
+ifelse(ac_once_$1, already_done, ,[
+    define(ac_once_$1, already_done)
+    $2
+])dnl
+])
+
+dnl ##
+dnl ##  Support for $(S)
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_SRCDIR_PREFIX(<varname>)
+dnl ##
+
+AC_DEFUN(AC_SRCDIR_PREFIX,[
+ac_prog=[$]0
+changequote(, )dnl
+ac_srcdir=`echo $ac_prog | sed -e 's%/[^/][^/]*$%%' -e 's%\([^/]\)/*$%\1%'`
+changequote([, ])dnl
+if test ".$ac_srcdir" = ".$ac_prog"; then
+    ac_srcdir=""
+elif test "x$ac_srcdir" = "x."; then
+    ac_srcdir=""
+else
+    if test ".$CFLAGS" = .; then
+        CFLAGS="-I$ac_srcdir"
+    else
+        CFLAGS="$CFLAGS -I$ac_srcdir"
+    fi
+    ac_srcdir="$ac_srcdir/"
+fi
+$1="$ac_srcdir"
+AC_SUBST($1)
+])dnl
+
+dnl ##
+dnl ##  Support for --enable-subdir (for use with pth.m4)
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_ENABLESUBDIR
+dnl ##
+
+AC_DEFUN(AC_ENABLESUBDIR,[
+AC_ARG_ENABLE(subdir,dnl
+[  --enable-subdir         enable local building as subdirectory (default=no)],[dnl
+],[dnl
+enable_subdir=no
+])dnl
+if test ".$enable_subdir" = .yes; then
+    enable_batch=yes
+    enable_shared=no
+fi
+])dnl
+
+dnl ##
+dnl ##  Support for Configuration Headers
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_HEADLINE(<short-name>, <long-name>,
+dnl ##                <vers-var>, <vers-file>,
+dnl ##                <copyright>)
+dnl ##
+
+AC_DEFUN(AC_HEADLINE,[dnl
+AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)dnl
+#   configuration header
+if test ".`echo dummy [$]@ | grep enable-subdir`" != .; then
+    enable_subdir=yes
+fi
+if test ".`echo dummy [$]@ | grep help`" = .; then
+    #   bootstrapping shtool
+    ac_prog=[$]0
+changequote(, )dnl
+    ac_srcdir=`echo $ac_prog | sed -e 's%/[^/][^/]*$%%' -e 's%\([^/]\)/*$%\1%'`
+changequote([, ])dnl
+    test ".$ac_srcdir" = ".$ac_prog" && ac_srcdir=.
+    ac_shtool="${CONFIG_SHELL-/bin/sh} $ac_srcdir/shtool"
+
+    #   find out terminal sequences
+    if test ".$enable_subdir" != .yes; then
+        TB=`$ac_shtool echo -n -e %B 2>/dev/null`
+        TN=`$ac_shtool echo -n -e %b 2>/dev/null`
+    else
+        TB=''
+        TN=''
+    fi
+
+    #   find out package version
+    $3_STR="`$ac_shtool version -lc -dlong $ac_srcdir/$4`"
+    AC_SUBST($3_STR)
+
+    #   friendly header ;)
+    if test ".$enable_subdir" != .yes; then
+        echo "Configuring ${TB}$1${TN} ($2), Version ${TB}${$3_STR}${TN}"
+        echo "$5"
+    fi
+
+    #   additionally find out hex version
+    $3_HEX="`$ac_shtool version -lc -dhex $ac_srcdir/$4`"
+    AC_SUBST($3_HEX)
+fi
+AC_DIVERT_POP()
+])dnl
+
+dnl ##
+dnl ##  Support for Platform IDs
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_PLATFORM(<variable>)
+dnl ##
+
+AC_DEFUN(AC_PLATFORM,[
+if test ".$host" != .NONE; then
+    $1="$host"
+elif test ".$nonopt" != .NONE; then
+    $1="$nonopt"
+else
+    $1=`${CONFIG_SHELL-/bin/sh} $srcdir/config.guess`
+fi
+$1=`${CONFIG_SHELL-/bin/sh} $srcdir/config.sub $$1` || exit 1
+AC_SUBST($1)
+if test ".$enable_subdir" != .yes; then
+    echo "Platform: ${TB}${$1}${TN}"
+fi
+])dnl
+
+dnl ##
+dnl ##  Support for config.param files
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_CONFIG_PARAM(<file>)
+dnl ##
+
+AC_DEFUN(AC_CONFIG_PARAM,[
+AC_DIVERT_PUSH(-1)
+AC_ARG_WITH(param,[  --with-param=ID[,ID,..] load parameters from $1])
+AC_DIVERT_POP()
+AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)
+ac_prev=""
+ac_param=""
+if test -f $1; then
+    ac_param="$1:common"
+fi
+for ac_option
+do
+    if test ".$ac_prev" != .; then
+        eval "$ac_prev=\$ac_option"
+        ac_prev=""
+        continue
+    fi
+    case "$ac_option" in
+        -*=*) ac_optarg=`echo "$ac_option" | sed 's/[[-_a-zA-Z0-9]]*=//'` ;;
+           *) ac_optarg="" ;;
+    esac
+    case "$ac_option" in
+        --with-param=* )
+            case $ac_optarg in
+                *:* )
+                    ac_from=`echo $ac_optarg | sed -e 's/:.*//'`
+                    ac_what=`echo $ac_optarg | sed -e 's/.*://'`
+                    ;;
+                * )
+                    ac_from="$1"
+                    ac_what="$ac_optarg"
+                    ;;
+            esac
+            if test ".$ac_param" = .; then
+                ac_param="$ac_from:$ac_what"
+            else
+                ac_param="$ac_param,$ac_from:$ac_what"
+            fi
+            ;;
+    esac
+done
+if test ".$ac_param" != .; then
+    # echo "loading parameters"
+    OIFS="$IFS"
+    IFS=","
+    pconf="/tmp/autoconf.$$"
+    echo "ac_options=''" >$pconf
+    ac_from="$1"
+    for ac_section in $ac_param; do
+        changequote(, )
+        case $ac_section in
+            *:* )
+                ac_from=`echo "$ac_section" | sed -e 's/:.*//'`
+                ac_section=`echo "$ac_section" | sed -e 's/.*://'`
+                ;;
+        esac
+        (echo ''; cat $ac_from; echo '') |\
+        sed -e "1,/[   ]*[     ]*${ac_section}[        ]*{[    ]*/d" \
+            -e '/[     ]*}[    ]*/,$d' \
+            -e ':join' -e '/\\[        ]*$/N' -e 's/\\[        ]*\n[   ]*//' -e 'tjoin' \
+            -e 's/^[   ]*//g' \
+            -e 's/^\([^-].*=.*\) IF \(.*\)$/if \2; then \1; fi/' \
+            -e 's/^\(--.*=.*\) IF \(.*\)$/if \2; then ac_options="$ac_options \1"; fi/' \
+            -e 's/^\(--.*\) IF \(.*\)$/if \2; then ac_options="$ac_options \1"; fi/' \
+            -e 's/^\(--.*=.*\)$/ac_options="$ac_options \1"/' \
+            -e 's/^\(--.*\)$/ac_options="$ac_options \1"/' \
+            >>$pconf
+        changequote([, ])
+    done
+    IFS="$OIFS"
+    . $pconf
+    rm -f $pconf >/dev/null 2>&1
+    if test ".[$]*" = .; then
+        set -- $ac_options
+    else
+        set -- "[$]@" $ac_options
+    fi
+fi
+AC_DIVERT_POP()
+])dnl
+
+dnl ##
+dnl ##  Check whether compiler option works
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_COMPILER_OPTION(<name>, <display>, <option>,
+dnl ##                       <action-success>, <action-failure>)
+dnl ##
+
+AC_DEFUN(AC_COMPILER_OPTION,[dnl
+AC_MSG_CHECKING(for compiler option $2)
+AC_CACHE_VAL(ac_cv_compiler_option_$1,[
+cat >conftest.$ac_ext <<EOF
+int main() { return 0; }
+EOF
+${CC-cc} -c $CFLAGS $CPPFLAGS $3 conftest.$ac_ext 1>conftest.out 2>conftest.err
+if test $? -ne 0 -o -s conftest.err; then
+     ac_cv_compiler_option_$1=no
+else
+     ac_cv_compiler_option_$1=yes
+fi
+rm -f conftest.$ac_ext conftest.out conftest.err
+])dnl
+if test ".$ac_cv_compiler_option_$1" = .yes; then
+    ifelse([$4], , :, [$4])
+else
+    ifelse([$5], , :, [$5])
+fi
+AC_MSG_RESULT([$ac_cv_compiler_option_$1])
+])dnl
+
+dnl ##
+dnl ##  Check whether `long long' and `long double' type exists
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_CHECK_LONGLONG
+dnl ##    AC_CHECK_LONGDOUBLE
+dnl ##
+
+AC_DEFUN(AC_CHECK_LONGLONG,[dnl
+AC_MSG_CHECKING(for built-in type long long)
+ AC_CACHE_VAL(ac_cv_type_longlong,[
+  AC_TRY_LINK([
+#include <sys/types.h>
+  ],[
+    long long X = 2, Y = 1, Z;
+    Z = X / Y; 
+  ],
+    AC_DEFINE(HAVE_LONGLONG)
+    ac_cv_type_longlong=yes, 
+    ac_cv_type_longlong=no
+  )dnl
+ ])dnl
+AC_MSG_RESULT([$ac_cv_type_longlong])
+])dnl
+
+AC_DEFUN(AC_CHECK_LONGDOUBLE,[dnl
+AC_MSG_CHECKING(for built-in type long double)
+ AC_CACHE_VAL(ac_cv_type_longdouble,[
+  AC_TRY_LINK([
+#include <sys/types.h>
+  ],[
+    long double X = 2, Y = 1, Z;
+    Z = X / Y; 
+  ],
+    AC_DEFINE(HAVE_LONGDOUBLE)
+    ac_cv_type_longdouble=yes, 
+    ac_cv_type_longdouble=no
+  )dnl
+ ])dnl
+AC_MSG_RESULT([$ac_cv_type_longdouble])
+])dnl
+
+dnl ##
+dnl ##  Minimalistic Libtool Glue Code
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_PROG_LIBTOOL(<platform-variable>)
+dnl ##
+
+AC_DEFUN(AC_PROG_LIBTOOL,[dnl
+AC_ARG_ENABLE(static,dnl
+[  --enable-static         build static libraries (default=yes)],
+enable_static="$enableval",
+if test ".$enable_static" = .; then
+    enable_static=yes
+fi
+)dnl
+AC_ARG_ENABLE(shared,dnl
+[  --enable-shared         build shared libraries (default=yes)],
+enable_shared="$enableval",
+if test ".$enable_shared" = .; then
+    enable_shared=yes
+fi
+)dnl
+libtool_flags=''
+dnl libtool_flags="$libtool_flags --cache-file=$cache_file"
+test ".$silent"            = .yes && libtool_flags="$libtool_flags --silent"
+test ".$enable_static"     = .no  && libtool_flags="$libtool_flags --disable-static"
+test ".$enable_shared"     = .no  && libtool_flags="$libtool_flags --disable-shared"
+test ".$ac_cv_prog_gcc"    = .yes && libtool_flags="$libtool_flags --with-gcc"
+test ".$ac_cv_prog_gnu_ld" = .yes && libtool_flags="$libtool_flags --with-gnu-ld"
+CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" LD="$LD" \
+${CONFIG_SHELL-/bin/sh} $srcdir/ltconfig --no-reexec \
+$libtool_flags --srcdir=$srcdir --no-verify $srcdir/ltmain.sh $1 ||\
+AC_MSG_ERROR([libtool configuration failed])
+dnl (AC_CACHE_LOAD) >/dev/null 2>&1
+])dnl
+
+dnl ##
+dnl ##  Disable kernel patch warning
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_CHECK_KERNEL_PATCH_WARNING
+dnl ##
+
+AC_DEFUN(AC_CHECK_KERNEL_PATCH_WARNING,[dnl
+AC_ARG_ENABLE(kernel-patch,dnl
+[  --disable-kernel-patch-warning   disable kernel patch warning(default=no)],
+[dnl
+AC_DEFINE(PTH_NO_PATCH_WARNING)
+msg="disabled"
+],[
+msg="enabled"
+])dnl
+AC_MSG_CHECKING(for 2.4 kernel patch warning)
+AC_MSG_RESULT([$msg])
+])
+
+dnl ##
+dnl ##  Verbose Debugging Support
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_CHECK_VERBOSE_DEBUGGING
+dnl ##
+
+AC_DEFUN(AC_CHECK_VERBOSE_DEBUGGING,[dnl
+AC_ARG_ENABLE(verbose-debug,dnl
+[  --enable-verbose-debug          build for verbose debugging (default=no)],
+[dnl
+if test ".$ac_cv_prog_gcc" = ".yes"; then
+    case "$CFLAGS" in
+        *-O* ) ;;
+           * ) CFLAGS="$CFLAGS -O2" ;;
+    esac
+    case "$CFLAGS" in
+        *-g* ) ;;
+           * ) CFLAGS="$CFLAGS -g" ;;
+    esac
+    case "$CFLAGS" in
+        *-pipe* ) ;;
+              * ) AC_COMPILER_OPTION(pipe, -pipe, -pipe, CFLAGS="$CFLAGS -pipe") ;;
+    esac
+    AC_COMPILER_OPTION(ggdb3, -ggdb3, -ggdb3, CFLAGS="$CFLAGS -ggdb3")
+    case $PLATFORM in
+        *-*-freebsd*|*-*-solaris* ) CFLAGS="$CFLAGS -pedantic" ;;
+    esac
+    CFLAGS="$CFLAGS -Wall"
+    WMORE="-Wshadow -Wpointer-arith -Wcast-align -Winline -Wno-unused-function"
+    WMORE="$WMORE -Wmissing-prototypes -Wmissing-declarations -Wnested-externs"
+    AC_COMPILER_OPTION(wmore, -W<xxx>, $WMORE, CFLAGS="$CFLAGS $WMORE")
+    AC_COMPILER_OPTION(wnolonglong, -Wno-long-long, -Wno-long-long, CFLAGS="$CFLAGS -Wno-long-long")
+else
+    case "$CFLAGS" in
+        *-g* ) ;;
+           * ) CFLAGS="$CFLAGS -g" ;;
+    esac
+fi
+msg="enabled"
+AC_DEFINE(PTH_DEBUG)
+],[
+if test ".$ac_cv_prog_gcc" = ".yes"; then
+case "$CFLAGS" in
+    *-pipe* ) ;;
+          * ) AC_COMPILER_OPTION(pipe, -pipe, -pipe, CFLAGS="$CFLAGS -pipe") ;;
+esac
+fi
+case "$CFLAGS" in
+    *-g* ) CFLAGS=`echo "$CFLAGS" |\
+                   sed -e 's/ -g / /g' -e 's/ -g$//' -e 's/^-g //g' -e 's/^-g$//'` ;;
+esac
+case "$CXXFLAGS" in
+    *-g* ) CXXFLAGS=`echo "$CXXFLAGS" |\
+                     sed -e 's/ -g / /g' -e 's/ -g$//' -e 's/^-g //g' -e 's/^-g$//'` ;;
+esac
+msg="disabled"
+])dnl
+AC_MSG_CHECKING(for compilation debug mode)
+AC_MSG_RESULT([$msg])
+    case $PLATFORM in
+        *-*-mvs* ) 
+           # Don't turn off shared libaries on OS/390.
+           ;;
+       * )
+           if test ".$msg" = .enabled; then
+             enable_shared=no
+           fi
+           ;;
+       esac
+])
+
+dnl ##
+dnl ##  Standard Debugging Support
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_CHECK_STD_DEBUGGING
+dnl ##
+
+AC_DEFUN(AC_CHECK_STD_DEBUGGING,[dnl
+AC_ARG_ENABLE(debug,dnl
+[  --enable-debug          build for debugging (default=no)],
+[dnl
+if test ".$ac_cv_prog_gcc" = ".yes"; then
+    case "$CFLAGS" in
+        *-O* ) ;;
+           * ) CFLAGS="$CFLAGS -O2" ;;
+    esac
+    case "$CFLAGS" in
+        *-g* ) ;;
+           * ) CFLAGS="$CFLAGS -g" ;;
+    esac
+    case "$CFLAGS" in
+        *-pipe* ) ;;
+              * ) AC_COMPILER_OPTION(pipe, -pipe, -pipe, CFLAGS="$CFLAGS -pipe") ;;
+    esac
+    AC_COMPILER_OPTION(ggdb3, -ggdb3, -ggdb3, CFLAGS="$CFLAGS -ggdb3")
+    case $PLATFORM in
+        *-*-freebsd*|*-*-solaris* ) CFLAGS="$CFLAGS -pedantic" ;;
+    esac
+    CFLAGS="$CFLAGS -DASSERTS_ON -Wall"
+    WMORE="-Wshadow -Wpointer-arith -Wcast-align -Winline -Wno-unused-function"
+    WMORE="$WMORE -Wmissing-prototypes -Wmissing-declarations -Wnested-externs"
+    AC_COMPILER_OPTION(wmore, -W<xxx>, $WMORE, CFLAGS="$CFLAGS $WMORE")
+    AC_COMPILER_OPTION(wnolonglong, -Wno-long-long, -Wno-long-long, CFLAGS="$CFLAGS -Wno-long-long")
+else
+    case "$CFLAGS" in
+        *-g* ) ;;
+           * ) CFLAGS="$CFLAGS -g" ;;
+    esac
+fi
+msg="enabled"
+],[
+if test ".$ac_cv_prog_gcc" = ".yes"; then
+case "$CFLAGS" in
+    *-pipe* ) ;;
+          * ) AC_COMPILER_OPTION(pipe, -pipe, -pipe, CFLAGS="$CFLAGS -pipe") ;;
+esac
+fi
+case "$CFLAGS" in
+    *-g* ) CFLAGS=`echo "$CFLAGS" |\
+                   sed -e 's/ -g / /g' -e 's/ -g$//' -e 's/^-g //g' -e 's/^-g$//'` ;;
+esac
+case "$CXXFLAGS" in
+    *-g* ) CXXFLAGS=`echo "$CXXFLAGS" |\
+                     sed -e 's/ -g / /g' -e 's/ -g$//' -e 's/^-g //g' -e 's/^-g$//'` ;;
+esac
+msg="disabled"
+])dnl
+AC_MSG_CHECKING(for compilation debug mode)
+AC_MSG_RESULT([$msg])
+    case $PLATFORM in
+       * )
+           ;;
+       esac
+])
+
+dnl ##
+dnl ##  Profiling Support
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_CHECK_PROFILING
+dnl ##
+
+AC_DEFUN(AC_CHECK_PROFILING,[dnl
+AC_MSG_CHECKING(for compilation profile mode)
+AC_ARG_ENABLE(profile,dnl
+[  --enable-profile        build for profiling (default=no)],
+[dnl
+if test ".$ac_cv_prog_gcc" = ".no"; then
+    AC_MSG_ERROR([profiling requires gcc and gprof])
+fi
+CFLAGS=`echo "$CFLAGS" | sed -e 's/-O2//g'`
+CFLAGS="$CFLAGS -O0 -pg"
+LDFLAGS="$LDFLAGS -pg"
+msg="enabled"
+],[
+msg="disabled"
+])dnl
+AC_MSG_RESULT([$msg])
+if test ".$msg" = .enabled; then
+    enable_shared=no
+fi
+])
+
+dnl ##
+dnl ##  Build Parameters
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_CHECK_BUILDPARAM
+dnl ##
+
+AC_DEFUN(AC_CHECK_BUILDPARAM,[dnl
+dnl #   determine build mode
+AC_MSG_CHECKING(whether to activate batch build mode)
+AC_ARG_ENABLE(batch,dnl
+[  --enable-batch          enable batch build mode (default=no)],[dnl
+],[dnl
+enable_batch=no
+])dnl
+if test ".$silent" = .yes; then
+    enable_batch=yes
+fi
+AC_MSG_RESULT([$enable_batch])
+BATCH="$enable_batch"
+AC_SUBST(BATCH)
+dnl #   determine build targets
+TARGET_ALL='$(TARGET_PREQ) $(TARGET_LIBS)'
+AC_MSG_CHECKING(whether to activate maintainer build targets)
+AC_ARG_ENABLE(maintainer,dnl
+[  --enable-maintainer     enable maintainer build targets (default=no)],[dnl
+],[dnl
+enable_maintainer=no
+])dnl
+AC_MSG_RESULT([$enable_maintainer])
+if test ".$enable_maintainer" = .yes; then
+    TARGET_ALL="$TARGET_ALL \$(TARGET_MANS)"
+fi
+AC_MSG_CHECKING(whether to activate test build targets)
+AC_ARG_ENABLE(tests,dnl
+[  --enable-tests          enable test build targets (default=yes)],[dnl
+],[dnl
+enable_tests=yes
+])dnl
+AC_MSG_RESULT([$enable_tests])
+if test ".$enable_tests" = .yes; then
+    TARGET_ALL="$TARGET_ALL \$(TARGET_TEST)"
+fi
+AC_SUBST(TARGET_ALL)
+])
+
+dnl ##
+dnl ##  Optimization Support
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_CHECK_OPTIMIZE
+dnl ##
+
+AC_DEFUN(AC_CHECK_OPTIMIZE,[dnl
+AC_ARG_ENABLE(optimize,dnl
+[  --enable-optimize       build with optimization (default=no)],
+[dnl
+if test ".$ac_cv_prog_gcc" = ".yes"; then
+    #  compiler is gcc
+    case "$CFLAGS" in
+        *-O* ) ;;
+        * ) CFLAGS="$CFLAGS -O2" ;;
+    esac
+    case "$CFLAGS" in
+        *-pipe* ) ;;
+        * ) AC_COMPILER_OPTION(pipe, -pipe, -pipe, CFLAGS="$CFLAGS -pipe") ;;
+    esac
+    OPT_CFLAGS='-funroll-loops -fstrength-reduce -fomit-frame-pointer -ffast-math'
+    AC_COMPILER_OPTION(optimize_std, [-f<xxx> for optimizations], $OPT_CFLAGS, CFLAGS="$CFLAGS $OPT_CFLAGS")
+    case $PLATFORM in
+        i?86*-*-*|?86*-*-* )
+            OPT_CFLAGS='-malign-functions=4 -malign-jumps=4 -malign-loops=4' 
+            AC_COMPILER_OPTION(optimize_x86, [-f<xxx> for Intel x86 CPU], $OPT_CFLAGS, CFLAGS="$CFLAGS $OPT_CFLAGS")
+            ;;
+    esac
+else
+    #  compiler is NOT gcc
+    case "$CFLAGS" in
+        *-O* ) ;;
+           * ) CFLAGS="$CFLAGS -O" ;;
+    esac
+    case $PLATFORM in
+        *-*-solaris* )
+            AC_COMPILER_OPTION(fast, -fast, -fast, CFLAGS="$CFLAGS -fast")
+            ;;
+    esac
+fi
+msg="enabled"
+],[
+msg="disabled"
+])dnl
+AC_MSG_CHECKING(for compilation optimization mode)
+AC_MSG_RESULT([$msg])
+])
+
+dnl ##
+dnl ##  Check for a pre-processor define in a header
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_CHECK_DEFINE(<define>, <header>)
+dnl ##  acconfig.h:
+dnl ##    #undef HAVE_<define>
+dnl ##
+
+AC_DEFUN(AC_CHECK_DEFINE,[dnl
+AC_MSG_CHECKING(for define $1 in $2)
+AC_CACHE_VAL(ac_cv_define_$1,
+[AC_EGREP_CPP([YES_IS_DEFINED], [
+#include <$2>
+#ifdef $1
+YES_IS_DEFINED
+#endif
+], ac_cv_define_$1=yes, ac_cv_define_$1=no)])dnl
+AC_MSG_RESULT($ac_cv_define_$1)
+if test $ac_cv_define_$1 = yes; then
+    AC_DEFINE(HAVE_[]translit($1, [a-z], [A-Z]))
+fi
+])
+
+dnl ##
+dnl ##  Check for an ANSI C typedef in a header
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_CHECK_TYPEDEF(<typedef>, <header>)
+dnl ##  acconfig.h:
+dnl ##    #undef HAVE_<typedef>
+dnl ##
+
+AC_DEFUN(AC_CHECK_TYPEDEF,[dnl
+AC_REQUIRE([AC_HEADER_STDC])dnl
+AC_MSG_CHECKING(for typedef $1)
+AC_CACHE_VAL(ac_cv_typedef_$1,
+[AC_EGREP_CPP(dnl
+changequote(<<,>>)dnl
+<<(^|[^a-zA-Z_0-9])$1[^a-zA-Z_0-9]>>dnl
+changequote([,]), [
+#include <$2>
+], ac_cv_typedef_$1=yes, ac_cv_typedef_$1=no)])dnl
+AC_MSG_RESULT($ac_cv_typedef_$1)
+if test $ac_cv_typedef_$1 = yes; then
+    AC_DEFINE(HAVE_[]translit($1, [a-z], [A-Z]))
+fi
+])
+
+dnl ##
+dnl ##  Check for an ANSI C struct attribute in a structure defined in a header
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_CHECK_STRUCTATTR(<attr>, <struct>, <header>)
+dnl ##  acconfig.h:
+dnl ##    #undef HAVE_<attr>
+dnl ##
+
+AC_DEFUN(AC_CHECK_STRUCTATTR,[dnl
+AC_REQUIRE([AC_HEADER_STDC])dnl
+AC_MSG_CHECKING(for attribute $1 in struct $2 from $3)
+AC_CACHE_VAL(ac_cv_structattr_$1,[dnl
+
+AC_TRY_LINK([
+#include <sys/types.h>
+#include <$3>
+],[
+struct $2 *sp1;
+struct $2 *sp2;
+sp1->$1 = sp2->$1;
+], ac_cv_structattr_$1=yes, ac_cv_structattr_$1=no)])dnl
+AC_MSG_RESULT($ac_cv_structattr_$1)
+if test $ac_cv_structattr_$1 = yes; then
+    AC_DEFINE(HAVE_[]translit($1, [a-z], [A-Z]))
+fi
+])
+
+dnl ##
+dnl ##  Check for argument type of a function
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_CHECK_ARGTYPE(<header> [...], <func>, <arg-number>,
+dnl ##                     <max-arg-number>, <action-with-${ac_type}>)
+dnl ##
+
+AC_DEFUN(AC_CHECK_ARGTYPE,[dnl
+AC_REQUIRE_CPP()dnl
+AC_MSG_CHECKING([for type of argument $3 for $2()])
+AC_CACHE_VAL([ac_cv_argtype_$2$3],[
+cat >conftest.$ac_ext <<EOF
+[#]line __oline__ "configure"
+#include "confdefs.h"
+EOF
+for ifile in $1; do
+    echo "#include <$ifile>" >>conftest.$ac_ext
+done
+gpat=''
+spat=''
+i=1
+changequote(, )dnl
+while test $i -le $4; do
+    gpat="$gpat[^,]*"
+    if test $i -eq $3; then
+        spat="$spat\\([^,]*\\)"
+    else
+        spat="$spat[^,]*"
+    fi
+    if test $i -lt $4; then
+        gpat="$gpat,"
+        spat="$spat,"
+    fi
+    i=`expr $i + 1`
+done
+(eval "$ac_cpp conftest.$ac_ext") 2>&AC_FD_CC |\
+sed -e ':join' \
+    -e '/,[    ]*$/N' \
+    -e 's/,[   ]*\n[   ]*/, /' \
+    -e 'tjoin' |\
+egrep "[^a-zA-Z0-9_]$2[        ]*\\($gpat\\)" | head -1 |\
+sed -e "s/.*[^a-zA-Z0-9_]$2[   ]*($spat).*/\\1/" \
+    -e 's/(\*[a-zA-Z_][a-zA-Z_0-9]*)/(*)/' \
+    -e 's/^[   ]*//' -e 's/[   ]*$//' \
+    -e 's/^/arg:/' \
+    -e 's/^arg:\([^    ]*\)$/type:\1/' \
+    -e 's/^arg:\(.*_t\)*$/type:\1/' \
+    -e 's/^arg:\(.*\*\)$/type:\1/' \
+    -e 's/^arg:\(.*[   ]\*\)[_a-zA-Z][_a-zA-Z0-9]*$/type:\1/' \
+    -e 's/^arg:\(.*[   ]char\)$/type:\1/' \
+    -e 's/^arg:\(.*[   ]short\)$/type:\1/' \
+    -e 's/^arg:\(.*[   ]int\)$/type:\1/' \
+    -e 's/^arg:\(.*[   ]long\)$/type:\1/' \
+    -e 's/^arg:\(.*[   ]float\)$/type:\1/' \
+    -e 's/^arg:\(.*[   ]double\)$/type:\1/' \
+    -e 's/^arg:\(.*[   ]unsigned\)$/type:\1/' \
+    -e 's/^arg:\(.*[   ]signed\)$/type:\1/' \
+    -e 's/^arg:\(.*struct[     ][_a-zA-Z][_a-zA-Z0-9]*\)$/type:\1/' \
+    -e 's/^arg:\(.*\)[         ]_[_a-zA-Z0-9]*$/type:\1/' \
+    -e 's/^arg:\(.*\)[         ]\([^   ]*\)$/type:\1/' \
+    -e 's/^type://' >conftest.output
+ac_cv_argtype_$2$3=`cat conftest.output`
+changequote([, ])dnl
+rm -f conftest*
+])
+AC_MSG_RESULT([$ac_cv_argtype_$2$3])
+ac_type="$ac_cv_argtype_$2$3"
+[$5]
+])
+
+dnl ##
+dnl ##  Check for existance of a function
+dnl ##
+dnl ##  configure.in:
+dnl ##     AC_CHECK_FUNCTION(<function> [, <action-if-found> [, <action-if-not-found>]])
+dnl ##     AC_CHECK_FUNCTIONS(<function> [...] [, <action-if-found> [, <action-if-not-found>]])
+dnl ##
+
+AC_DEFUN(AC_CHECK_FUNCTIONS,[dnl
+for ac_func in $1; do
+    AC_CHECK_FUNCTION($ac_func,
+        [changequote(, )dnl
+        ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+        changequote([, ])dnl
+        AC_DEFINE_UNQUOTED($ac_tr_func) $2], $3)dnl
+done
+])
+
+AC_DEFUN(AC_CHECK_FUNCTION, [dnl
+AC_MSG_CHECKING([for function $1])
+AC_CACHE_VAL(ac_cv_func_$1, [dnl
+AC_TRY_LINK([
+/* System header to define __stub macros and hopefully few prototypes,
+   which can conflict with char $1(); below. */
+#include <assert.h>
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply. */
+char $1();
+char (*f)();
+], [
+/* The GNU C library defines this for functions which it implements
+   to always fail with ENOSYS.  Some functions are actually named
+   something starting with __ and the normal name is an alias. */
+#if defined (__stub_$1) || defined (__stub___$1)
+choke me
+#else
+f = $1;
+#endif
+], eval "ac_cv_func_$1=yes", eval "ac_cv_func_$1=no")])
+if eval "test \"`echo '$ac_cv_func_'$1`\" = yes"; then
+  AC_MSG_RESULT(yes)
+  ifelse([$2], , :, [$2])
+else
+  AC_MSG_RESULT(no)
+ifelse([$3], , , [$3
+])dnl
+fi
+])
+
+dnl ##
+dnl ##  Decision Hierachy
+dnl ##
+
+define(AC_IFALLYES,[dnl
+ac_rc=yes
+for ac_spec in $1; do
+    ac_type=`echo "$ac_spec" | sed -e 's/:.*$//'`
+    ac_item=`echo "$ac_spec" | sed -e 's/^.*://'`
+    case $ac_type in
+        header [)]
+            ac_item=`echo "$ac_item" | sed 'y%./+-%__p_%'`
+            ac_var="ac_cv_header_$ac_item"
+            ;;
+        file [)]
+            ac_item=`echo "$ac_item" | sed 'y%./+-%__p_%'`
+            ac_var="ac_cv_file_$ac_item"
+            ;;
+        func    [)] ac_var="ac_cv_func_$ac_item"   ;;
+        lib     [)] ac_var="ac_cv_lib_$ac_item"    ;;
+        define  [)] ac_var="ac_cv_define_$ac_item" ;;
+        typedef [)] ac_var="ac_cv_typedef_$ac_item" ;;
+        custom  [)] ac_var="$ac_item" ;;
+    esac
+    eval "ac_val=\$$ac_var"
+    if test ".$ac_val" != .yes; then
+        ac_rc=no
+        break
+    fi
+done
+if test ".$ac_rc" = .yes; then
+    :
+    $2
+else
+    :
+    $3
+fi
+])
+
+define(AC_BEGIN_DECISION,[dnl
+ac_decision_item='$1'
+ac_decision_msg='FAILED'
+ac_decision=''
+])
+
+define(AC_DECIDE,[dnl
+ac_decision='$1'
+ac_decision_msg='$2'
+ac_decision_$1=yes
+ac_decision_$1_msg='$2'
+])
+
+define(AC_DECISION_OVERRIDE,[dnl
+    ac_decision=''
+    for ac_item in $1; do
+         eval "ac_decision_this=\$ac_decision_${ac_item}"
+         if test ".$ac_decision_this" = .yes; then
+             ac_decision=$ac_item
+             eval "ac_decision_msg=\$ac_decision_${ac_item}_msg"
+         fi
+    done
+])
+
+define(AC_DECISION_FORCE,[dnl
+ac_decision="$1"
+eval "ac_decision_msg=\"\$ac_decision_${ac_decision}_msg\""
+])
+
+define(AC_END_DECISION,[dnl
+if test ".$ac_decision" = .; then
+    echo "[$]0:Error: decision on $ac_decision_item failed." 1>&2
+    echo "[$]0:Hint: see config.log for more details!" 1>&2
+    exit 1
+else
+    if test ".$ac_decision_msg" = .; then
+        ac_decision_msg="$ac_decision"
+    fi
+    AC_MSG_RESULT([decision on $ac_decision_item... ${TB}$ac_decision_msg${TN}])
+fi
+])
+
+dnl ##
+dnl ##  Check for existance of a file
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_TEST_FILE(<file>, <success-action>, <failure-action>)
+dnl ##
+
+AC_DEFUN(AC_TEST_FILE, [
+ac_safe=`echo "$1" | sed 'y%./+-%__p_%'`
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(ac_cv_file_$ac_safe, [
+if test -r $1; then
+    eval "ac_cv_file_$ac_safe=yes"
+else
+    eval "ac_cv_file_$ac_safe=no"
+fi
+])dnl
+if eval "test \"`echo '$ac_cv_file_'$ac_safe`\" = yes"; then
+    AC_MSG_RESULT(yes)
+    ifelse([$2], , :, [$2])
+else
+    AC_MSG_RESULT(no)
+    ifelse([$3], , :, [$3])
+fi
+])
+
+dnl ##
+dnl ##  Check for socket/network size type
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_CHECK_SOCKLENTYPE(<action-with-${ac_type}>)
+dnl ##
+
+dnl #   Background:
+dnl #   this exists because of shortsightedness on the POSIX committee.
+dnl #   BSD systems used "int *" as the parameter to accept(2),
+dnl #   getsockname(2), getpeername(2) et al. Consequently many Unix
+dnl #   flavors took an "int *" for that parameter. The POSIX committee
+dnl #   decided that "int" was just too generic and had to be replaced
+dnl #   with "size_t" almost everywhere. There's no problem with that
+dnl #   when you're passing by value. But when you're passing by
+dnl #   reference (as it is the case for accept(2) and friends) this
+dnl #   creates a gross source incompatibility with existing programs.
+dnl #   On 32-bit architectures it creates only a warning. On 64-bit
+dnl #   architectures it creates broken code -- because "int *" is a
+dnl #   pointer to a 64-bit quantity and "size_t *" is usually a pointer
+dnl #   to a 32-bit quantity. Some Unix flavors adopted "size_t *" for
+dnl #   the sake of POSIX compliance. Others ignored it because it was
+dnl #   such a broken interface. Chaos ensued. POSIX finally woke up
+dnl #   and decided that it was wrong and created a new type socklen_t.
+dnl #   The only useful value for socklen_t is "int", and that's how
+dnl #   everyone who has a clue implements it. It is almost always the
+dnl #   case that this type should be defined to be an "int", unless the
+dnl #   system being compiled for was created in the window of POSIX
+dnl #   madness.
+
+AC_DEFUN(AC_CHECK_SOCKLENTYPE,[dnl
+AC_CHECK_TYPEDEF(socklen_t, sys/socket.h)
+AC_CHECK_ARGTYPE(sys/types.h sys/socket.h, accept, 3, 3, [:])
+AC_MSG_CHECKING(for fallback socklen_t)
+AC_CACHE_VAL(ac_cv_check_socklentype, [
+if test ".$ac_cv_typedef_socklen_t" = .yes; then
+    ac_cv_check_socklentype='socklen_t'
+elif test ".$ac_type" != .; then
+    ac_cv_check_socklentype=`echo "$ac_type" | sed -e 's/[     ]*\*$//'`
+else
+    ac_cv_check_socklentype='int'
+fi
+])
+AC_MSG_RESULT([$ac_cv_check_socklentype])
+ac_type="$ac_cv_check_socklentype"
+ifelse([$1], , :, [$1])
+])
+
+dnl ##
+dnl ##  Check for filedescriptor number type
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_CHECK_NFDSTYPE(<action-with-${ac_type}>)
+dnl ##
+
+AC_DEFUN(AC_CHECK_NFDSTYPE,[dnl
+AC_CHECK_TYPEDEF(nfds_t, poll.h)
+AC_CHECK_ARGTYPE(sys/types.h poll.h, poll, 2, 3, [:])
+AC_MSG_CHECKING(for fallback nfds_t)
+AC_CACHE_VAL(ac_cv_check_nfdstype, [
+if test ".$ac_cv_typedef_nfds_t" = .yes; then
+    ac_cv_check_nfdstype='nfds_t'
+elif test ".$ac_type" != .; then
+    ac_cv_check_nfdstype=`echo "$ac_type" | sed -e 's/[        ]*\*$//'`
+else
+    ac_cv_check_nfdstype='unsigned int'
+fi
+])
+AC_MSG_RESULT([$ac_cv_check_nfdstype])
+ac_type="$ac_cv_check_nfdstype"
+ifelse([$1], , :, [$1])
+])
+
+dnl ##
+dnl ##  Check for need of stackguard
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_CHECK_NEED_FOR_SEPARATE_STACK(<define>)
+dnl ##  acconfig.h:
+dnl ##    #undef <define>
+dnl ##  source.c:
+dnl ##    #include "config.h"
+dnl ##    #if <define> > 0
+dnl ##        ...separate stack needed...
+dnl ##    #else
+dnl ##        ...separate stack not needed...
+dnl ##    #endif
+dnl ##
+
+AC_DEFUN(AC_CHECK_NEED_FOR_SEPARATE_STACK,[dnl
+AC_MSG_CHECKING(for need for separate stack)
+AC_CACHE_VAL(ac_cv_need_for_separate_stack, [
+case $HOSTTYPE in
+ia64 )
+    ac_cv_need_for_separate_stack=yes
+    ;;
+* )
+    ac_cv_need_for_separate_stack=no
+    ;;
+esac
+])dnl
+AC_MSG_RESULT([$ac_cv_need_for_separate_stack])
+if test ".$ac_cv_need_for_separate_stack" = .yes; then
+    val="1"
+else
+    val="0"
+fi
+AC_DEFINE_UNQUOTED($1, $val)
+])
+
+dnl ##
+dnl ##  Check for direction of stack growth
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_CHECK_STACKGROWTH(<define>)
+dnl ##  acconfig.h:
+dnl ##    #undef <define>
+dnl ##  source.c:
+dnl ##    #include "config.h"
+dnl ##    #if <define> < 0
+dnl ##        ...stack grow down...
+dnl ##    #else
+dnl ##        ...stack grow up...
+dnl ##    #endif
+dnl ##
+
+AC_DEFUN(AC_CHECK_STACKGROWTH,[dnl
+AC_MSG_CHECKING(for direction of stack growth)
+AC_CACHE_VAL(ac_cv_check_stackgrowth, [
+cross_compile=no
+AC_TRY_RUN(
+changequote(<<, >>)dnl
+<<
+#include <stdio.h>
+#include <stdlib.h>
+static int iterate = 10;
+static int growsdown(int *x)
+{
+    auto int y;
+    y = (x > &y);
+    if (--iterate > 0)
+        y = growsdown(&y);
+    if (y != (x > &y))
+        exit(1);
+    return y;
+}
+int main(int argc, char *argv[])
+{
+    FILE *f;
+    auto int x;
+    if ((f = fopen("conftestval", "w")) == NULL)
+        exit(1);
+    fprintf(f, "%s\n", growsdown(&x) ? "down" : "up");;
+    fclose(f);
+    exit(0);
+}
+>>
+changequote([, ])dnl
+,
+ac_cv_check_stackgrowth=`cat conftestval`,
+ac_cv_check_stackgrowth=down,
+ac_cv_check_stackgrowth=down
+)dnl
+])dnl
+AC_MSG_RESULT([$ac_cv_check_stackgrowth])
+if test ".$ac_cv_check_stackgrowth" = ".down"; then
+    val="-1"
+else
+    val="+1"
+fi
+AC_DEFINE_UNQUOTED($1, $val)
+])
+
+dnl ##
+dnl ##  Check whether and how a POSIX compliant sigsetjmp(3) can be achieved
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_CHECK_SJLJ(<success-action>, <failure-action>, <type-var>)
+dnl ##
+
+AC_DEFUN(AC_CHECK_SJLJ,[
+AC_MSG_CHECKING(for signal-mask aware setjmp(3)/longjmp(3))
+AC_CACHE_VAL(ac_cv_check_sjlj, [
+AC_IFALLYES(func:setjmp func:longjmp, ac_cv_check_sjlj=sjlje, ac_cv_check_sjlj=none)
+cross_compile=no
+for testtype in ssjlj sjlj usjlj; do
+OCFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS -DTEST_${testtype}"
+AC_TRY_RUN(
+changequote(<<, >>)dnl
+<<
+#if defined(TEST_ssjlj)
+#define __JMP_BUF          sigjmp_buf
+#define __SETJMP(buf)      sigsetjmp(buf,1)
+#define __LONGJMP(buf,val) siglongjmp(buf,val)
+#elif defined(TEST_sjlj)
+#define __JMP_BUF          jmp_buf
+#define __SETJMP(buf)      setjmp(buf)
+#define __LONGJMP(buf,val) longjmp(buf,val)
+#elif defined(TEST_usjlj)
+#define __JMP_BUF          jmp_buf
+#define __SETJMP(buf)      _setjmp(buf)
+#define __LONGJMP(buf,val) _longjmp(buf,val)
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <signal.h>
+#include <setjmp.h>
+#include <unistd.h>
+
+static __JMP_BUF jb;
+
+static void sighandler(int sig)
+{
+    sigset_t sigs;
+
+    /* get signal mask */
+    sigprocmask(SIG_SETMASK, NULL, &sigs);
+
+    /* make sure USR1 is still blocked */
+    if (!sigismember(&sigs, SIGUSR1))
+        exit(1);
+
+    /* block USR2 for us */
+    sigaddset(&sigs, SIGUSR2);
+    sigprocmask(SIG_SETMASK, &sigs, NULL);
+
+    /* jump back to main */
+    __LONGJMP(jb, 1);
+    exit(1);
+}
+
+int main(int argc, char *argv[])
+{
+    FILE *fp;
+    sigset_t sigs;
+    struct sigaction sa;
+
+    /* the default is that it fails */
+    if ((fp = fopen("conftestval", "w")) == NULL)
+        exit(1);
+    fprintf(fp, "failed\n");
+    fclose(fp);
+
+    /* block USR1 and unblock USR2 signal */
+    sigprocmask(SIG_SETMASK, NULL, &sigs);
+    sigaddset(&sigs, SIGUSR1);
+    sigdelset(&sigs, SIGUSR2);
+    sigprocmask(SIG_SETMASK, &sigs, NULL);
+
+    /* set jump buffer */
+    if (__SETJMP(jb) == 0) {
+
+        /* install signal handler for USR1 */
+        memset((void *)&sa, 0, sizeof(struct sigaction));
+        sigemptyset(&sa.sa_mask);
+        sa.sa_handler = sighandler;
+        sa.sa_flags = 0;
+        sigaction(SIGUSR1, &sa, NULL);
+
+        /* send USR1 signal (which is still blocked) */
+        kill(getpid(), SIGUSR1);
+
+        /* unblock USR1 and wait for it */
+        sigprocmask(SIG_SETMASK, NULL, &sigs);
+        sigdelset(&sigs, SIGUSR1);
+        sigsuspend(&sigs);
+        exit(1);
+    }
+
+    /* get signal mask again */
+    sigprocmask(SIG_SETMASK, NULL, &sigs);
+
+    /* make sure USR2 is again unblocked */
+    if (sigismember(&sigs, SIGUSR2))
+        exit(1);
+
+    /* Fine... */
+    if ((fp = fopen("conftestval", "w")) == NULL)
+        exit(1);
+    fprintf(fp, "ok\n");
+    fclose(fp);
+    exit(0);
+}
+>>
+changequote([, ]),
+rc=`cat conftestval`,
+rc=failed,
+rc=failed
+)
+CFLAGS="$OCFLAGS"
+if test ".$rc" = .ok; then
+    ac_cv_check_sjlj=$testtype
+    break
+fi
+done
+case $PLATFORM in
+    *-*-linux* )
+        braindead=no
+        case "x`uname -r`" in
+changequote(, )dnl
+            x2.[23456789]* ) ;;
+changequote([, ])
+            * ) braindead=yes ;;
+        esac
+        case `grep __GLIBC_MINOR /usr/include/features.h | grep '#define' |\
+              awk '{ printf("%s", [$]3 >= 1 ? "yes" : "no"); }'` in
+            yes ) ;;
+            * ) braindead=yes ;;
+        esac
+        case $braindead in
+            yes ) ac_cv_check_sjlj=sjljlx ;;
+            no  ) ac_cv_check_sjlj=ssjlj  ;;
+        esac
+        ;;
+    *-*-isc* )
+        ac_cv_check_sjlj=sjljisc
+        ;;
+    *-*-interix )
+        #   Interix is a POSIX sub-system on Windows-NT which
+        #   can use the Interactive UNIX dispatching code.
+        ac_cv_check_sjlj=sjljisc
+        ;;
+    *-*-cygwin* )
+        ac_cv_check_sjlj=sjljw32
+        ;;
+esac
+])dnl
+$3="$ac_cv_check_sjlj"
+if test ".$ac_cv_check_sjlj" != .none; then
+    AC_MSG_RESULT([yes: $ac_cv_check_sjlj])
+    ifelse([$1], , :, [$1])
+else
+    AC_MSG_RESULT([no])
+    ifelse([$2], , :, [$2])
+fi
+])dnl
+
+dnl ##
+dnl ##  Check for number of signals (NSIG)
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_CHECK_NSIG(<define>)
+dnl ##  acconfig.h:
+dnl ##    #undef <define>
+dnl ##  source.c:
+dnl ##    #include "config.h"
+dnl ##    ...<define>...
+
+AC_DEFUN(AC_CHECK_NSIG,[dnl
+AC_MSG_CHECKING(for number of signals)
+cross_compile=no
+AC_TRY_RUN(
+changequote(<<, >>)dnl
+<<
+#include <stdio.h>
+#include <sys/types.h>
+#include <signal.h>
+
+int main(int argc, char *argv[])
+{
+    FILE *fp;
+    int nsig;
+
+#if defined(NSIG)
+    nsig = NSIG;
+#elif defined(_NSIG)
+    nsig = _NSIG;
+#else
+    nsig = (sizeof(sigset_t)*8);
+    if (nsig < 32)
+        nsig = 32;
+#endif
+    if ((fp = fopen("conftestval", "w")) == NULL)
+        exit(1);
+    fprintf(fp, "%d\n", nsig);
+    fclose(fp);
+    exit(0);
+}
+>>
+changequote([, ])dnl
+,
+nsig=`cat conftestval`,
+nsig=32,
+nsig=32
+)dnl
+AC_MSG_RESULT([$nsig])
+AC_DEFINE_UNQUOTED($1, $nsig)
+])
+
+dnl ##
+dnl ##  Check for an external/extension library.
+dnl ##  - is aware of <libname>-config style scripts
+dnl ##  - searches under standard paths include, lib, etc.
+dnl ##  - searches under subareas like .libs, etc.
+dnl ##
+dnl ##  configure.in:
+dnl ##      AC_CHECK_EXTLIB(<realname>, <libname>, <func>, <header>,
+dnl ##                      [<success-action> [, <fail-action>]])
+dnl ##  Makefile.in:
+dnl ##      CFLAGS  = @CFLAGS@
+dnl ##      LDFLAGS = @LDFLAGS@
+dnl ##      LIBS    = @LIBS@
+dnl ##  shell:
+dnl ##      $ ./configure --with-<libname>[=DIR]
+dnl ##
+
+AC_DEFUN(AC_CHECK_EXTLIB,[dnl
+AC_ARG_WITH($2,dnl
+[  --with-]substr([$2[[=DIR]]                 ], 0, 19)[build against $1 library (default=no)],
+    if test ".$with_$2" = .yes; then
+        #   via config script
+        $2_version=`($2-config --version) 2>/dev/null`
+        if test ".$$2_version" != .; then
+            CPPFLAGS="$CPPFLAGS `$2-config --cflags`"
+            CFLAGS="$CFLAGS `$2-config --cflags`"
+            LDFLAGS="$LDFLAGS `$2-config --ldflags`"
+        fi
+    else
+        if test -d "$with_$2"; then
+            found=0
+            #   via config script
+            for dir in $with_$2/bin $with_$2; do
+                if test -f "$dir/$2-config"; then
+                    $2_version=`($dir/$2-config --version) 2>/dev/null`
+                    if test ".$$2_version" != .; then
+                        CPPFLAGS="$CPPFLAGS `$dir/$2-config --cflags`"
+                        CFLAGS="$CFLAGS `$dir/$2-config --cflags`"
+                        LDFLAGS="$LDFLAGS `$dir/$2-config --ldflags`"
+                        found=1
+                        break
+                    fi
+                fi
+            done
+            #   via standard paths
+            if test ".$found" = .0; then
+                for dir in $with_$2/include/$2 $with_$2/include $with_$2; do
+                    if test -f "$dir/$4"; then
+                        CPPFLAGS="$CPPFLAGS -I$dir"
+                        CFLAGS="$CFLAGS -I$dir"
+                        found=1
+                        break
+                    fi
+                done
+                for dir in $with_$2/lib/$2 $with_$2/lib $with_$2; do
+                    if test -f "$dir/lib$2.a" -o -f "$dir/lib$2.so"; then
+                        LDFLAGS="$LDFLAGS -L$dir"
+                        found=1
+                        break
+                    fi
+                done
+            fi
+            #   in any subarea
+            if test ".$found" = .0; then
+changequote(, )dnl
+                for file in x `find $with_$2 -name "$4" -type f -print`; do
+                    test .$file = .x && continue
+                    dir=`echo $file | sed -e 's;[[^/]]*$;;' -e 's;\(.\)/$;\1;'`
+                    CPPFLAGS="$CPPFLAGS -I$dir"
+                    CFLAGS="$CFLAGS -I$dir"
+                done
+                for file in x `find $with_$2 -name "lib$2.[[aso]]" -type f -print`; do
+                    test .$file = .x && continue
+                    dir=`echo $file | sed -e 's;[[^/]]*$;;' -e 's;\(.\)/$;\1;'`
+                    LDFLAGS="$LDFLAGS -L$dir"
+                done
+changequote([, ])dnl
+            fi
+        fi
+    fi
+    AC_HAVE_HEADERS($4)
+    AC_CHECK_LIB($2, $3)
+    AC_IFALLYES(header:$4 lib:$2_$3, with_$2=yes, with_$2=no)
+    if test ".$with_$2" = .no; then
+        AC_ERROR([Unable to find $1 library])
+    fi
+,
+if test ".$with_$2" = .; then
+    with_$2=no
+fi
+)dnl
+AC_MSG_CHECKING(whether to build against $1 library)
+if test ".$with_$2" = .yes; then
+    ifelse([$5], , :, [$5])
+else
+    ifelse([$6], , :, [$6])
+fi
+AC_MSG_RESULT([$with_$2])
+])dnl
+
+dnl ##
+dnl ##  Check whether SVR4/SUSv2 makecontext(2), swapcontext(2) and
+dnl ##  friends can be used for user-space context switching
+dnl ##
+dnl ##  configure.in:
+dnl ##     AC_CHECK_MCSC(<success-action>, <failure-action>)
+dnl ##
+
+AC_DEFUN(AC_CHECK_MCSC, [
+AC_MSG_CHECKING(for usable SVR4/SUSv2 makecontext(2)/swapcontext(2))
+AC_CACHE_VAL(ac_cv_check_mcsc, [
+AC_TRY_RUN([
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ucontext.h>
+
+ucontext_t uc_child;
+ucontext_t uc_main;
+
+void child(void *arg)
+{
+    if (arg != (void *)12345)
+        exit(1);
+    if (swapcontext(&uc_child, &uc_main) != 0)
+        exit(1);
+}
+
+int main(int argc, char *argv[])
+{
+    FILE *fp;
+    void *stack;
+
+    /* the default is that it fails */
+    if ((fp = fopen("conftestval", "w")) == NULL)
+        exit(1);
+    fprintf(fp, "no\n");
+    fclose(fp);
+
+    /* configure a child user-space context */
+    if ((stack = malloc(64*1024)) == NULL)
+        exit(1);
+    if (getcontext(&uc_child) != 0)
+        exit(1);
+    uc_child.uc_link = NULL;
+    uc_child.uc_stack.ss_sp = (char *)stack+(32*1024);
+    uc_child.uc_stack.ss_size = 32*1024;
+    uc_child.uc_stack.ss_flags = 0;
+    makecontext(&uc_child, child, 2, (void *)12345);
+
+    /* switch into the user context */
+    if (swapcontext(&uc_main, &uc_child) != 0)
+        exit(1);
+
+    /* Fine, child came home */
+    if ((fp = fopen("conftestval", "w")) == NULL)
+        exit(1);
+    fprintf(fp, "yes\n");
+    fclose(fp);
+
+    /* die successfully */
+    exit(0);
+}
+],
+ac_cv_check_mcsc=`cat conftestval`,
+ac_cv_check_mcsc=no,
+ac_cv_check_mcsc=no
+)dnl
+])dnl
+AC_MSG_RESULT([$ac_cv_check_mcsc])
+if test ".$ac_cv_check_mcsc" = .yes; then
+    ifelse([$1], , :, [$1])
+else
+    ifelse([$2], , :, [$2])
+fi
+])dnl
+
+dnl ##
+dnl ##  Check how stacks have to be setup for the functions
+dnl ##  sigstack(2), sigaltstack(2) and makecontext(2).
+dnl ##
+dnl ##  configure.in:
+dnl ##    AC_CHECK_STACKSETUP(sigstack|sigaltstack|makecontext, <macro-addr>, <macro-size>)
+dnl ##  acconfig.h:
+dnl ##    #undef HAVE_{SIGSTACK|SIGALTSTACK|MAKECONTEXT}
+dnl ##    #undef HAVE_STACK_T
+dnl ##  header.h.in:
+dnl ##    @<macro-addr>@
+dnl ##    @<macro-size>@
+dnl ##  source.c:
+dnl ##    #include "header.h"
+dnl ##    xxx.sp_ss   = <macro-addr>(skaddr, sksize);
+dnl ##    xxx.sp_size = <macro-size>(skaddr, sksize);
+dnl ##
+
+AC_DEFUN(AC_CHECK_STACKSETUP,[dnl
+dnl #   check for consistent usage
+ifelse($1,[sigstack],,[
+ifelse($1,[sigaltstack],,[
+ifelse($1,[makecontext],,[
+errprint(__file__:__line__: [AC_CHECK_STACKSETUP: only sigstack, sigaltstack and makecontext supported
+])])])])
+dnl #   we require the C compiler and the standard headers
+AC_REQUIRE([AC_HEADER_STDC])dnl
+dnl #   we at least require the function to check
+AC_CHECK_FUNCTIONS($1)
+dnl #   sigaltstack on some platforms uses stack_t instead of struct sigaltstack
+ifelse($1, sigaltstack, [
+    AC_ONCE(stacksetup_stack_t, [
+        AC_CHECK_TYPEDEF(stack_t, signal.h)
+    ])
+])
+dnl #   display processing header
+AC_MSG_CHECKING(for stack setup via $1)
+dnl #   but cache the whole results
+AC_CACHE_VAL(ac_cv_stacksetup_$1,[
+if test ".$ac_cv_func_$1" = .no; then
+    dnl #   no need to check anything when function is already missing
+    ac_cv_stacksetup_$1="N.A.:/*N.A.*/,/*N.A.*/"
+else
+    dnl #   setup compile environment
+    OCFLAGS="$CFLAGS"
+    CFLAGS="$CFLAGS -DTEST_$1"
+    cross_compile=no
+    dnl #   compile and run the test program
+    AC_TRY_RUN([
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#if defined(TEST_sigstack) || defined(TEST_sigaltstack)
+#include <sys/types.h>
+#include <signal.h>
+#include <unistd.h>
+#endif
+#if defined(TEST_makecontext)
+#include <ucontext.h>
+#endif
+union alltypes {
+    long   l;
+    double d;
+    void  *vp;
+    void (*fp)(void);
+    char  *cp;
+};
+static volatile char *handler_addr = (char *)0xDEAD;
+#if defined(TEST_sigstack) || defined(TEST_sigaltstack)
+static volatile int handler_done = 0;
+void handler(int sig)
+{
+    char garbage[1024];
+    int i;
+    auto int dummy;
+    for (i = 0; i < 1024; i++)
+        garbage[i] = 'X';
+    handler_addr = (char *)&dummy;
+    handler_done = 1;
+    return;
+}
+#endif
+#if defined(TEST_makecontext)
+static ucontext_t uc_handler;
+static ucontext_t uc_main;
+void handler(void)
+{
+    char garbage[1024];
+    int i;
+    auto int dummy;
+    for (i = 0; i < 1024; i++)
+        garbage[i] = 'X';
+    handler_addr = (char *)&dummy;
+    swapcontext(&uc_handler, &uc_main);
+    return;
+}
+#endif
+int main(int argc, char *argv[])
+{
+    FILE *f;
+    char *skaddr;
+    char *skbuf;
+    int sksize;
+    char result[1024];
+    int i;
+    sksize = 32768;
+    skbuf = (char *)malloc(sksize*2+2*sizeof(union alltypes));
+    if (skbuf == NULL)
+        exit(1);
+    for (i = 0; i < sksize*2+2*sizeof(union alltypes); i++)
+        skbuf[i] = 'A';
+    skaddr = skbuf+sizeof(union alltypes);
+#if defined(TEST_sigstack) || defined(TEST_sigaltstack)
+    {
+        struct sigaction sa;
+#if defined(TEST_sigstack)
+        struct sigstack ss;
+#elif defined(TEST_sigaltstack) && defined(HAVE_STACK_T)
+        stack_t ss;
+#else
+        struct sigaltstack ss;
+#endif
+#if defined(TEST_sigstack)
+        ss.ss_sp      = (void *)(skaddr + sksize);
+        ss.ss_onstack = 0;
+        if (sigstack(&ss, NULL) < 0)
+            exit(1);
+#elif defined(TEST_sigaltstack)
+        ss.ss_sp    = (void *)(skaddr + sksize);
+        ss.ss_size  = sksize;
+        ss.ss_flags = 0;
+        if (sigaltstack(&ss, NULL) < 0)
+            exit(1);
+#endif
+        memset((void *)&sa, 0, sizeof(struct sigaction));
+        sa.sa_handler = handler;
+        sa.sa_flags = SA_ONSTACK;
+        sigemptyset(&sa.sa_mask);
+        sigaction(SIGUSR1, &sa, NULL);
+        kill(getpid(), SIGUSR1);
+        while (!handler_done)
+            /*nop*/;
+    }
+#endif
+#if defined(TEST_makecontext)
+    {
+        if (getcontext(&uc_handler) != 0)
+            exit(1);
+        uc_handler.uc_link = NULL;
+        uc_handler.uc_stack.ss_sp    = (void *)(skaddr + sksize);
+        uc_handler.uc_stack.ss_size  = sksize;
+        uc_handler.uc_stack.ss_flags = 0;
+        makecontext(&uc_handler, handler, 1);
+        swapcontext(&uc_main, &uc_handler);
+    }
+#endif
+    if (handler_addr == (char *)0xDEAD)
+        exit(1);
+    if (handler_addr < skaddr+sksize) {
+        /* stack was placed into lower area */
+        if (*(skaddr+sksize) != 'A')
+             sprintf(result, "(skaddr)+(sksize)-%d,(sksize)-%d",
+                     sizeof(union alltypes), sizeof(union alltypes));
+        else
+             strcpy(result, "(skaddr)+(sksize),(sksize)");
+    }
+    else {
+        /* stack was placed into higher area */
+        if (*(skaddr+sksize*2) != 'A')
+            sprintf(result, "(skaddr),(sksize)-%d", sizeof(union alltypes));
+        else
+            strcpy(result, "(skaddr),(sksize)");
+    }
+    if ((f = fopen("conftestval", "w")) == NULL)
+        exit(1);
+    fprintf(f, "%s\n", result);
+    fclose(f);
+    exit(0);
+}
+],[
+dnl #   test successully passed
+ac_cv_stacksetup_$1=`cat conftestval`
+ac_cv_stacksetup_$1="ok:$ac_cv_stacksetup_$1"
+],[
+dnl #   test failed
+ac_cv_stacksetup_$1='guessed:(skaddr),(sksize)'
+],[
+dnl #   cross-platform => failed
+ac_cv_stacksetup_$1='guessed:(skaddr),(sksize)'
+])
+dnl #   restore original compile environment
+CFLAGS="$OCFLAGS"
+])dnl
+fi
+dnl #   extract result ingredients of single cached result value
+type=`echo $ac_cv_stacksetup_$1 | sed -e 's;:.*$;;'`
+addr=`echo $ac_cv_stacksetup_$1 | sed -e 's;^.*:;;' -e 's;,.*$;;'`
+size=`echo $ac_cv_stacksetup_$1 | sed -e 's;^.*:;;' -e 's;^.*,;;'`
+dnl #   export result ingredients
+$2="#define $2(skaddr,sksize) ($addr)"
+$3="#define $3(skaddr,sksize) ($size)"
+AC_SUBST($2)dnl
+AC_SUBST($3)dnl
+dnl #   display result indicator
+AC_MSG_RESULT([$type])
+dnl #   display results in detail
+AC_MSG_VERBOSE([$]$2)
+AC_MSG_VERBOSE([$]$3)
+])