bug-cvs
[Top][All Lists]
Advanced

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

Re: `cvs up -p FILE' does not detect write failure


From: Jim Meyering
Subject: Re: `cvs up -p FILE' does not detect write failure
Date: Wed, 02 Mar 2005 23:56:12 +0100

Jim Meyering <address@hidden> wrote:
> It looks like no version of CVS detects the write failure
> caused by this sort of command:
>
>   $ cvs -Q up -p README > /dev/full
>   $
>
> It should do something like this instead:
>
>   $ ./cvs -Q up -p README > /dev/full
>   cvs [update aborted]: write error: No space left on device
>   [Exit 1]
>
> I've included part of a patch to make it do just that, below.
> This changes makes CVS use the closeout module from gnulib.
> And that module pulls in a few other modules (fpending, quotearg, etc).
> Add to that the fact that running cvs' ./gnulib-update updates
> every single file in the m4/ subdirectory, I figured I'd give you
> a heads-up first.  What's your policy on updating from Gnulib?

Now that Derek has updated from gnulib, this will go in more easily.
Here's a complete patch, minus the parts that are regenerated via
autoreconf (which I'll check in, too, being careful to use automake-1.9.3,
which is what generated the current Makefile.in files -- unless we can
upgrade to automake-1.9.5 -- quite safe, IMHO).

Barring objections, I'll commit this in 8-10 hours.

Jim

 ChangeLog           |    6
 NEWS                |    3
 gnulib-modules      |    1
 gnulib.txt          |    5
 lib/ChangeLog       |   10
 lib/Makefile.am     |    7
 lib/Makefile.gnulib |   22 +
 lib/__fpending.c    |   32 ++
 lib/__fpending.h    |   17 +
 lib/closeout.c      |  101 +++++++
 lib/closeout.h      |   33 ++
 lib/quotearg.c      |  674 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 lib/quotearg.h      |  137 ++++++++++
 m4/ChangeLog        |    5
 m4/closeout.m4      |   11
 m4/fpending.m4      |   77 +++++
 m4/gnulib.m4        |    7
 m4/mbrtowc.m4       |   25 +
 m4/quotearg.m4      |   14 +
 19 files changed, 1182 insertions(+), 5 deletions(-)

Index: ChangeLog
===================================================================
RCS file: /cvs/ccvs/ChangeLog,v
retrieving revision 1.1166
diff -u -p -r1.1166 ChangeLog
--- ChangeLog   2 Mar 2005 21:08:27 -0000       1.1166
+++ ChangeLog   2 Mar 2005 22:46:39 -0000
@@ -1,3 +1,9 @@
+2005-03-02  Jim Meyering  <address@hidden>
+
+       * NEWS: Note that cvs now detects write errors on stdout.
+       * gnulib-modules: Add closeout.
+       * gnulib.txt: Regenerate.
+
 2005-03-02 Derek Price <address@hidden>
 
        * gnulib-update: Redirect gnulib-tool output back to /dev/null.
Index: NEWS
===================================================================
RCS file: /cvs/ccvs/NEWS,v
retrieving revision 1.301
diff -u -p -r1.301 NEWS
--- NEWS        1 Mar 2005 18:22:53 -0000       1.301
+++ NEWS        2 Mar 2005 22:46:40 -0000
@@ -44,6 +44,9 @@ BUG FIXES
 
 * Misc bug and documentation fixes.
 
+* CVS now detects write errors on standard output.  Before, e.g.,
+  `cvs update -p FILE > /dev/full' would fail to report the write error.
+
 Changes from 1.12.10 to 1.12.11:
 ********************************
 
Index: gnulib-modules
===================================================================
RCS file: /cvs/ccvs/gnulib-modules,v
retrieving revision 1.1
diff -u -p -r1.1 gnulib-modules
--- gnulib-modules      1 Mar 2005 18:19:26 -0000       1.1
+++ gnulib-modules      2 Mar 2005 22:46:40 -0000
@@ -55,3 +55,4 @@ ftruncate
 strtoul
 pathmax
 xalloc-die
+closeout
Index: gnulib.txt
===================================================================
RCS file: /cvs/ccvs/gnulib.txt,v
retrieving revision 1.41
diff -u -p -r1.41 gnulib.txt
--- gnulib.txt  1 Mar 2005 18:19:26 -0000       1.41
+++ gnulib.txt  2 Mar 2005 22:46:40 -0000
@@ -318,3 +318,8 @@ m4/onceonly_2_57.m4
 lib/xalloc-die.c
 
 m4/onceonly_2_57.m4
+lib/closeout.h
+lib/closeout.c
+m4/closeout.m4
+
+m4/onceonly_2_57.m4
Index: lib/ChangeLog
===================================================================
RCS file: /cvs/ccvs/lib/ChangeLog,v
retrieving revision 1.399
diff -u -p -r1.399 ChangeLog
--- lib/ChangeLog       2 Mar 2005 21:06:31 -0000       1.399
+++ lib/ChangeLog       2 Mar 2005 22:46:40 -0000
@@ -1,3 +1,13 @@
+2005-03-02  Jim Meyering  <address@hidden>
+
+       * Makefile.am (libcvs_a_SOURCES): Add the following to support
+       the GNULIB closeout module: closeout.c, closeout.h, quotearg.c,
+       quotearg.h, __fpending.h.
+       * closeout.c, closeout.h: New files.
+       * quotearg.c, quotearg.h: New files.
+       * __fpending.c, __fpending.h: New files.
+       * Makefile.gnulib: Regenerate.
+
 2005-03-02  Derek Price  <address@hidden>
 
        * gettext.h, setenv.c, vasnprintf.c, vasprintf.c: Update from GNULIB.
Index: lib/Makefile.am
===================================================================
RCS file: /cvs/ccvs/lib/Makefile.am,v
retrieving revision 1.91
diff -u -p -r1.91 Makefile.am
--- lib/Makefile.am     1 Mar 2005 18:15:42 -0000       1.91
+++ lib/Makefile.am     2 Mar 2005 22:46:40 -0000
@@ -114,7 +114,7 @@ getdate_SOURCES = \
        xalloc-die.c \
        xgetcwd.h xgetcwd.c \
        xalloc.h \
-       xmalloc.c 
+       xmalloc.c
 ## This source file was added only for the getdate test program when compiled
 ## with GNULIB's error.c.
 getdate_SOURCES += \
@@ -245,6 +245,11 @@ libcvs_a_SOURCES += xsize.h
 ## For GNULIB's yesno module.
 libcvs_a_SOURCES += yesno.c yesno.h
 
+## For GNULIB's closeout module.
+libcvs_a_SOURCES += closeout.c closeout.h
+libcvs_a_SOURCES += quotearg.c quotearg.h
+libcvs_a_SOURCES += __fpending.h
+
 # Until Automake gets its act together
 distclean-local:
        rm -f fnmatch.h
Index: lib/Makefile.gnulib
===================================================================
RCS file: /cvs/ccvs/lib/Makefile.gnulib,v
retrieving revision 1.44
diff -u -p -r1.44 Makefile.gnulib
--- lib/Makefile.gnulib 2 Mar 2005 21:06:31 -0000       1.44
+++ lib/Makefile.gnulib 2 Mar 2005 22:46:40 -0000
@@ -8,8 +8,8 @@
 # the same distribution terms as the rest of that program.
 #
 # Generated by gnulib-tool.
-# Invoked as: gnulib-tool --import gettext vasnprintf regex atexit save-cwd 
dirname exit exitfail extensions fnmatch-posix fnmatch mkstemp getopt stdbool 
getline getnline getndelim2 gethostname strcase getpass-gnu gettimeofday 
timespec gettime unlocked-io tzset restrict time_r mktime minmax memmove 
nanosleep stat lstat strerror vasprintf malloc realloc strftime xsize 
getpagesize md5 stdint yesno allocsa setenv getdate readlink xreadlink 
xgethostname mkdir rename dup2 strstr ftruncate strtoul pathmax xalloc-die
-# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib 
--m4-base=m4   alloca alloca-opt allocsa atexit chdir-long dirname dup2 error 
exit exitfail extensions fnmatch fnmatch-posix ftruncate getcwd getdate 
gethostname getline getndelim2 getnline getopt getpagesize getpass-gnu gettext 
gettime gettimeofday lstat malloc md5 memmove mempcpy memrchr minmax mkdir 
mkstemp mktime nanosleep openat pathmax readlink realloc regex rename restrict 
rpmatch save-cwd setenv stat stdbool stdint strcase strerror strftime strstr 
strtol strtoul time_r timespec tzset unlocked-io vasnprintf vasprintf xalloc 
xalloc-die xgetcwd xgethostname xreadlink xsize yesno
+# Invoked as: gnulib-tool --import gettext vasnprintf regex atexit save-cwd 
dirname exit exitfail extensions fnmatch-posix fnmatch mkstemp getopt stdbool 
getline getnline getndelim2 gethostname strcase getpass-gnu gettimeofday 
timespec gettime unlocked-io tzset restrict time_r mktime minmax memmove 
nanosleep stat lstat strerror vasprintf malloc realloc strftime xsize 
getpagesize md5 stdint yesno allocsa setenv getdate readlink xreadlink 
xgethostname mkdir rename dup2 strstr ftruncate strtoul pathmax xalloc-die 
closeout
+# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib 
--m4-base=m4   alloca alloca-opt allocsa atexit chdir-long closeout dirname 
dup2 error exit exitfail extensions fnmatch fnmatch-posix fpending ftruncate 
getcwd getdate gethostname getline getndelim2 getnline getopt getpagesize 
getpass-gnu gettext gettime gettimeofday lstat malloc md5 memmove mempcpy 
memrchr minmax mkdir mkstemp mktime nanosleep openat pathmax quotearg readlink 
realloc regex rename restrict rpmatch save-cwd setenv stat stdbool stdint 
strcase strerror strftime strstr strtol strtoul time_r timespec tzset 
unlocked-io vasnprintf vasprintf xalloc xalloc-die xgetcwd xgethostname 
xreadlink xsize yesno
 
 AUTOMAKE_OPTIONS = 1.5 gnits no-dependencies
 
@@ -53,6 +53,12 @@ EXTRA_DIST += allocsa.valgrind
 
 ## end   gnulib module allocsa
 
+## begin gnulib module closeout
+
+libgnu_a_SOURCES += closeout.h closeout.c
+
+## end   gnulib module closeout
+
 ## begin gnulib module dirname
 
 libgnu_a_SOURCES += dirname.h dirname.c basename.c stripslash.c
@@ -86,6 +92,12 @@ MOSTLYCLEANFILES += fnmatch.h fnmatch.h-
 
 ## end   gnulib module fnmatch
 
+## begin gnulib module fpending
+
+libgnu_a_SOURCES += __fpending.h
+
+## end   gnulib module fpending
+
 ## begin gnulib module getcwd
 
 libgnu_a_SOURCES += getcwd.h
@@ -170,6 +182,12 @@ libgnu_a_SOURCES += pathmax.h
 
 ## end   gnulib module pathmax
 
+## begin gnulib module quotearg
+
+libgnu_a_SOURCES += quotearg.h quotearg.c
+
+## end   gnulib module quotearg
+
 ## begin gnulib module regex
 
 libgnu_a_SOURCES += regex.h
Index: lib/__fpending.c
===================================================================
RCS file: lib/__fpending.c
diff -N lib/__fpending.c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ lib/__fpending.c    2 Mar 2005 22:46:40 -0000
@@ -0,0 +1,32 @@
+/* __fpending.c -- return the number of pending output bytes on a stream
+   Copyright (C) 2000, 2004 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.  */
+
+/* Written by Jim Meyering. */
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "__fpending.h"
+
+/* Return the number of pending (aka buffered, unflushed)
+   bytes on the stream, FP, that is open for writing.  */
+size_t
+__fpending (FILE *fp)
+{
+  return PENDING_OUTPUT_N_BYTES;
+}
Index: lib/__fpending.h
===================================================================
RCS file: lib/__fpending.h
diff -N lib/__fpending.h
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ lib/__fpending.h    2 Mar 2005 22:46:40 -0000
@@ -0,0 +1,17 @@
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stddef.h>
+#include <stdio.h>
+
+#if HAVE_STDIO_EXT_H
+# include <stdio_ext.h>
+#endif
+
+#ifndef HAVE_DECL___FPENDING
+"this configure-time declaration test was not run"
+#endif
+#if !HAVE_DECL___FPENDING
+size_t __fpending (FILE *);
+#endif
Index: lib/closeout.c
===================================================================
RCS file: lib/closeout.c
diff -N lib/closeout.c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ lib/closeout.c      2 Mar 2005 22:46:40 -0000
@@ -0,0 +1,101 @@
+/* closeout.c - close standard output
+
+   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004 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.  */
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "closeout.h"
+
+#include <stdio.h>
+#include <stdbool.h>
+#include <errno.h>
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+
+#include "error.h"
+#include "exitfail.h"
+#include "quotearg.h"
+#include "__fpending.h"
+
+#if USE_UNLOCKED_IO
+# include "unlocked-io.h"
+#endif
+
+static const char *file_name;
+
+/* Set the file name to be reported in the event an error is detected
+   by close_stdout.  */
+void
+close_stdout_set_file_name (const char *file)
+{
+  file_name = file;
+}
+
+/* Close standard output, exiting with status 'exit_failure' on failure.
+   If a program writes *anything* to stdout, that program should close
+   stdout and make sure that it succeeds before exiting.  Otherwise,
+   suppose that you go to the extreme of checking the return status
+   of every function that does an explicit write to stdout.  The last
+   printf can succeed in writing to the internal stream buffer, and yet
+   the fclose(stdout) could still fail (due e.g., to a disk full error)
+   when it tries to write out that buffered data.  Thus, you would be
+   left with an incomplete output file and the offending program would
+   exit successfully.  Even calling fflush is not always sufficient,
+   since some file systems (NFS and CODA) buffer written/flushed data
+   until an actual close call.
+
+   Besides, it's wasteful to check the return value from every call
+   that writes to stdout -- just let the internal stream state record
+   the failure.  That's what the ferror test is checking below.
+
+   It's important to detect such failures and exit nonzero because many
+   tools (most notably `make' and other build-management systems) depend
+   on being able to detect failure in other tools via their exit status.  */
+
+void
+close_stdout (void)
+{
+  bool prev_fail = ferror (stdout);
+  bool none_pending = (0 == __fpending (stdout));
+  bool fclose_fail = fclose (stdout);
+
+  if (prev_fail || fclose_fail)
+    {
+      int e = fclose_fail ? errno : 0;
+      char const *write_error;
+
+      /* If ferror returned zero, no data remains to be flushed, and we'd
+        otherwise fail with EBADF due to a failed fclose, then assume that
+        it's ok to ignore the fclose failure.  That can happen when a
+        program like cp is invoked like this `cp a b >&-' (i.e., with
+        stdout closed) and doesn't generate any output (hence no previous
+        error and nothing to be flushed).  */
+      if (e == EBADF && !prev_fail && none_pending)
+       return;
+
+      write_error = _("write error");
+      if (file_name)
+       error (exit_failure, e, "%s: %s", quotearg_colon (file_name),
+              write_error);
+      else
+       error (exit_failure, e, "%s", write_error);
+    }
+}
Index: lib/closeout.h
===================================================================
RCS file: lib/closeout.h
diff -N lib/closeout.h
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ lib/closeout.h      2 Mar 2005 22:46:40 -0000
@@ -0,0 +1,33 @@
+/* Close standard output.
+
+   Copyright (C) 1998, 2000, 2003, 2004 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.  */
+
+#ifndef CLOSEOUT_H
+# define CLOSEOUT_H 1
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+void close_stdout_set_file_name (const char *file);
+void close_stdout (void);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
Index: lib/quotearg.c
===================================================================
RCS file: lib/quotearg.c
diff -N lib/quotearg.c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ lib/quotearg.c      2 Mar 2005 22:46:40 -0000
@@ -0,0 +1,674 @@
+/* quotearg.c - quote arguments for output
+
+   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004 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.  */
+
+/* Written by Paul Eggert <address@hidden> */
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "quotearg.h"
+
+#include "xalloc.h"
+
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "gettext.h"
+#define _(msgid) gettext (msgid)
+#define N_(msgid) msgid
+
+#if HAVE_WCHAR_H
+
+/* BSD/OS 4.1 wchar.h requires FILE and struct tm to be declared.  */
+# include <stdio.h>
+# include <time.h>
+
+# include <wchar.h>
+#endif
+
+#if !HAVE_MBRTOWC
+/* Disable multibyte processing entirely.  Since MB_CUR_MAX is 1, the
+   other macros are defined only for documentation and to satisfy C
+   syntax.  */
+# undef MB_CUR_MAX
+# define MB_CUR_MAX 1
+# define mbrtowc(pwc, s, n, ps) ((*(pwc) = *(s)) != 0)
+# define iswprint(wc) isprint ((unsigned char) (wc))
+# undef HAVE_MBSINIT
+#endif
+
+#if !defined mbsinit && !HAVE_MBSINIT
+# define mbsinit(ps) 1
+#endif
+
+#ifndef iswprint
+# if HAVE_WCTYPE_H
+#  include <wctype.h>
+# endif
+# if !defined iswprint && !HAVE_ISWPRINT
+#  define iswprint(wc) 1
+# endif
+#endif
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+
+#define INT_BITS (sizeof (int) * CHAR_BIT)
+
+struct quoting_options
+{
+  /* Basic quoting style.  */
+  enum quoting_style style;
+
+  /* Quote the characters indicated by this bit vector even if the
+     quoting style would not normally require them to be quoted.  */
+  unsigned int quote_these_too[(UCHAR_MAX / INT_BITS) + 1];
+};
+
+/* Names of quoting styles.  */
+char const *const quoting_style_args[] =
+{
+  "literal",
+  "shell",
+  "shell-always",
+  "c",
+  "escape",
+  "locale",
+  "clocale",
+  0
+};
+
+/* Correspondences to quoting style names.  */
+enum quoting_style const quoting_style_vals[] =
+{
+  literal_quoting_style,
+  shell_quoting_style,
+  shell_always_quoting_style,
+  c_quoting_style,
+  escape_quoting_style,
+  locale_quoting_style,
+  clocale_quoting_style
+};
+
+/* The default quoting options.  */
+static struct quoting_options default_quoting_options;
+
+/* Allocate a new set of quoting options, with contents initially identical
+   to O if O is not null, or to the default if O is null.
+   It is the caller's responsibility to free the result.  */
+struct quoting_options *
+clone_quoting_options (struct quoting_options *o)
+{
+  int e = errno;
+  struct quoting_options *p = xmalloc (sizeof *p);
+  *p = *(o ? o : &default_quoting_options);
+  errno = e;
+  return p;
+}
+
+/* Get the value of O's quoting style.  If O is null, use the default.  */
+enum quoting_style
+get_quoting_style (struct quoting_options *o)
+{
+  return (o ? o : &default_quoting_options)->style;
+}
+
+/* In O (or in the default if O is null),
+   set the value of the quoting style to S.  */
+void
+set_quoting_style (struct quoting_options *o, enum quoting_style s)
+{
+  (o ? o : &default_quoting_options)->style = s;
+}
+
+/* In O (or in the default if O is null),
+   set the value of the quoting options for character C to I.
+   Return the old value.  Currently, the only values defined for I are
+   0 (the default) and 1 (which means to quote the character even if
+   it would not otherwise be quoted).  */
+int
+set_char_quoting (struct quoting_options *o, char c, int i)
+{
+  unsigned char uc = c;
+  unsigned int *p =
+    (o ? o : &default_quoting_options)->quote_these_too + uc / INT_BITS;
+  int shift = uc % INT_BITS;
+  int r = (*p >> shift) & 1;
+  *p ^= ((i & 1) ^ r) << shift;
+  return r;
+}
+
+/* MSGID approximates a quotation mark.  Return its translation if it
+   has one; otherwise, return either it or "\"", depending on S.  */
+static char const *
+gettext_quote (char const *msgid, enum quoting_style s)
+{
+  char const *translation = _(msgid);
+  if (translation == msgid && s == clocale_quoting_style)
+    translation = "\"";
+  return translation;
+}
+
+/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
+   argument ARG (of size ARGSIZE), using QUOTING_STYLE and the
+   non-quoting-style part of O to control quoting.
+   Terminate the output with a null character, and return the written
+   size of the output, not counting the terminating null.
+   If BUFFERSIZE is too small to store the output string, return the
+   value that would have been returned had BUFFERSIZE been large enough.
+   If ARGSIZE is SIZE_MAX, use the string length of the argument for ARGSIZE.
+
+   This function acts like quotearg_buffer (BUFFER, BUFFERSIZE, ARG,
+   ARGSIZE, O), except it uses QUOTING_STYLE instead of the quoting
+   style specified by O, and O may not be null.  */
+
+static size_t
+quotearg_buffer_restyled (char *buffer, size_t buffersize,
+                         char const *arg, size_t argsize,
+                         enum quoting_style quoting_style,
+                         struct quoting_options const *o)
+{
+  size_t i;
+  size_t len = 0;
+  char const *quote_string = 0;
+  size_t quote_string_len = 0;
+  bool backslash_escapes = false;
+  bool unibyte_locale = MB_CUR_MAX == 1;
+
+#define STORE(c) \
+    do \
+      { \
+       if (len < buffersize) \
+         buffer[len] = (c); \
+       len++; \
+      } \
+    while (0)
+
+  switch (quoting_style)
+    {
+    case c_quoting_style:
+      STORE ('"');
+      backslash_escapes = true;
+      quote_string = "\"";
+      quote_string_len = 1;
+      break;
+
+    case escape_quoting_style:
+      backslash_escapes = true;
+      break;
+
+    case locale_quoting_style:
+    case clocale_quoting_style:
+      {
+       /* Get translations for open and closing quotation marks.
+
+          The message catalog should translate "`" to a left
+          quotation mark suitable for the locale, and similarly for
+          "'".  If the catalog has no translation,
+          locale_quoting_style quotes `like this', and
+          clocale_quoting_style quotes "like this".
+
+          For example, an American English Unicode locale should
+          translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
+          should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
+          MARK).  A British English Unicode locale should instead
+          translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
+          U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.  */
+
+       char const *left = gettext_quote (N_("`"), quoting_style);
+       char const *right = gettext_quote (N_("'"), quoting_style);
+       for (quote_string = left; *quote_string; quote_string++)
+         STORE (*quote_string);
+       backslash_escapes = true;
+       quote_string = right;
+       quote_string_len = strlen (quote_string);
+      }
+      break;
+
+    case shell_always_quoting_style:
+      STORE ('\'');
+      quote_string = "'";
+      quote_string_len = 1;
+      break;
+
+    default:
+      break;
+    }
+
+  for (i = 0;  ! (argsize == SIZE_MAX ? arg[i] == '\0' : i == argsize);  i++)
+    {
+      unsigned char c;
+      unsigned char esc;
+
+      if (backslash_escapes
+         && quote_string_len
+         && i + quote_string_len <= argsize
+         && memcmp (arg + i, quote_string, quote_string_len) == 0)
+       STORE ('\\');
+
+      c = arg[i];
+      switch (c)
+       {
+       case '\0':
+         if (backslash_escapes)
+           {
+             STORE ('\\');
+             STORE ('0');
+             STORE ('0');
+             c = '0';
+           }
+         break;
+
+       case '?':
+         switch (quoting_style)
+           {
+           case shell_quoting_style:
+             goto use_shell_always_quoting_style;
+
+           case c_quoting_style:
+             if (i + 2 < argsize && arg[i + 1] == '?')
+               switch (arg[i + 2])
+                 {
+                 case '!': case '\'':
+                 case '(': case ')': case '-': case '/':
+                 case '<': case '=': case '>':
+                   /* Escape the second '?' in what would otherwise be
+                      a trigraph.  */
+                   c = arg[i + 2];
+                   i += 2;
+                   STORE ('?');
+                   STORE ('\\');
+                   STORE ('?');
+                   break;
+                 }
+             break;
+
+           default:
+             break;
+           }
+         break;
+
+       case '\a': esc = 'a'; goto c_escape;
+       case '\b': esc = 'b'; goto c_escape;
+       case '\f': esc = 'f'; goto c_escape;
+       case '\n': esc = 'n'; goto c_and_shell_escape;
+       case '\r': esc = 'r'; goto c_and_shell_escape;
+       case '\t': esc = 't'; goto c_and_shell_escape;
+       case '\v': esc = 'v'; goto c_escape;
+       case '\\': esc = c; goto c_and_shell_escape;
+
+       c_and_shell_escape:
+         if (quoting_style == shell_quoting_style)
+           goto use_shell_always_quoting_style;
+       c_escape:
+         if (backslash_escapes)
+           {
+             c = esc;
+             goto store_escape;
+           }
+         break;
+
+       case '{': case '}': /* sometimes special if isolated */
+         if (! (argsize == SIZE_MAX ? arg[1] == '\0' : argsize == 1))
+           break;
+         /* Fall through.  */
+       case '#': case '~':
+         if (i != 0)
+           break;
+         /* Fall through.  */
+       case ' ':
+       case '!': /* special in bash */
+       case '"': case '$': case '&':
+       case '(': case ')': case '*': case ';':
+       case '<':
+       case '=': /* sometimes special in 0th or (with "set -k") later args */
+       case '>': case '[':
+       case '^': /* special in old /bin/sh, e.g. SunOS 4.1.4 */
+       case '`': case '|':
+         /* A shell special character.  In theory, '$' and '`' could
+            be the first bytes of multibyte characters, which means
+            we should check them with mbrtowc, but in practice this
+            doesn't happen so it's not worth worrying about.  */
+         if (quoting_style == shell_quoting_style)
+           goto use_shell_always_quoting_style;
+         break;
+
+       case '\'':
+         switch (quoting_style)
+           {
+           case shell_quoting_style:
+             goto use_shell_always_quoting_style;
+
+           case shell_always_quoting_style:
+             STORE ('\'');
+             STORE ('\\');
+             STORE ('\'');
+             break;
+
+           default:
+             break;
+           }
+         break;
+
+       case '%': case '+': case ',': case '-': case '.': case '/':
+       case '0': case '1': case '2': case '3': case '4': case '5':
+       case '6': case '7': case '8': case '9': case ':':
+       case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+       case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
+       case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
+       case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
+       case 'Y': case 'Z': case ']': case '_': case 'a': case 'b':
+       case 'c': case 'd': case 'e': case 'f': case 'g': case 'h':
+       case 'i': case 'j': case 'k': case 'l': case 'm': case 'n':
+       case 'o': case 'p': case 'q': case 'r': case 's': case 't':
+       case 'u': case 'v': case 'w': case 'x': case 'y': case 'z':
+         /* These characters don't cause problems, no matter what the
+            quoting style is.  They cannot start multibyte sequences.  */
+         break;
+
+       default:
+         /* If we have a multibyte sequence, copy it until we reach
+            its end, find an error, or come back to the initial shift
+            state.  For C-like styles, if the sequence has
+            unprintable characters, escape the whole sequence, since
+            we can't easily escape single characters within it.  */
+         {
+           /* Length of multibyte sequence found so far.  */
+           size_t m;
+
+           bool printable;
+
+           if (unibyte_locale)
+             {
+               m = 1;
+               printable = isprint (c) != 0;
+             }
+           else
+             {
+               mbstate_t mbstate;
+               memset (&mbstate, 0, sizeof mbstate);
+
+               m = 0;
+               printable = true;
+               if (argsize == SIZE_MAX)
+                 argsize = strlen (arg);
+
+               do
+                 {
+                   wchar_t w;
+                   size_t bytes = mbrtowc (&w, &arg[i + m],
+                                           argsize - (i + m), &mbstate);
+                   if (bytes == 0)
+                     break;
+                   else if (bytes == (size_t) -1)
+                     {
+                       printable = false;
+                       break;
+                     }
+                   else if (bytes == (size_t) -2)
+                     {
+                       printable = false;
+                       while (i + m < argsize && arg[i + m])
+                         m++;
+                       break;
+                     }
+                   else
+                     {
+                       /* Work around a bug with older shells that "see" a '\'
+                          that is really the 2nd byte of a multibyte character.
+                          In practice the problem is limited to ASCII
+                          chars >= '@' that are shell special chars.  */
+                       if ('[' == 0x5b && quoting_style == shell_quoting_style)
+                         {
+                           size_t j;
+                           for (j = 1; j < bytes; j++)
+                             switch (arg[i + m + j])
+                               {
+                               case '[': case '\\': case '^':
+                               case '`': case '|':
+                                 goto use_shell_always_quoting_style;
+                               }
+                         }
+
+                       if (! iswprint (w))
+                         printable = false;
+                       m += bytes;
+                     }
+                 }
+               while (! mbsinit (&mbstate));
+             }
+
+           if (1 < m || (backslash_escapes && ! printable))
+             {
+               /* Output a multibyte sequence, or an escaped
+                  unprintable unibyte character.  */
+               size_t ilim = i + m;
+
+               for (;;)
+                 {
+                   if (backslash_escapes && ! printable)
+                     {
+                       STORE ('\\');
+                       STORE ('0' + (c >> 6));
+                       STORE ('0' + ((c >> 3) & 7));
+                       c = '0' + (c & 7);
+                     }
+                   if (ilim <= i + 1)
+                     break;
+                   STORE (c);
+                   c = arg[++i];
+                 }
+
+               goto store_c;
+             }
+         }
+       }
+
+      if (! (backslash_escapes
+            && o->quote_these_too[c / INT_BITS] & (1 << (c % INT_BITS))))
+       goto store_c;
+
+    store_escape:
+      STORE ('\\');
+
+    store_c:
+      STORE (c);
+    }
+
+  if (i == 0 && quoting_style == shell_quoting_style)
+    goto use_shell_always_quoting_style;
+
+  if (quote_string)
+    for (; *quote_string; quote_string++)
+      STORE (*quote_string);
+
+  if (len < buffersize)
+    buffer[len] = '\0';
+  return len;
+
+ use_shell_always_quoting_style:
+  return quotearg_buffer_restyled (buffer, buffersize, arg, argsize,
+                                  shell_always_quoting_style, o);
+}
+
+/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
+   argument ARG (of size ARGSIZE), using O to control quoting.
+   If O is null, use the default.
+   Terminate the output with a null character, and return the written
+   size of the output, not counting the terminating null.
+   If BUFFERSIZE is too small to store the output string, return the
+   value that would have been returned had BUFFERSIZE been large enough.
+   If ARGSIZE is SIZE_MAX, use the string length of the argument for
+   ARGSIZE.  */
+size_t
+quotearg_buffer (char *buffer, size_t buffersize,
+                char const *arg, size_t argsize,
+                struct quoting_options const *o)
+{
+  struct quoting_options const *p = o ? o : &default_quoting_options;
+  int e = errno;
+  size_t r = quotearg_buffer_restyled (buffer, buffersize, arg, argsize,
+                                      p->style, p);
+  errno = e;
+  return r;
+}
+
+/* Like quotearg_buffer (..., ARG, ARGSIZE, O), except return newly
+   allocated storage containing the quoted string.  */
+char *
+quotearg_alloc (char const *arg, size_t argsize,
+               struct quoting_options const *o)
+{
+  int e = errno;
+  size_t bufsize = quotearg_buffer (0, 0, arg, argsize, o) + 1;
+  char *buf = xmalloc (bufsize);
+  quotearg_buffer (buf, bufsize, arg, argsize, o);
+  errno = e;
+  return buf;
+}
+
+/* Use storage slot N to return a quoted version of argument ARG.
+   ARG is of size ARGSIZE, but if that is SIZE_MAX, ARG is a
+   null-terminated string.
+   OPTIONS specifies the quoting options.
+   The returned value points to static storage that can be
+   reused by the next call to this function with the same value of N.
+   N must be nonnegative.  N is deliberately declared with type "int"
+   to allow for future extensions (using negative values).  */
+static char *
+quotearg_n_options (int n, char const *arg, size_t argsize,
+                   struct quoting_options const *options)
+{
+  int e = errno;
+
+  /* Preallocate a slot 0 buffer, so that the caller can always quote
+     one small component of a "memory exhausted" message in slot 0.  */
+  static char slot0[256];
+  static unsigned int nslots = 1;
+  unsigned int n0 = n;
+  struct slotvec
+    {
+      size_t size;
+      char *val;
+    };
+  static struct slotvec slotvec0 = {sizeof slot0, slot0};
+  static struct slotvec *slotvec = &slotvec0;
+
+  if (n < 0)
+    abort ();
+
+  if (nslots <= n0)
+    {
+      unsigned int n1 = n0 + 1;
+
+      if (xalloc_oversized (n1, sizeof *slotvec))
+       xalloc_die ();
+
+      if (slotvec == &slotvec0)
+       {
+         slotvec = xmalloc (sizeof *slotvec);
+         *slotvec = slotvec0;
+       }
+      slotvec = xrealloc (slotvec, n1 * sizeof *slotvec);
+      memset (slotvec + nslots, 0, (n1 - nslots) * sizeof *slotvec);
+      nslots = n1;
+    }
+
+  {
+    size_t size = slotvec[n].size;
+    char *val = slotvec[n].val;
+    size_t qsize = quotearg_buffer (val, size, arg, argsize, options);
+
+    if (size <= qsize)
+      {
+       slotvec[n].size = size = qsize + 1;
+       if (val != slot0)
+         free (val);
+       slotvec[n].val = val = xmalloc (size);
+       quotearg_buffer (val, size, arg, argsize, options);
+      }
+
+    errno = e;
+    return val;
+  }
+}
+
+char *
+quotearg_n (int n, char const *arg)
+{
+  return quotearg_n_options (n, arg, SIZE_MAX, &default_quoting_options);
+}
+
+char *
+quotearg (char const *arg)
+{
+  return quotearg_n (0, arg);
+}
+
+/* Return quoting options for STYLE, with no extra quoting.  */
+static struct quoting_options
+quoting_options_from_style (enum quoting_style style)
+{
+  struct quoting_options o;
+  o.style = style;
+  memset (o.quote_these_too, 0, sizeof o.quote_these_too);
+  return o;
+}
+
+char *
+quotearg_n_style (int n, enum quoting_style s, char const *arg)
+{
+  struct quoting_options const o = quoting_options_from_style (s);
+  return quotearg_n_options (n, arg, SIZE_MAX, &o);
+}
+
+char *
+quotearg_n_style_mem (int n, enum quoting_style s,
+                     char const *arg, size_t argsize)
+{
+  struct quoting_options const o = quoting_options_from_style (s);
+  return quotearg_n_options (n, arg, argsize, &o);
+}
+
+char *
+quotearg_style (enum quoting_style s, char const *arg)
+{
+  return quotearg_n_style (0, s, arg);
+}
+
+char *
+quotearg_char (char const *arg, char ch)
+{
+  struct quoting_options options;
+  options = default_quoting_options;
+  set_char_quoting (&options, ch, 1);
+  return quotearg_n_options (0, arg, SIZE_MAX, &options);
+}
+
+char *
+quotearg_colon (char const *arg)
+{
+  return quotearg_char (arg, ':');
+}
Index: lib/quotearg.h
===================================================================
RCS file: lib/quotearg.h
diff -N lib/quotearg.h
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ lib/quotearg.h      2 Mar 2005 22:46:40 -0000
@@ -0,0 +1,137 @@
+/* quotearg.h - quote arguments for output
+
+   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004 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.  */
+
+/* Written by Paul Eggert <address@hidden> */
+
+#ifndef QUOTEARG_H_
+# define QUOTEARG_H_ 1
+
+# include <stddef.h>
+
+/* Basic quoting styles.  */
+enum quoting_style
+  {
+    /* Output names as-is (ls --quoting-style=literal).  */
+    literal_quoting_style,
+
+    /* Quote names for the shell if they contain shell metacharacters
+       or would cause ambiguous output (ls --quoting-style=shell).  */
+    shell_quoting_style,
+
+    /* Quote names for the shell, even if they would normally not
+       require quoting (ls --quoting-style=shell-always).  */
+    shell_always_quoting_style,
+
+    /* Quote names as for a C language string (ls --quoting-style=c).  */
+    c_quoting_style,
+
+    /* Like c_quoting_style except omit the surrounding double-quote
+       characters (ls --quoting-style=escape).  */
+    escape_quoting_style,
+
+    /* Like clocale_quoting_style, but quote `like this' instead of
+       "like this" in the default C locale (ls --quoting-style=locale).  */
+    locale_quoting_style,
+
+    /* Like c_quoting_style except use quotation marks appropriate for
+       the locale (ls --quoting-style=clocale).  */
+    clocale_quoting_style
+  };
+
+/* For now, --quoting-style=literal is the default, but this may change.  */
+# ifndef DEFAULT_QUOTING_STYLE
+#  define DEFAULT_QUOTING_STYLE literal_quoting_style
+# endif
+
+/* Names of quoting styles and their corresponding values.  */
+extern char const *const quoting_style_args[];
+extern enum quoting_style const quoting_style_vals[];
+
+struct quoting_options;
+
+/* The functions listed below set and use a hidden variable
+   that contains the default quoting style options.  */
+
+/* Allocate a new set of quoting options, with contents initially identical
+   to O if O is not null, or to the default if O is null.
+   It is the caller's responsibility to free the result.  */
+struct quoting_options *clone_quoting_options (struct quoting_options *o);
+
+/* Get the value of O's quoting style.  If O is null, use the default.  */
+enum quoting_style get_quoting_style (struct quoting_options *o);
+
+/* In O (or in the default if O is null),
+   set the value of the quoting style to S.  */
+void set_quoting_style (struct quoting_options *o, enum quoting_style s);
+
+/* In O (or in the default if O is null),
+   set the value of the quoting options for character C to I.
+   Return the old value.  Currently, the only values defined for I are
+   0 (the default) and 1 (which means to quote the character even if
+   it would not otherwise be quoted).  */
+int set_char_quoting (struct quoting_options *o, char c, int i);
+
+/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
+   argument ARG (of size ARGSIZE), using O to control quoting.
+   If O is null, use the default.
+   Terminate the output with a null character, and return the written
+   size of the output, not counting the terminating null.
+   If BUFFERSIZE is too small to store the output string, return the
+   value that would have been returned had BUFFERSIZE been large enough.
+   If ARGSIZE is -1, use the string length of the argument for ARGSIZE.  */
+size_t quotearg_buffer (char *buffer, size_t buffersize,
+                       char const *arg, size_t argsize,
+                       struct quoting_options const *o);
+
+/* Like quotearg_buffer, except return the result in a newly allocated
+   buffer.  It is the caller's responsibility to free the result.  */
+char *quotearg_alloc (char const *arg, size_t argsize,
+                     struct quoting_options const *o);
+
+/* Use storage slot N to return a quoted version of the string ARG.
+   Use the default quoting options.
+   The returned value points to static storage that can be
+   reused by the next call to this function with the same value of N.
+   N must be nonnegative.  */
+char *quotearg_n (int n, char const *arg);
+
+/* Equivalent to quotearg_n (0, ARG).  */
+char *quotearg (char const *arg);
+
+/* Use style S and storage slot N to return a quoted version of the string ARG.
+   This is like quotearg_n (N, ARG), except that it uses S with no other
+   options to specify the quoting method.  */
+char *quotearg_n_style (int n, enum quoting_style s, char const *arg);
+
+/* Use style S and storage slot N to return a quoted version of the
+   argument ARG of size ARGSIZE.  This is like quotearg_n_style
+   (N, S, ARG), except it can quote null bytes.  */
+char *quotearg_n_style_mem (int n, enum quoting_style s,
+                           char const *arg, size_t argsize);
+
+/* Equivalent to quotearg_n_style (0, S, ARG).  */
+char *quotearg_style (enum quoting_style s, char const *arg);
+
+/* Like quotearg (ARG), except also quote any instances of CH.  */
+char *quotearg_char (char const *arg, char ch);
+
+/* Equivalent to quotearg_char (ARG, ':').  */
+char *quotearg_colon (char const *arg);
+
+#endif /* !QUOTEARG_H_ */
Index: m4/ChangeLog
===================================================================
RCS file: /cvs/ccvs/m4/ChangeLog,v
retrieving revision 1.108
diff -u -p -r1.108 ChangeLog
--- m4/ChangeLog        1 Mar 2005 18:15:07 -0000       1.108
+++ m4/ChangeLog        2 Mar 2005 22:46:40 -0000
@@ -1,3 +1,8 @@
+2005-03-02  Jim Meyering  <address@hidden>
+
+       * closeout.m4, fpending.m4, mbrtowc.m4, quotearg.m4: New from gnulib.
+       * gnulib.m4: Regenerated.
+
 2005-03-01  Derek Price  <address@hidden>
 
        Update installed GNULIB modules.
Index: m4/closeout.m4
===================================================================
RCS file: m4/closeout.m4
diff -N m4/closeout.m4
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ m4/closeout.m4      2 Mar 2005 22:46:40 -0000
@@ -0,0 +1,11 @@
+# closeout.m4 serial 3
+dnl Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_CLOSEOUT],
+[
+  dnl Prerequisites of lib/closeout.c.
+  :
+])
Index: m4/fpending.m4
===================================================================
RCS file: m4/fpending.m4
diff -N m4/fpending.m4
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ m4/fpending.m4      2 Mar 2005 22:46:40 -0000
@@ -0,0 +1,77 @@
+#serial 5
+
+# Copyright (C) 2000, 2001, 2004 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+dnl From Jim Meyering
+dnl Using code from emacs, based on suggestions from Paul Eggert
+dnl and Ulrich Drepper.
+
+dnl Find out how to determine the number of pending output bytes on a stream.
+dnl glibc (2.1.93 and newer) and Solaris provide __fpending.  On other systems,
+dnl we have to grub around in the FILE struct.
+
+AC_DEFUN([gl_FUNC_FPENDING],
+[
+  AC_CHECK_HEADERS(stdio_ext.h)
+  AC_REPLACE_FUNCS([__fpending])
+  fp_headers='
+#     if HAVE_STDIO_EXT_H
+#      include <stdio_ext.h>
+#     endif
+'
+  AC_CHECK_DECLS([__fpending], , , $fp_headers)
+  if test $ac_cv_func___fpending = no; then
+    AC_CACHE_CHECK(
+             [how to determine the number of pending output bytes on a stream],
+                  ac_cv_sys_pending_output_n_bytes,
+      [
+       for ac_expr in                                          \
+                                                               \
+           '# glibc2'                                          \
+           'fp->_IO_write_ptr - fp->_IO_write_base'            \
+                                                               \
+           '# traditional Unix'                                \
+           'fp->_ptr - fp->_base'                              \
+                                                               \
+           '# BSD'                                             \
+           'fp->_p - fp->_bf._base'                            \
+                                                               \
+           '# SCO, Unixware'                                   \
+           'fp->__ptr - fp->__base'                            \
+                                                               \
+           '# old glibc?'                                      \
+           'fp->__bufp - fp->__buffer'                         \
+                                                               \
+           '# old glibc iostream?'                             \
+           'fp->_pptr - fp->_pbase'                            \
+                                                               \
+           '# VMS'                                             \
+           '(*fp)->_ptr - (*fp)->_base'                        \
+                                                               \
+           '# e.g., DGUX R4.11; the info is not available'     \
+           1                                                   \
+           ; do
+
+         # Skip each embedded comment.
+         case "$ac_expr" in '#'*) continue;; esac
+
+         AC_TRY_COMPILE(
+           [#include <stdio.h>
+           ],
+           [FILE *fp = stdin; (void) ($ac_expr);],
+           fp_done=yes
+         )
+         test "$fp_done" = yes && break
+       done
+
+       ac_cv_sys_pending_output_n_bytes=$ac_expr
+      ]
+    )
+    AC_DEFINE_UNQUOTED(PENDING_OUTPUT_N_BYTES,
+      $ac_cv_sys_pending_output_n_bytes,
+      [the number of pending output bytes on stream `fp'])
+  fi
+])
Index: m4/gnulib.m4
===================================================================
RCS file: /cvs/ccvs/m4/gnulib.m4,v
retrieving revision 1.40
diff -u -p -r1.40 gnulib.m4
--- m4/gnulib.m4        1 Mar 2005 18:15:07 -0000       1.40
+++ m4/gnulib.m4        2 Mar 2005 22:46:40 -0000
@@ -7,8 +7,8 @@
 #
 # Generated by gnulib-tool.
 #
-# Invoked as: gnulib-tool --import gettext vasnprintf regex atexit save-cwd 
dirname exit exitfail extensions fnmatch-posix fnmatch mkstemp getopt stdbool 
getline getnline getndelim2 gethostname strcase getpass-gnu gettimeofday 
timespec gettime unlocked-io tzset restrict time_r mktime minmax memmove 
nanosleep stat lstat strerror vasprintf malloc realloc strftime xsize 
getpagesize md5 stdint yesno allocsa setenv getdate readlink xreadlink 
xgethostname mkdir rename dup2 strstr ftruncate strtoul pathmax xalloc-die
-# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib 
--m4-base=m4   alloca alloca-opt allocsa atexit chdir-long dirname dup2 error 
exit exitfail extensions fnmatch fnmatch-posix ftruncate getcwd getdate 
gethostname getline getndelim2 getnline getopt getpagesize getpass-gnu gettext 
gettime gettimeofday lstat malloc md5 memmove mempcpy memrchr minmax mkdir 
mkstemp mktime nanosleep openat pathmax readlink realloc regex rename restrict 
rpmatch save-cwd setenv stat stdbool stdint strcase strerror strftime strstr 
strtol strtoul time_r timespec tzset unlocked-io vasnprintf vasprintf xalloc 
xalloc-die xgetcwd xgethostname xreadlink xsize yesno
+# Invoked as: gnulib-tool --import gettext vasnprintf regex atexit save-cwd 
dirname exit exitfail extensions fnmatch-posix fnmatch mkstemp getopt stdbool 
getline getnline getndelim2 gethostname strcase getpass-gnu gettimeofday 
timespec gettime unlocked-io tzset restrict time_r mktime minmax memmove 
nanosleep stat lstat strerror vasprintf malloc realloc strftime xsize 
getpagesize md5 stdint yesno allocsa setenv getdate readlink xreadlink 
xgethostname mkdir rename dup2 strstr ftruncate strtoul pathmax xalloc-die 
closeout
+# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib 
--m4-base=m4   alloca alloca-opt allocsa atexit chdir-long closeout dirname 
dup2 error exit exitfail extensions fnmatch fnmatch-posix fpending ftruncate 
getcwd getdate gethostname getline getndelim2 getnline getopt getpagesize 
getpass-gnu gettext gettime gettimeofday lstat malloc md5 memmove mempcpy 
memrchr minmax mkdir mkstemp mktime nanosleep openat pathmax quotearg readlink 
realloc regex rename restrict rpmatch save-cwd setenv stat stdbool stdint 
strcase strerror strftime strstr strtol strtoul time_r timespec tzset 
unlocked-io vasnprintf vasprintf xalloc xalloc-die xgetcwd xgethostname 
xreadlink xsize yesno
 
 AC_DEFUN([gl_EARLY],
 [
@@ -22,6 +22,7 @@ AC_DEFUN([gl_INIT],
   gl_ALLOCSA
   gl_FUNC_ATEXIT
   gl_FUNC_CHDIR_LONG
+  gl_CLOSEOUT
   gl_DIRNAME
   gl_FUNC_DUP2
   gl_ERROR
@@ -29,6 +30,7 @@ AC_DEFUN([gl_INIT],
   dnl gl_USE_SYSTEM_EXTENSIONS must be added quite early to configure.ac.
   # No macro. You should also use one of fnmatch-posix or fnmatch-gnu.
   gl_FUNC_FNMATCH_POSIX
+  gl_FUNC_FPENDING
   gl_FUNC_FTRUNCATE
   gl_FUNC_GETCWD
   gl_GETDATE
@@ -54,6 +56,7 @@ AC_DEFUN([gl_INIT],
   gl_FUNC_NANOSLEEP
   gl_FUNC_OPENAT
   gl_PATHMAX
+  gl_QUOTEARG
   gl_FUNC_READLINK
   AC_FUNC_REALLOC
   gl_REGEX
Index: m4/mbrtowc.m4
===================================================================
RCS file: m4/mbrtowc.m4
diff -N m4/mbrtowc.m4
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ m4/mbrtowc.m4       2 Mar 2005 22:46:40 -0000
@@ -0,0 +1,25 @@
+# mbrtowc.m4 serial 7
+dnl Copyright (C) 2001-2002, 2004 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert
+
+dnl This file can be removed, and gl_FUNC_MBRTOWC replaced with
+dnl AC_FUNC_MBRTOWC, when autoconf 2.57 can be assumed everywhere.
+
+AC_DEFUN([gl_FUNC_MBRTOWC],
+[
+  AC_CACHE_CHECK([whether mbrtowc and mbstate_t are properly declared],
+    gl_cv_func_mbrtowc,
+    [AC_TRY_LINK(
+       [#include <wchar.h>],
+       [mbstate_t state; return ! (sizeof state && mbrtowc);],
+       gl_cv_func_mbrtowc=yes,
+       gl_cv_func_mbrtowc=no)])
+  if test $gl_cv_func_mbrtowc = yes; then
+    AC_DEFINE(HAVE_MBRTOWC, 1,
+      [Define to 1 if mbrtowc and mbstate_t are properly declared.])
+  fi
+])
Index: m4/quotearg.m4
===================================================================
RCS file: m4/quotearg.m4
diff -N m4/quotearg.m4
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ m4/quotearg.m4      2 Mar 2005 22:46:40 -0000
@@ -0,0 +1,14 @@
+# quotearg.m4 serial 3
+dnl Copyright (C) 2002, 2004 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_QUOTEARG],
+[
+  dnl Prerequisites of lib/quotearg.c.
+  AC_CHECK_HEADERS_ONCE(wchar.h wctype.h)
+  AC_CHECK_FUNCS_ONCE(iswprint mbsinit)
+  AC_TYPE_MBSTATE_T
+  gl_FUNC_MBRTOWC
+])




reply via email to

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