From 4a0d89369599a2cea01f4fbdf791f426a02cb5a3 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Fri, 26 Oct 2001 07:26:00 +0000 Subject: [PATCH] Sync with fileutils 4.1.1. --- lib/error.c | 272 ++++++++++++++++++++++++++++++++++------------- lib/error.h | 2 +- lib/getopt.c | 99 ++++++++++------- lib/getopt.h | 45 +++++--- lib/getopt1.c | 32 +++--- lib/obstack.c | 169 ++++++++++++++++------------- lib/obstack.h | 19 ++-- lib/quote.c | 3 + lib/strnlen.c | 4 +- lib/xmalloc.c | 4 +- m4/c-bs-a.m4 | 4 +- m4/error.m4 | 9 +- m4/gettext.m4 | 12 ++- m4/lcmessage.m4 | 10 +- m4/malloc.m4 | 13 ++- m4/mbstate_t.m4 | 4 +- m4/progtest.m4 | 10 +- m4/realloc.m4 | 13 ++- m4/strerror_r.m4 | 83 +++++++-------- 19 files changed, 492 insertions(+), 315 deletions(-) diff --git a/lib/error.c b/lib/error.c index c78b6cff..9c0700c2 100644 --- a/lib/error.c +++ b/lib/error.c @@ -1,23 +1,22 @@ /* Error handler for noninteractive utilities - Copyright (C) 1990-1998, 2000 Free Software Foundation, Inc. - + Copyright (C) 1990-1998, 2000, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Its master source is NOT part of the C library, however. The master source lives in /gd/gnu/lib. The GNU C 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. + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. The GNU C 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. + Lesser General Public License for more details. - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ /* Written by David MacKenzie . */ @@ -29,6 +28,10 @@ #if HAVE_LIBINTL_H # include #endif +#ifdef _LIBC +# include +# define mbsrtowcs __mbsrtowcs +#endif #if HAVE_VPRINTF || HAVE_DOPRNT || _LIBC # if __STDC__ @@ -52,13 +55,6 @@ void exit (); #include "error.h" -#ifndef HAVE_DECL_STRERROR_R -"this configure-time declaration test was not run" -#endif -#if !HAVE_DECL_STRERROR_R -char *strerror_r (); -#endif - #ifndef _ # define _(String) String #endif @@ -83,6 +79,12 @@ unsigned int error_message_count; /* In GNU libc we want do not want to use the common name `error' directly. Instead make it a weak alias. */ +extern void __error (int status, int errnum, const char *message, ...) + __attribute__ ((__format__ (__printf__, 3, 4))); +extern void __error_at_line (int status, int errnum, const char *file_name, + unsigned int line_number, const char *message, + ...) + __attribute__ ((__format__ (__printf__, 5, 6)));; # define error __error # define error_at_line __error_at_line @@ -93,21 +95,30 @@ unsigned int error_message_count; #else /* not _LIBC */ +# if !HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P +# ifndef HAVE_DECL_STRERROR_R +"this configure-time declaration test was not run" +# endif +char *strerror_r (); +# endif + /* The calling program should define program_name and set it to the name of the executing program. */ extern char *program_name; -# ifdef HAVE_STRERROR_R +# if HAVE_STRERROR_R || defined strerror_r # define __strerror_r strerror_r # else # if HAVE_STRERROR -# ifndef strerror /* On some systems, strerror is a macro */ +# ifndef HAVE_DECL_STRERROR +"this configure-time declaration test was not run" +# endif +# if !HAVE_DECL_STRERROR char *strerror (); # endif # else static char * -private_strerror (errnum) - int errnum; +private_strerror (int errnum) { extern char *sys_errlist[]; extern int sys_nerr; @@ -118,15 +129,118 @@ private_strerror (errnum) } # define strerror private_strerror # endif /* HAVE_STRERROR */ -# endif /* HAVE_STRERROR_R */ +# endif /* HAVE_STRERROR_R || defined strerror_r */ #endif /* not _LIBC */ +static void +print_errno_message (int errnum) +{ + char const *s; + +#if defined HAVE_STRERROR_R || _LIBC + char errbuf[1024]; +# if STRERROR_R_CHAR_P || _LIBC + s = __strerror_r (errnum, errbuf, sizeof errbuf); +# else + if (__strerror_r (errnum, errbuf, sizeof errbuf) == 0) + s = errbuf; + else + s = 0; +# endif +#else + s = strerror (errnum); +#endif + +#if !_LIBC + if (! s) + s = _("Unknown system error"); +#endif + +#if _LIBC && USE_IN_LIBIO + if (_IO_fwide (stderr, 0) > 0) + { + __fwprintf (stderr, L": %s", s); + return; + } +#endif + + fprintf (stderr, ": %s", s); +} + +#ifdef VA_START +static void +error_tail (int status, int errnum, const char *message, va_list args) +{ +# if HAVE_VPRINTF || _LIBC +# if _LIBC && USE_IN_LIBIO + if (_IO_fwide (stderr, 0) > 0) + { +# define ALLOCA_LIMIT 2000 + size_t len = strlen (message) + 1; + wchar_t *wmessage = NULL; + mbstate_t st; + size_t res; + const char *tmp; + + do + { + if (len < ALLOCA_LIMIT) + wmessage = (wchar_t *) alloca (len * sizeof (wchar_t)); + else + { + if (wmessage != NULL && len / 2 < ALLOCA_LIMIT) + wmessage = NULL; + + wmessage = (wchar_t *) realloc (wmessage, + len * sizeof (wchar_t)); + + if (wmessage == NULL) + { + fputws_unlocked (L"out of memory\n", stderr); + return; + } + } + + memset (&st, '\0', sizeof (st)); + tmp =message; + } + while ((res = mbsrtowcs (wmessage, &tmp, len, &st)) == len); + + if (res == (size_t) -1) + /* The string cannot be converted. */ + wmessage = (wchar_t *) L"???"; + + __vfwprintf (stderr, wmessage, args); + } + else +# endif + vfprintf (stderr, message, args); +# else + _doprnt (message, args, stderr); +# endif + va_end (args); + + ++error_message_count; + if (errnum) + print_errno_message (errnum); +# if _LIBC && USE_IN_LIBIO + if (_IO_fwide (stderr, 0) > 0) + putwc (L'\n', stderr); + else +# endif + putc ('\n', stderr); + fflush (stderr); + if (status) + exit (status); +} +#endif + + /* Print the program name and error message MESSAGE, which is a printf-style format string with optional args. If ERRNUM is nonzero, print its corresponding system error message. Exit with status STATUS if it is nonzero. */ /* VARARGS */ - void #if defined VA_START && __STDC__ error (int status, int errnum, const char *message, ...) @@ -142,47 +256,48 @@ error (status, errnum, message, va_alist) va_list args; #endif + fflush (stdout); +#ifdef _LIBC +# ifdef USE_IN_LIBIO + _IO_flockfile (stderr); +# else + __flockfile (stderr); +# endif +#endif if (error_print_progname) (*error_print_progname) (); else { - fflush (stdout); - fprintf (stderr, "%s: ", program_name); +#if _LIBC && USE_IN_LIBIO + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s: ", program_name); + else +#endif + fprintf (stderr, "%s: ", program_name); } #ifdef VA_START VA_START (args, message); -# if HAVE_VPRINTF || _LIBC - vfprintf (stderr, message, args); -# else - _doprnt (message, args, stderr); -# endif - va_end (args); + error_tail (status, errnum, message, args); #else fprintf (stderr, message, a1, a2, a3, a4, a5, a6, a7, a8); -#endif ++error_message_count; if (errnum) - { -#if defined HAVE_STRERROR_R || _LIBC - char errbuf[1024]; -# if HAVE_WORKING_STRERROR_R || _LIBC - fprintf (stderr, ": %s", __strerror_r (errnum, errbuf, sizeof errbuf)); -# else - /* Don't use __strerror_r's return value because on some systems - (at least DEC UNIX 4.0[A-D]) strerror_r returns `int'. */ - __strerror_r (errnum, errbuf, sizeof errbuf); - fprintf (stderr, ": %s", errbuf); -# endif -#else - fprintf (stderr, ": %s", strerror (errnum)); -#endif - } + print_errno_message (errnum); putc ('\n', stderr); fflush (stderr); if (status) exit (status); +#endif + +#ifdef _LIBC +# ifdef USE_IN_LIBIO + _IO_funlockfile (stderr); +# else + __funlockfile (stderr); +# endif +#endif } /* Sometimes we want to have at most one error per line. This @@ -212,8 +327,9 @@ error_at_line (status, errnum, file_name, line_number, message, va_alist) static const char *old_file_name; static unsigned int old_line_number; - if (old_line_number == line_number && - (file_name == old_file_name || !strcmp (old_file_name, file_name))) + if (old_line_number == line_number + && (file_name == old_file_name + || strcmp (old_file_name, file_name) == 0)) /* Simply return and print nothing. */ return; @@ -221,50 +337,58 @@ error_at_line (status, errnum, file_name, line_number, message, va_alist) old_line_number = line_number; } + fflush (stdout); +#ifdef _LIBC +# ifdef USE_IN_LIBIO + _IO_flockfile (stderr); +# else + __flockfile (stderr); +# endif +#endif if (error_print_progname) (*error_print_progname) (); else { - fflush (stdout); - fprintf (stderr, "%s:", program_name); +#if _LIBC && USE_IN_LIBIO + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s: ", program_name); + else +#endif + fprintf (stderr, "%s:", program_name); } if (file_name != NULL) - fprintf (stderr, "%s:%d: ", file_name, line_number); + { +#if _LIBC && USE_IN_LIBIO + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s:%d: ", file_name, line_number); + else +#endif + fprintf (stderr, "%s:%d: ", file_name, line_number); + } #ifdef VA_START VA_START (args, message); -# if HAVE_VPRINTF || _LIBC - vfprintf (stderr, message, args); -# else - _doprnt (message, args, stderr); -# endif - va_end (args); + error_tail (status, errnum, message, args); #else fprintf (stderr, message, a1, a2, a3, a4, a5, a6, a7, a8); -#endif ++error_message_count; if (errnum) - { -#if defined HAVE_STRERROR_R || _LIBC - char errbuf[1024]; -# if HAVE_WORKING_STRERROR_R || _LIBC - fprintf (stderr, ": %s", __strerror_r (errnum, errbuf, sizeof errbuf)); -# else - /* Don't use __strerror_r's return value because on some systems - (at least DEC UNIX 4.0[A-D]) strerror_r returns `int'. */ - __strerror_r (errnum, errbuf, sizeof errbuf); - fprintf (stderr, ": %s", errbuf); -# endif -#else - fprintf (stderr, ": %s", strerror (errnum)); -#endif - } + print_errno_message (errnum); putc ('\n', stderr); fflush (stderr); if (status) exit (status); +#endif + +#ifdef _LIBC +# ifdef USE_IN_LIBIO + _IO_funlockfile (stderr); +# else + __funlockfile (stderr); +# endif +#endif } #ifdef _LIBC diff --git a/lib/error.h b/lib/error.h index 20f75824..177b2dcb 100644 --- a/lib/error.h +++ b/lib/error.h @@ -25,7 +25,7 @@ #ifndef __attribute__ /* This feature is available in gcc versions 2.5 and later. */ -# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) # define __attribute__(Spec) /* empty */ # endif /* The __-protected variants of `format' and `printf' attributes diff --git a/lib/getopt.c b/lib/getopt.c index d176d3e7..08ba35be 100644 --- a/lib/getopt.c +++ b/lib/getopt.c @@ -1,23 +1,25 @@ /* Getopt for GNU. - NOTE: The canonical source of this file is maintained with the GNU - C Library. Bugs can be reported to bug-glibc@gnu.org. - - Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99 + NOTE: getopt is now part of the C library, so if you don't know what + "Keep this file name-space clean" means, talk to drepper@gnu.org + before changing it! + Copyright (C) 1987,88,89,90,91,92,93,94,95,96,98,99,2000,2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2, or (at your option) any - later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + The GNU C 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 General Public License for more details. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ /* This tells Alpha OSF/1 not to define a getopt prototype in . Ditto for AIX 3.2 and . */ @@ -27,13 +29,13 @@ #ifdef HAVE_CONFIG_H # include -#else -# if !defined __STDC__ || !__STDC__ +#endif + +#if !defined __STDC__ || !__STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ -# ifndef const -# define const -# endif +# ifndef const +# define const # endif #endif @@ -75,11 +77,12 @@ #endif #ifndef _ -/* This is for other GNU distributions with internationalized messages. - When compiling libc, the _ macro is predefined. */ -# ifdef HAVE_LIBINTL_H +/* This is for other GNU distributions with internationalized messages. */ +# if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC # include -# define _(msgid) gettext (msgid) +# ifndef _ +# define _(msgid) gettext (msgid) +# endif # else # define _(msgid) (msgid) # endif @@ -250,11 +253,13 @@ static int last_nonopt; /* Bash 2.0 gives us an environment variable containing flags indicating ARGV elements that should not be considered arguments. */ +#ifdef USE_NONOPTION_FLAGS /* Defined in getopt_init.c */ extern char *__getopt_nonoption_flags; static int nonoption_flags_max_len; static int nonoption_flags_len; +#endif static int original_argc; static char *const *original_argv; @@ -275,13 +280,17 @@ store_args_and_env (int argc, char *const *argv) text_set_element (__libc_subinit, store_args_and_env); # endif /* text_set_element */ -# define SWAP_FLAGS(ch1, ch2) \ +# ifdef USE_NONOPTION_FLAGS +# define SWAP_FLAGS(ch1, ch2) \ if (nonoption_flags_len > 0) \ { \ char __tmp = __getopt_nonoption_flags[ch1]; \ __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ __getopt_nonoption_flags[ch2] = __tmp; \ } +# else +# define SWAP_FLAGS(ch1, ch2) +# endif #else /* !_LIBC */ # define SWAP_FLAGS(ch1, ch2) #endif /* _LIBC */ @@ -313,7 +322,7 @@ exchange (argv) It leaves the longer segment in the right place overall, but it consists of two parts that need to be swapped next. */ -#ifdef _LIBC +#if defined _LIBC && defined USE_NONOPTION_FLAGS /* First make sure the handling of the `__getopt_nonoption_flags' string can work normally. Our top argument must be in the range of the string. */ @@ -417,7 +426,7 @@ _getopt_initialize (argc, argv, optstring) else ordering = PERMUTE; -#ifdef _LIBC +#if defined _LIBC && defined USE_NONOPTION_FLAGS if (posixly_correct == NULL && argc == original_argc && argv == original_argv) { @@ -515,6 +524,13 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) int *longind; int long_only; { + int print_errors = opterr; + if (optstring[0] == ':') + print_errors = 0; + + if (argc < 1) + return -1; + optarg = NULL; if (optind == 0 || !__getopt_initialized) @@ -529,7 +545,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) Either it does not have option syntax, or there is an environment flag from the shell indicating it is not an option. The later information is only used when the used in the GNU libc. */ -#ifdef _LIBC +#if defined _LIBC && defined USE_NONOPTION_FLAGS # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ || (optind < nonoption_flags_len \ && __getopt_nonoption_flags[optind] == '1')) @@ -664,14 +680,17 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) pfound = p; indfound = option_index; } - else + else if (long_only + || pfound->has_arg != p->has_arg + || pfound->flag != p->flag + || pfound->val != p->val) /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { - if (opterr) + if (print_errors) fprintf (stderr, _("%s: option `%s' is ambiguous\n"), argv[0], argv[optind]); nextchar += strlen (nextchar); @@ -692,7 +711,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) optarg = nameend + 1; else { - if (opterr) + if (print_errors) { if (argv[optind - 1][1] == '-') /* --option */ @@ -718,7 +737,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) optarg = argv[optind++]; else { - if (opterr) + if (print_errors) fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); @@ -745,7 +764,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) if (!long_only || argv[optind][1] == '-' || my_index (optstring, *nextchar) == NULL) { - if (opterr) + if (print_errors) { if (argv[optind][1] == '-') /* --option */ @@ -775,7 +794,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) if (temp == NULL || c == ':') { - if (opterr) + if (print_errors) { if (posixly_correct) /* 1003.2 specifies the format of this message. */ @@ -809,7 +828,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) } else if (optind == argc) { - if (opterr) + if (print_errors) { /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: option requires an argument -- %c\n"), @@ -858,7 +877,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) } if (ambig && !exact) { - if (opterr) + if (print_errors) fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), argv[0], argv[optind]); nextchar += strlen (nextchar); @@ -876,7 +895,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) optarg = nameend + 1; else { - if (opterr) + if (print_errors) fprintf (stderr, _("\ %s: option `-W %s' doesn't allow an argument\n"), argv[0], pfound->name); @@ -891,7 +910,7 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) optarg = argv[optind++]; else { - if (opterr) + if (print_errors) fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); @@ -938,12 +957,12 @@ _getopt_internal (argc, argv, optstring, longopts, longind, long_only) } else if (optind == argc) { - if (opterr) + if (print_errors) { /* 1003.2 specifies the format of this message. */ fprintf (stderr, - _("%s: option requires an argument -- %c\n"), - argv[0], c); + _("%s: option requires an argument -- %c\n"), + argv[0], c); } optopt = c; if (optstring[0] == ':') diff --git a/lib/getopt.h b/lib/getopt.h index ac6728f8..a1b8dd66 100644 --- a/lib/getopt.h +++ b/lib/getopt.h @@ -1,21 +1,21 @@ /* Declarations for getopt. - Copyright (C) 1989,90,91,92,93,94,96,97,98 Free Software Foundation, Inc. - NOTE: The canonical source of this file is maintained with the GNU C Library. - Bugs can be reported to bug-glibc@gnu.org. - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2, or (at your option) any - later version. - - This program is distributed in the hope that it will be useful, + Copyright (C) 1989-1994, 1996-1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C 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 General Public License for more details. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - USA. */ + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ #ifndef _GETOPT_H @@ -23,6 +23,17 @@ # define _GETOPT_H 1 #endif +/* If __GNU_LIBRARY__ is not already defined, either we are being used + standalone, or this is the first header included in the source file. + If we are being used with glibc, we need to include , but + that does not exist if we are standalone. So: if __GNU_LIBRARY__ is + not defined, include , which will pull in for us + if it's from glibc. (Why ctype.h? It's guaranteed to exist and it + doesn't flood the namespace with stuff the way some other headers do.) */ +#if !defined __GNU_LIBRARY__ +# include +#endif + #ifdef __cplusplus extern "C" { #endif @@ -82,7 +93,7 @@ extern int optopt; struct option { -# if defined __STDC__ && __STDC__ +# if (defined __STDC__ && __STDC__) || defined __cplusplus const char *name; # else char *name; @@ -126,7 +137,7 @@ struct option arguments to the option '\0'. This behavior is specific to the GNU `getopt'. */ -#if defined __STDC__ && __STDC__ +#if (defined __STDC__ && __STDC__) || defined __cplusplus # ifdef __GNU_LIBRARY__ /* Many other libraries have conflicting prototypes for getopt, with differences in the consts, in stdlib.h. To avoid compilation diff --git a/lib/getopt1.c b/lib/getopt1.c index 9c825656..22a7efbd 100644 --- a/lib/getopt1.c +++ b/lib/getopt1.c @@ -1,26 +1,29 @@ /* getopt_long and getopt_long_only entry points for GNU getopt. Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98 Free Software Foundation, Inc. - NOTE: The canonical source of this file is maintained with the GNU C Library. - Bugs can be reported to bug-glibc@gnu.org. + This file is part of the GNU C Library. - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2, or (at your option) any - later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + The GNU C 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 General Public License for more details. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ #ifdef HAVE_CONFIG_H #include -#else +#endif + +#include "getopt.h" + #if !defined __STDC__ || !__STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ @@ -28,9 +31,6 @@ #define const #endif #endif -#endif - -#include "getopt.h" #include diff --git a/lib/obstack.c b/lib/obstack.c index 8368f288..0244da38 100644 --- a/lib/obstack.c +++ b/lib/obstack.c @@ -1,26 +1,25 @@ /* obstack.c - subroutines used implicitly by object stack macros - Copyright (C) 1988-1994,96,97,98,99,2000 Free Software Foundation, Inc. - + Copyright (C) 1988-1994,96,97,98,99,2000,2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Its master source is NOT part of the C library, however. The master source lives in /gd/gnu/lib. The GNU C 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. + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. The GNU C 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. + Lesser General Public License for more details. - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ #ifdef HAVE_CONFIG_H -#include +# include #endif #include "obstack.h" @@ -40,40 +39,43 @@ files, it is simpler to just do this in the source for each such file. */ #include /* Random thing to get __GNU_LIBRARY__. */ -#if !defined (_LIBC) && defined (__GNU_LIBRARY__) && __GNU_LIBRARY__ > 1 -#include -#if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION -#define ELIDE_CODE -#endif +#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1 +# include +# if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION +# define ELIDE_CODE +# endif #endif +#if defined _LIBC && defined USE_IN_LIBIO +# include +#endif #ifndef ELIDE_CODE -#if defined (__STDC__) && __STDC__ -#define POINTER void * -#else -#define POINTER char * -#endif +# if defined __STDC__ && __STDC__ +# define POINTER void * +# else +# define POINTER char * +# endif /* Determine default alignment. */ struct fooalign {char x; double d;}; -#define DEFAULT_ALIGNMENT \ +# define DEFAULT_ALIGNMENT \ ((PTR_INT_TYPE) ((char *) &((struct fooalign *) 0)->d - (char *) 0)) /* If malloc were really smart, it would round addresses to DEFAULT_ALIGNMENT. But in fact it might be less smart and round addresses to as much as DEFAULT_ROUNDING. So we prepare for it to do that. */ union fooround {long x; double d;}; -#define DEFAULT_ROUNDING (sizeof (union fooround)) +# define DEFAULT_ROUNDING (sizeof (union fooround)) /* When we copy a long block of data, this is the unit to do it with. On some machines, copying successive ints does not work; in such a case, redefine COPYING_UNIT to `long' (if that works) or `char' as a last resort. */ -#ifndef COPYING_UNIT -#define COPYING_UNIT int -#endif +# ifndef COPYING_UNIT +# define COPYING_UNIT int +# endif /* The functions allocating more room by calling `obstack_chunk_alloc' @@ -82,21 +84,21 @@ union fooround {long x; double d;}; abort gracefully or use longjump - but shouldn't return. This variable by default points to the internal function `print_and_abort'. */ -#if defined (__STDC__) && __STDC__ +# if defined __STDC__ && __STDC__ static void print_and_abort (void); void (*obstack_alloc_failed_handler) (void) = print_and_abort; -#else +# else static void print_and_abort (); void (*obstack_alloc_failed_handler) () = print_and_abort; -#endif +# endif /* Exit value used when `print_and_abort' is used. */ -#if defined __GNU_LIBRARY__ || defined HAVE_STDLIB_H -#include -#endif -#ifndef EXIT_FAILURE -#define EXIT_FAILURE 1 -#endif +# if defined __GNU_LIBRARY__ || defined HAVE_STDLIB_H +# include +# endif +# ifndef EXIT_FAILURE +# define EXIT_FAILURE 1 +# endif int obstack_exit_failure = EXIT_FAILURE; /* The non-GNU-C macros copy the obstack into this global variable @@ -110,33 +112,33 @@ struct obstack *_obstack; For free, do not use ?:, since some compilers, like the MIPS compilers, do not allow (expr) ? void : void. */ -#if defined (__STDC__) && __STDC__ -#define CALL_CHUNKFUN(h, size) \ +# if defined __STDC__ && __STDC__ +# define CALL_CHUNKFUN(h, size) \ (((h) -> use_extra_arg) \ ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \ : (*(struct _obstack_chunk *(*) (long)) (h)->chunkfun) ((size))) -#define CALL_FREEFUN(h, old_chunk) \ +# define CALL_FREEFUN(h, old_chunk) \ do { \ if ((h) -> use_extra_arg) \ (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \ else \ (*(void (*) (void *)) (h)->freefun) ((old_chunk)); \ } while (0) -#else -#define CALL_CHUNKFUN(h, size) \ +# else +# define CALL_CHUNKFUN(h, size) \ (((h) -> use_extra_arg) \ ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \ : (*(struct _obstack_chunk *(*) ()) (h)->chunkfun) ((size))) -#define CALL_FREEFUN(h, old_chunk) \ +# define CALL_FREEFUN(h, old_chunk) \ do { \ if ((h) -> use_extra_arg) \ (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \ else \ (*(void (*) ()) (h)->freefun) ((old_chunk)); \ } while (0) -#endif +# endif /* Initialize an obstack H for use. Specify chunk size SIZE (0 means default). @@ -152,13 +154,13 @@ _obstack_begin (h, size, alignment, chunkfun, freefun) struct obstack *h; int size; int alignment; -#if defined (__STDC__) && __STDC__ +# if defined __STDC__ && __STDC__ POINTER (*chunkfun) (long); void (*freefun) (void *); -#else +# else POINTER (*chunkfun) (); void (*freefun) (); -#endif +# endif { register struct _obstack_chunk *chunk; /* points to new chunk */ @@ -181,13 +183,13 @@ _obstack_begin (h, size, alignment, chunkfun, freefun) size = 4096 - extra; } -#if defined (__STDC__) && __STDC__ +# if defined __STDC__ && __STDC__ h->chunkfun = (struct _obstack_chunk * (*)(void *, long)) chunkfun; h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun; -#else +# else h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun; h->freefun = freefun; -#endif +# endif h->chunk_size = size; h->alignment_mask = alignment - 1; h->use_extra_arg = 0; @@ -210,13 +212,13 @@ _obstack_begin_1 (h, size, alignment, chunkfun, freefun, arg) struct obstack *h; int size; int alignment; -#if defined (__STDC__) && __STDC__ +# if defined __STDC__ && __STDC__ POINTER (*chunkfun) (POINTER, long); void (*freefun) (POINTER, POINTER); -#else +# else POINTER (*chunkfun) (); void (*freefun) (); -#endif +# endif POINTER arg; { register struct _obstack_chunk *chunk; /* points to new chunk */ @@ -240,13 +242,13 @@ _obstack_begin_1 (h, size, alignment, chunkfun, freefun, arg) size = 4096 - extra; } -#if defined(__STDC__) && __STDC__ +# if defined __STDC__ && __STDC__ h->chunkfun = (struct _obstack_chunk * (*)(void *,long)) chunkfun; h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun; -#else +# else h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun; h->freefun = freefun; -#endif +# endif h->chunk_size = size; h->alignment_mask = alignment - 1; h->extra_arg = arg; @@ -341,11 +343,11 @@ _obstack_newchunk (h, length) This is here for debugging. If you use it in a program, you are probably losing. */ -#if defined (__STDC__) && __STDC__ +# if defined __STDC__ && __STDC__ /* Suppress -Wmissing-prototypes warning. We don't want to declare this in obstack.h because it is just for debugging. */ int _obstack_allocated_p (struct obstack *h, POINTER obj); -#endif +# endif int _obstack_allocated_p (h, obj) @@ -370,7 +372,7 @@ _obstack_allocated_p (h, obj) /* Free objects in obstack H, including OBJ and everything allocate more recently than OBJ. If OBJ is zero, free everything in H. */ -#undef obstack_free +# undef obstack_free /* This function has two names with identical definitions. This is the first one, called from non-ANSI code. */ @@ -456,37 +458,54 @@ _obstack_memory_used (h) } /* Define the error handler. */ -#ifndef _ -# if defined HAVE_LIBINTL_H || defined _LIBC -# include -# ifndef _ -# define _(Str) gettext (Str) +# ifndef _ +# if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC +# include +# ifndef _ +# define _(Str) gettext (Str) +# endif +# else +# define _(Str) (Str) +# endif +# endif +# if defined _LIBC && defined USE_IN_LIBIO +# include +# define fputs(s, f) _IO_fputs (s, f) +# endif + +# ifndef __attribute__ +/* This feature is available in gcc versions 2.5 and later. */ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) +# define __attribute__(Spec) /* empty */ # endif -# else -# define _(Str) (Str) # endif -#endif -#if defined _LIBC && defined USE_IN_LIBIO -# include -# define fputs(s, f) _IO_fputs (s, f) -#endif static void +__attribute__ ((noreturn)) print_and_abort () { - fputs (_("memory exhausted"), stderr); - fputc ('\n', stderr); + /* Don't change any of these strings. Yes, it would be possible to add + the newline to the string and use fputs or so. But this must not + happen because the "memory exhausted" message appears in other places + like this and the translation should be reused instead of creating + a very similar string which requires a separate translation. */ +# if defined _LIBC && defined USE_IN_LIBIO + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s\n", _("memory exhausted")); + else +# endif + fprintf (stderr, "%s\n", _("memory exhausted")); exit (obstack_exit_failure); } -#if 0 +# if 0 /* These are now turned off because the applications do not use it and it uses bcopy via obstack_grow, which causes trouble on sysV. */ /* Now define the functional versions of the obstack macros. Define them to simply use the corresponding macros to do the job. */ -#if defined (__STDC__) && __STDC__ +# if defined __STDC__ && __STDC__ /* These function definitions do not work with non-ANSI preprocessors; they won't pass through the macro names in parentheses. */ @@ -597,8 +616,8 @@ POINTER (obstack_copy0) (obstack, address, length) return obstack_copy0 (obstack, address, length); } -#endif /* __STDC__ */ +# endif /* __STDC__ */ -#endif /* 0 */ +# endif /* 0 */ #endif /* !ELIDE_CODE */ diff --git a/lib/obstack.h b/lib/obstack.h index bb92232e..c949730e 100644 --- a/lib/obstack.h +++ b/lib/obstack.h @@ -4,20 +4,23 @@ This file is part of the GNU C Library. Its master source is NOT part of the C library, however. The master source lives in /gd/gnu/lib. - The GNU C 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. + NOTE: The canonical source of this file is maintained with the GNU C Library. + Bugs can be reported to bug-glibc@gnu.org. - The GNU C Library is distributed in the hope that it will be useful, + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program 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 the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ /* Summary: diff --git a/lib/quote.c b/lib/quote.c index fd1b57e9..0ce935cb 100644 --- a/lib/quote.c +++ b/lib/quote.c @@ -4,6 +4,9 @@ # include #endif +#if HAVE_STDDEF_H +# include /* For the definition of size_t on windows w/MSVC. */ +#endif #include #include #include diff --git a/lib/strnlen.c b/lib/strnlen.c index 556d2d55..15b65d84 100644 --- a/lib/strnlen.c +++ b/lib/strnlen.c @@ -1,5 +1,5 @@ /* Find the length of STRING, but scan at most MAXLEN characters. - Copyright (C) 1996, 1997, 1998, 2000 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1998, 2000, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -51,7 +51,7 @@ size_t __strnlen (const char *string, size_t maxlen) { const char *end = memchr (string, '\0', maxlen); - return end ? end - string : maxlen; + return end ? (size_t) (end - string) : maxlen; } #ifdef weak_alias weak_alias (__strnlen, strnlen) diff --git a/lib/xmalloc.c b/lib/xmalloc.c index e9cd47bc..2f103d60 100644 --- a/lib/xmalloc.c +++ b/lib/xmalloc.c @@ -47,11 +47,11 @@ void free (); #endif #ifndef HAVE_DONE_WORKING_MALLOC_CHECK -you must run the autoconf test for a properly working malloc -- see malloc.m4 +"you must run the autoconf test for a properly working malloc -- see malloc.m4" #endif #ifndef HAVE_DONE_WORKING_REALLOC_CHECK -you must run the autoconf test for a properly working realloc -- see realloc.m4 +"you must run the autoconf test for a properly working realloc --see realloc.m4" #endif /* Exit value when the requested amount of memory is not available. diff --git a/m4/c-bs-a.m4 b/m4/c-bs-a.m4 index d9e6e11e..6e0863e4 100644 --- a/m4/c-bs-a.m4 +++ b/m4/c-bs-a.m4 @@ -1,8 +1,8 @@ -#serial 3 +#serial 4 dnl From Paul Eggert. -AC_DEFUN(AC_C_BACKSLASH_A, +AC_DEFUN([AC_C_BACKSLASH_A], [ AC_CACHE_CHECK([whether backslash-a works in strings], ac_cv_c_backslash_a, [AC_TRY_COMPILE([], diff --git a/m4/error.m4 b/m4/error.m4 index c7269129..3fddb5c1 100644 --- a/m4/error.m4 +++ b/m4/error.m4 @@ -1,12 +1,13 @@ -#serial 1 +#serial 4 dnl FIXME: put these prerequisite-only *.m4 files in a separate dnl directory -- otherwise, they'll conflict with existing files. dnl These are the prerequisite macros for GNU's error.c file. -AC_DEFUN(jm_PREREQ_ERROR, +AC_DEFUN([jm_PREREQ_ERROR], [ - AC_CHECK_FUNCS(strerror strerror_r vprintf doprnt) - AC_HEADER_STDC + AC_CHECK_FUNCS(strerror vprintf doprnt) + AC_CHECK_DECLS([strerror]) AC_FUNC_STRERROR_R + AC_HEADER_STDC ]) diff --git a/m4/gettext.m4 b/m4/gettext.m4 index bbb0e9c7..e4d524cf 100644 --- a/m4/gettext.m4 +++ b/m4/gettext.m4 @@ -3,10 +3,12 @@ # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU General Public -# License but which still want to provide support for the GNU gettext -# functionality. -# Please note that the actual code of GNU gettext is covered by the GNU -# General Public License and is *not* in the public domain. +# License or the GNU Library General Public License but which still want +# to provide support for the GNU gettext functionality. +# Please note that the actual code of the GNU gettext library is covered +# by the GNU Library General Public License, and the rest of the GNU +# gettext package package is covered by the GNU General Public License. +# They are *not* in the public domain. # serial 10 @@ -241,7 +243,7 @@ return (int) gettext ("")]ifelse([$2], need-ngettext, [ + (int) ngettext ("", "" dnl Found it, now check the version. AC_MSG_CHECKING([version of bison]) changequote(<<,>>)dnl - ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison .* \([0-9]*\.[0-9.]*\).*$/\1/p'` + ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'` case $ac_prog_version in '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*) diff --git a/m4/lcmessage.m4 b/m4/lcmessage.m4 index acfd3ace..18d47a94 100644 --- a/m4/lcmessage.m4 +++ b/m4/lcmessage.m4 @@ -3,10 +3,12 @@ # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU General Public -# License but which still want to provide support for the GNU gettext -# functionality. -# Please note that the actual code of GNU gettext is covered by the GNU -# General Public License and is *not* in the public domain. +# License or the GNU Library General Public License but which still want +# to provide support for the GNU gettext functionality. +# Please note that the actual code of the GNU gettext library is covered +# by the GNU Library General Public License, and the rest of the GNU +# gettext package package is covered by the GNU General Public License. +# They are *not* in the public domain. # serial 2 diff --git a/m4/malloc.m4 b/m4/malloc.m4 index 4978eaf6..bb60947d 100644 --- a/m4/malloc.m4 +++ b/m4/malloc.m4 @@ -1,16 +1,16 @@ -#serial 3 +#serial 5 dnl From Jim Meyering. dnl Determine whether malloc accepts 0 as its argument. dnl If it doesn't, arrange to use the replacement function. dnl -AC_DEFUN(jm_FUNC_MALLOC, +AC_DEFUN([jm_FUNC_MALLOC], [ dnl xmalloc.c requires that this symbol be defined so it doesn't dnl mistakenly use a broken malloc -- as it might if this test were omitted. - AC_DEFINE_UNQUOTED(HAVE_DONE_WORKING_MALLOC_CHECK, 1, - [Define if the malloc check has been performed. ]) + AC_DEFINE(HAVE_DONE_WORKING_MALLOC_CHECK, 1, + [Define if the malloc check has been performed. ]) AC_CACHE_CHECK([for working malloc], jm_cv_func_working_malloc, [AC_TRY_RUN([ @@ -27,9 +27,8 @@ AC_DEFUN(jm_FUNC_MALLOC, jm_cv_func_working_malloc=no) ]) if test $jm_cv_func_working_malloc = no; then - AC_SUBST(LIBOBJS) - LIBOBJS="$LIBOBJS malloc.$ac_objext" - AC_DEFINE_UNQUOTED(malloc, rpl_malloc, + AC_LIBOBJ(malloc) + AC_DEFINE(malloc, rpl_malloc, [Define to rpl_malloc if the replacement function should be used.]) fi ]) diff --git a/m4/mbstate_t.m4 b/m4/mbstate_t.m4 index a185a7db..ae2bcf1e 100644 --- a/m4/mbstate_t.m4 +++ b/m4/mbstate_t.m4 @@ -1,4 +1,4 @@ -# serial 8 +# serial 9 # From Paul Eggert. @@ -10,7 +10,7 @@ # (at least glibc-2.1.3) because the "_XOPEN_SOURCE 500" definition elicits # a syntax error in wchar.h due to the use of undefined __int32_t. -AC_DEFUN(AC_MBSTATE_T, +AC_DEFUN([AC_MBSTATE_T], [ AC_CHECK_HEADERS(stdlib.h) diff --git a/m4/progtest.m4 b/m4/progtest.m4 index 08840d5d..35dc3da1 100644 --- a/m4/progtest.m4 +++ b/m4/progtest.m4 @@ -3,10 +3,12 @@ # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU General Public -# License but which still want to provide support for the GNU gettext -# functionality. -# Please note that the actual code of GNU gettext is covered by the GNU -# General Public License and is *not* in the public domain. +# License or the GNU Library General Public License but which still want +# to provide support for the GNU gettext functionality. +# Please note that the actual code of the GNU gettext library is covered +# by the GNU Library General Public License, and the rest of the GNU +# gettext package package is covered by the GNU General Public License. +# They are *not* in the public domain. # serial 2 diff --git a/m4/realloc.m4 b/m4/realloc.m4 index bfbef0c1..c8a82374 100644 --- a/m4/realloc.m4 +++ b/m4/realloc.m4 @@ -1,16 +1,16 @@ -#serial 3 +#serial 5 dnl From Jim Meyering. dnl Determine whether realloc works when both arguments are 0. dnl If it doesn't, arrange to use the replacement function. dnl -AC_DEFUN(jm_FUNC_REALLOC, +AC_DEFUN([jm_FUNC_REALLOC], [ dnl xmalloc.c requires that this symbol be defined so it doesn't dnl mistakenly use a broken realloc -- as it might if this test were omitted. - AC_DEFINE_UNQUOTED(HAVE_DONE_WORKING_REALLOC_CHECK, 1, - [Define if the realloc check has been performed. ]) + AC_DEFINE(HAVE_DONE_WORKING_REALLOC_CHECK, 1, + [Define if the realloc check has been performed. ]) AC_CACHE_CHECK([for working realloc], jm_cv_func_working_realloc, [AC_TRY_RUN([ @@ -27,9 +27,8 @@ AC_DEFUN(jm_FUNC_REALLOC, jm_cv_func_working_realloc=no) ]) if test $jm_cv_func_working_realloc = no; then - AC_SUBST(LIBOBJS) - LIBOBJS="$LIBOBJS realloc.$ac_objext" - AC_DEFINE_UNQUOTED(realloc, rpl_realloc, + AC_LIBOBJ(realloc) + AC_DEFINE(realloc, rpl_realloc, [Define to rpl_realloc if the replacement function should be used.]) fi ]) diff --git a/m4/strerror_r.m4 b/m4/strerror_r.m4 index 6cf46240..bd286352 100644 --- a/m4/strerror_r.m4 +++ b/m4/strerror_r.m4 @@ -1,9 +1,23 @@ -#serial 1002 +#serial 1003 # Experimental replacement for the function in the latest CVS autoconf. -# If the compile-test says strerror_r doesn't work, then resort to a -# `run'-test that works on BeOS and segfaults on DEC Unix. # Use with the error.c file in ../lib. +# Copyright 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program 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 General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + undefine([AC_FUNC_STRERROR_R]) # AC_FUNC_STRERROR_R @@ -11,56 +25,35 @@ undefine([AC_FUNC_STRERROR_R]) AC_DEFUN([AC_FUNC_STRERROR_R], [AC_CHECK_DECLS([strerror_r]) AC_CHECK_FUNCS([strerror_r]) -if test $ac_cv_func_strerror_r = yes; then - AC_CHECK_HEADERS(string.h) - AC_CACHE_CHECK([for working strerror_r], - ac_cv_func_strerror_r_works, +AC_CACHE_CHECK([whether strerror_r returns char *], + ac_cv_func_strerror_r_char_p, [ - AC_TRY_COMPILE( - [ -# include -# if HAVE_STRING_H -# include -# endif - ], - [ - char buf[100]; - char x = *strerror_r (0, buf, sizeof buf); - ], - ac_cv_func_strerror_r_works=yes, - ac_cv_func_strerror_r_works=no - ) - if test $ac_cv_func_strerror_r_works = no; then - # strerror_r seems not to work, but now we have to choose between + ac_cv_func_strerror_r_char_p=no + if test $ac_cv_have_decl_strerror_r = yes; then + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT], + [[ + char buf[100]; + char x = *strerror_r (0, buf, sizeof buf); + char *p = strerror_r (0, buf, sizeof buf); + ]])], + ac_cv_func_strerror_r_char_p=yes) + else + # strerror_r is not declared. Choose between # systems that have relatively inaccessible declarations for the # function. BeOS and DEC UNIX 4.0 fall in this category, but the # former has a strerror_r that returns char*, while the latter # has a strerror_r that returns `int'. # This test should segfault on the DEC system. - AC_TRY_RUN( - [ -# include -# include -# include - - extern char *strerror_r (); - - int - main () - { - char buf[100]; + AC_RUN_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT + extern char *strerror_r ();], + [[char buf[100]; char x = *strerror_r (0, buf, sizeof buf); - exit (!isalpha (x)); - } - ], - ac_cv_func_strerror_r_works=yes, - ac_cv_func_strerror_r_works=no, - ac_cv_func_strerror_r_works=no) + exit (!isalpha (x));]])], + ac_cv_func_strerror_r_char_p=yes, , :) fi ]) - if test $ac_cv_func_strerror_r_works = yes; then - AC_DEFINE_UNQUOTED(HAVE_WORKING_STRERROR_R, 1, - [Define to 1 if `strerror_r' returns a string.]) - fi +if test $ac_cv_func_strerror_r_char_p = yes; then + AC_DEFINE([STRERROR_R_CHAR_P], 1, + [Define to 1 if strerror_r returns char *.]) fi ])# AC_FUNC_STRERROR_R -- 2.47.2