RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Ralf S. Engelschall
  Root:   /v/rpm/cvs                       Email:  [EMAIL PROTECTED]
  Module: popt                             Date:   15-Jun-2007 16:06:06
  Branch: HEAD                             Handle: 2007061515060600

  Added files:
    popt                    acinclude.m4
  Modified files:
    popt                    configure.ac

  Log:
    fix portability by providing the necessary Autoconf glue for the use
    of the (still) too unportable C99 va_copy function

  Summary:
    Revision    Changes     Path
    1.1         +113 -0     popt/acinclude.m4
    1.18        +1  -0      popt/configure.ac
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: popt/acinclude.m4
  ============================================================================
  $ cvs diff -u -r0 -r1.1 acinclude.m4
  --- /dev/null 2007-06-15 16:04:25 +0200
  +++ acinclude.m4      2007-06-15 16:06:06 +0200
  @@ -0,0 +1,113 @@
  +dnl ##
  +dnl ##  acinclude.m4 -- additional source for aclocal(1)
  +dnl ##
  +
  +dnl ##
  +dnl ##  Check for C99 va_copy() implementation
  +dnl ##  (and provide fallback implementation if neccessary)
  +dnl ##
  +dnl ##  configure.in:
  +dnl ##    AC_CHECK_VA_COPY
  +dnl ##  foo.c:
  +dnl ##    #include "config.h"
  +dnl ##    [...]
  +dnl ##    va_copy(d,s)
  +dnl ##
  +dnl ##  This check is rather complex: first because we really have to
  +dnl ##  try various possible implementations in sequence and second, we
  +dnl ##  cannot define a macro in config.h with parameters directly.
  +dnl ##
  +
  +dnl #   test program for va_copy() implementation
  +changequote(<<,>>)
  +m4_define(__va_copy_test, <<[
  +#include <stdlib.h>
  +#include <stdarg.h>
  +#include <string.h>
  +#define DO_VA_COPY(d, s) $1
  +void test(char *str, ...)
  +{
  +    va_list ap, ap2;
  +    int i;
  +    va_start(ap, str);
  +    DO_VA_COPY(ap2, ap);
  +    for (i = 1; i <= 9; i++) {
  +        int k = (int)va_arg(ap, int);
  +        if (k != i)
  +            abort();
  +    }
  +    DO_VA_COPY(ap, ap2);
  +    for (i = 1; i <= 9; i++) {
  +        int k = (int)va_arg(ap, int);
  +        if (k != i)
  +            abort();
  +    }
  +    va_end(ap);
  +}
  +int main(int argc, char *argv[])
  +{
  +    test("test", 1, 2, 3, 4, 5, 6, 7, 8, 9);
  +    exit(0);
  +}
  +]>>)
  +changequote([,])
  +
  +dnl #   test driver for va_copy() implementation
  +m4_define(__va_copy_check, [
  +    AH_VERBATIM($1,
  +[/* Predefined possible va_copy() implementation (id: $1) */
  +#define __VA_COPY_USE_$1(d, s) $2])
  +    if test ".$ac_cv_va_copy" = .; then
  +        AC_TRY_RUN(__va_copy_test($2), [ac_cv_va_copy="$1"])
  +    fi
  +])
  +
  +dnl #   Autoconf check for va_copy() implementation checking
  +AC_DEFUN([AC_CHECK_VA_COPY],[
  +  dnl #   provide Autoconf display check message
  +  AC_MSG_CHECKING(for va_copy() function)
  +  dnl #   check for various implementations in priorized sequence   
  +  AC_CACHE_VAL(ac_cv_va_copy, [
  +    ac_cv_va_copy=""
  +    dnl #   1. check for standardized C99 macro
  +    __va_copy_check(C99, [va_copy((d), (s))])
  +    dnl #   2. check for alternative/deprecated GCC macro
  +    __va_copy_check(GCM, [VA_COPY((d), (s))])
  +    dnl #   3. check for internal GCC macro (high-level define)
  +    __va_copy_check(GCH, [__va_copy((d), (s))])
  +    dnl #   4. check for internal GCC macro (built-in function)
  +    __va_copy_check(GCB, [__builtin_va_copy((d), (s))])
  +    dnl #   5. check for assignment approach (assuming va_list is a struct)
  +    __va_copy_check(ASS, [do { (d) = (s); } while (0)])
  +    dnl #   6. check for assignment approach (assuming va_list is a pointer)
  +    __va_copy_check(ASP, [do { *(d) = *(s); } while (0)])
  +    dnl #   7. check for memory copying approach (assuming va_list is a 
struct)
  +    __va_copy_check(CPS, [memcpy((void *)&(d), (void *)&(s)), sizeof((s))])
  +    dnl #   8. check for memory copying approach (assuming va_list is a 
pointer)
  +    __va_copy_check(CPP, [memcpy((void *)(d), (void *)(s)), sizeof(*(s))])
  +    if test ".$ac_cv_va_copy" = .; then
  +        AC_ERROR([no working implementation found])
  +    fi
  +  ])
  +  dnl #   optionally activate the fallback implementation
  +  if test ".$ac_cv_va_copy" = ".C99"; then
  +      AC_DEFINE(HAVE_VA_COPY, 1, [Define if va_copy() macro exists (and no 
fallback implementation is required)])
  +  fi
  +  dnl #   declare which fallback implementation to actually use
  +  AC_DEFINE_UNQUOTED([__VA_COPY_USE], [__VA_COPY_USE_$ac_cv_va_copy],
  +      [Define to id of used va_copy() implementation])
  +  dnl #   provide activation hook for fallback implementation
  +  AH_VERBATIM([__VA_COPY_ACTIVATION],
  +[/* Optional va_copy() implementation activation */
  +#ifndef HAVE_VA_COPY
  +#define va_copy(d, s) __VA_COPY_USE(d, s)
  +#endif
  +])
  +  dnl #   provide Autoconf display result message
  +  if test ".$ac_cv_va_copy" = ".C99"; then
  +      AC_MSG_RESULT([yes])
  +  else
  +      AC_MSG_RESULT([no (using fallback implementation)])
  +  fi
  +])
  +
  @@ .
  patch -p0 <<'@@ .'
  Index: popt/configure.ac
  ============================================================================
  $ cvs diff -u -r1.17 -r1.18 configure.ac
  --- popt/configure.ac 14 Jun 2007 21:14:45 -0000      1.17
  +++ popt/configure.ac 15 Jun 2007 14:06:06 -0000      1.18
  @@ -29,6 +29,7 @@
   
   AC_ISC_POSIX
   AM_C_PROTOTYPES
  +AC_CHECK_VA_COPY
   
   dnl XXX lose rpm libs
   LIBS=
  @@ .
______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
CVS Sources Repository                                [email protected]

Reply via email to