bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Bug-gnulib] vasprintf EOVERFLOW fix


From: Bruno Haible
Subject: Re: [Bug-gnulib] vasprintf EOVERFLOW fix
Date: Thu, 9 Sep 2004 14:28:45 +0200
User-agent: KMail/1.5

Oskar Liljeblad wrote:
> A trivial patch to define EOVERFLOW in vasnprintf.c

I see. You mean, because AIX 3 doesn't have it and OSF/1 4.0 and 5.1 declare
it only if _XOPEN_SOURCE_EXTENDED is defined?

EINVAL is a bad replacement value, because for snprintf EINVAL means
"invalid format string".

Also we would get problems on OSF/1 if one part of an application is compiled
with _XOPEN_SOURCE_EXTENDED and another part without: Then the code would
assume different values of EOVERFLOW here and there.

I've committed this change.

Bruno


2004-09-09  Bruno Haible  <address@hidden>

        * modules/vasnprintf (Files): Add m4/eoverflow.m4.
        * m4/eoverflow.m4: New file, taken from GNU libiconv eilseq.m4 with
        modifications.
        * m4/vasnprintf.m4 (gl_FUNC_VASNPRINTF): Require gl_EOVERFLOW.

*** modules/vasnprintf  25 Nov 2003 11:18:47 -0000      1.3
--- modules/vasnprintf  9 Sep 2004 12:26:19 -0000
***************
*** 15,20 ****
--- 15,21 ----
  m4/wint_t.m4
  m4/longlong.m4
  m4/intmax_t.m4
+ m4/eoverflow.m4
  m4/vasnprintf.m4
  
  Depends-on:
*** m4/vasnprintf.m4    1 Jun 2004 20:27:24 -0000       1.6
--- m4/vasnprintf.m4    9 Sep 2004 12:26:21 -0000
***************
*** 1,4 ****
! # vasnprintf.m4 serial 4
  dnl Copyright (C) 2002-2004 Free Software Foundation, Inc.
  dnl This file is free software, distributed under the terms of the GNU
  dnl General Public License.  As a special exception to the GNU General
--- 1,4 ----
! # vasnprintf.m4 serial 5
  dnl Copyright (C) 2002-2004 Free Software Foundation, Inc.
  dnl This file is free software, distributed under the terms of the GNU
  dnl General Public License.  As a special exception to the GNU General
***************
*** 8,13 ****
--- 8,14 ----
  
  AC_DEFUN([gl_FUNC_VASNPRINTF],
  [
+   AC_REQUIRE([gl_EOVERFLOW])
    AC_REPLACE_FUNCS(vasnprintf)
    if test $ac_cv_func_vasnprintf = no; then
      AC_LIBOBJ(printf-args)
*** /dev/null   1970-01-01 01:00:00.000000000 +0100
--- m4/eoverflow.m4     2004-09-09 14:15:24.000000000 +0200
***************
*** 0 ****
--- 1,66 ----
+ # eoverflow.m4 serial 1
+ dnl Copyright (C) 2004 Free Software Foundation, Inc.
+ dnl This file is free software, distributed under the terms of the GNU
+ dnl General Public License.  As a special exception to the GNU General
+ dnl Public License, this file may be distributed as part of a program
+ dnl that contains a configuration script generated by Autoconf, under
+ dnl the same distribution terms as the rest of that program.
+ 
+ dnl From Bruno Haible.
+ 
+ # The EOVERFLOW errno value ought to be defined in <errno.h>, according to
+ # POSIX.  But some systems (like AIX 3) don't define it, and some systems
+ # (like OSF/1) define it when _XOPEN_SOURCE_EXTENDED is defined.
+ 
+ # Define EOVERFLOW as a C macro and as a substituted macro in such a way that
+ # 1. on all systems, after inclusion of <errno.h>, EOVERFLOW is usable,
+ # 2. on systems where EOVERFLOW is defined elsewhere, we use the same numeric
+ #    value.
+ 
+ AC_DEFUN([gl_EOVERFLOW],
+ [
+   AC_REQUIRE([AC_PROG_CC])dnl
+ 
+   AC_CACHE_CHECK([for EOVERFLOW], ac_cv_decl_EOVERFLOW, [
+     AC_EGREP_CPP(yes,[
+ #include <errno.h>
+ #ifdef EOVERFLOW
+ yes
+ #endif
+       ], have_eoverflow=1)
+     if test -n "$have_eoverflow"; then
+       dnl EOVERFLOW exists in <errno.h>. Don't need to define EOVERFLOW 
ourselves.
+       ac_cv_decl_EOVERFLOW=yes
+     else
+       AC_EGREP_CPP(yes,[
+ #define _XOPEN_SOURCE_EXTENDED 1
+ #include <errno.h>
+ #ifdef EOVERFLOW
+ yes
+ #endif
+         ], have_eoverflow=1)
+       if test -n "$have_eoverflow"; then
+         dnl EOVERFLOW exists but is hidden.
+         dnl Define it to the same value.
+         _AC_COMPUTE_INT([EOVERFLOW], ac_cv_decl_EOVERFLOW, [
+ #define _XOPEN_SOURCE_EXTENDED 1
+ #include <errno.h>
+ /* The following two lines are a workaround against an autoconf-2.52 bug.  */
+ #include <stdio.h>
+ #include <stdlib.h>
+ ])
+       else
+         dnl EOVERFLOW isn't defined by the system. Define EOVERFLOW 
ourselves, but
+         dnl don't define it as EINVAL, because snprintf() callers want to
+         dnl distinguish EINVAL and EOVERFLOW.
+         ac_cv_decl_EOVERFLOW=E2BIG
+       fi
+     fi
+   ])
+   if test "$ac_cv_decl_EOVERFLOW" != yes; then
+     AC_DEFINE_UNQUOTED([EOVERFLOW], [$ac_cv_decl_EOVERFLOW],
+                        [Define as good substitute value for EOVERFLOW.])
+     EOVERFLOW="$ac_cv_decl_EOVERFLOW"
+     AC_SUBST(EOVERFLOW)
+   fi
+ ])





reply via email to

[Prev in Thread] Current Thread [Next in Thread]