summaryrefslogtreecommitdiffstats
path: root/lib/quotearg.c
diff options
context:
space:
mode:
authorPedro J. Ruiz Lopez <holzplatten@es.gnu.org>2007-02-12 23:24:21 +0000
committerPedro J. Ruiz Lopez <holzplatten@es.gnu.org>2007-02-12 23:24:21 +0000
commit80f3bd30c7521091c1dea118603b20a76c2a180c (patch)
tree359d11fb051a720d6958341ab5ac1fbff2fe5fd2 /lib/quotearg.c
parent56a64cd30f232800884506d88acd780c431be1a5 (diff)
downloadidutils-80f3bd30c7521091c1dea118603b20a76c2a180c.tar.gz
idutils-80f3bd30c7521091c1dea118603b20a76c2a180c.tar.bz2
idutils-80f3bd30c7521091c1dea118603b20a76c2a180c.zip
* upgraded gnulib
Diffstat (limited to 'lib/quotearg.c')
-rw-r--r--lib/quotearg.c102
1 files changed, 55 insertions, 47 deletions
diff --git a/lib/quotearg.c b/lib/quotearg.c
index 113239f..c9e89bf 100644
--- a/lib/quotearg.c
+++ b/lib/quotearg.c
@@ -1,6 +1,6 @@
/* quotearg.c - quote arguments for output
- Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006 Free
+ Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007 Free
Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
@@ -19,9 +19,7 @@
/* Written by Paul Eggert <eggert@twinsun.com> */
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
+#include <config.h>
#include "quotearg.h"
@@ -33,26 +31,20 @@
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
+#include <wchar.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
+# undef mbstate_t
+# define mbstate_t int
# define mbrtowc(pwc, s, n, ps) ((*(pwc) = *(s)) != 0)
# define iswprint(wc) isprint ((unsigned char) (wc))
# undef HAVE_MBSINIT
@@ -62,14 +54,7 @@
# 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
+#include <wctype.h>
#ifndef SIZE_MAX
# define SIZE_MAX ((size_t) -1)
@@ -122,8 +107,8 @@ 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);
+ struct quoting_options *p = xmemdup (o ? o : &default_quoting_options,
+ sizeof *o);
errno = e;
return p;
}
@@ -554,12 +539,47 @@ quotearg_alloc (char const *arg, size_t argsize,
{
int e = errno;
size_t bufsize = quotearg_buffer (0, 0, arg, argsize, o) + 1;
- char *buf = xmalloc (bufsize);
+ char *buf = xcharalloc (bufsize);
quotearg_buffer (buf, bufsize, arg, argsize, o);
errno = e;
return buf;
}
+/* A storage slot with size and pointer to a value. */
+struct slotvec
+{
+ size_t size;
+ char *val;
+};
+
+/* 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;
+static struct slotvec slotvec0 = {sizeof slot0, slot0};
+static struct slotvec *slotvec = &slotvec0;
+
+void
+quotearg_free (void)
+{
+ struct slotvec *sv = slotvec;
+ unsigned int i;
+ for (i = 1; i < nslots; i++)
+ free (sv[i].val);
+ if (sv[0].val != slot0)
+ {
+ free (sv[0].val);
+ slotvec0.size = sizeof slot0;
+ slotvec0.val = slot0;
+ }
+ if (sv != &slotvec0)
+ {
+ free (sv);
+ slotvec = &slotvec0;
+ }
+ nslots = 1;
+}
+
/* 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.
@@ -574,18 +594,8 @@ quotearg_n_options (int n, char const *arg, size_t argsize,
{
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;
+ struct slotvec *sv = slotvec;
if (n < 0)
abort ();
@@ -598,31 +608,29 @@ quotearg_n_options (int n, char const *arg, size_t argsize,
revert to the original type, so that the test in xalloc_oversized
is once again performed only at compile time. */
size_t n1 = n0 + 1;
+ bool preallocated = (sv == &slotvec0);
- if (xalloc_oversized (n1, sizeof *slotvec))
+ if (xalloc_oversized (n1, sizeof *sv))
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);
+ slotvec = sv = xrealloc (preallocated ? NULL : sv, n1 * sizeof *sv);
+ if (preallocated)
+ *sv = slotvec0;
+ memset (sv + nslots, 0, (n1 - nslots) * sizeof *sv);
nslots = n1;
}
{
- size_t size = slotvec[n].size;
- char *val = slotvec[n].val;
+ size_t size = sv[n].size;
+ char *val = sv[n].val;
size_t qsize = quotearg_buffer (val, size, arg, argsize, options);
if (size <= qsize)
{
- slotvec[n].size = size = qsize + 1;
+ sv[n].size = size = qsize + 1;
if (val != slot0)
free (val);
- slotvec[n].val = val = xmalloc (size);
+ sv[n].val = val = xcharalloc (size);
quotearg_buffer (val, size, arg, argsize, options);
}