summaryrefslogtreecommitdiffstats
path: root/gettext-runtime
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2007-09-01 08:55:40 +0000
committerBruno Haible <bruno@clisp.org>2009-06-23 12:15:01 +0200
commit0ecc214098250a5732d37837b4ee8f2bdaf0b213 (patch)
tree9dcfd56181b66639aa2124f64ec0e195b6cb0ae6 /gettext-runtime
parent4080b7f209ec70019581bd1f709e51d90b7bd61d (diff)
downloadexternal_gettext-0ecc214098250a5732d37837b4ee8f2bdaf0b213.zip
external_gettext-0ecc214098250a5732d37837b4ee8f2bdaf0b213.tar.gz
external_gettext-0ecc214098250a5732d37837b4ee8f2bdaf0b213.tar.bz2
Update from gnulib.
Diffstat (limited to 'gettext-runtime')
-rw-r--r--gettext-runtime/intl/printf-parse.c86
1 files changed, 59 insertions, 27 deletions
diff --git a/gettext-runtime/intl/printf-parse.c b/gettext-runtime/intl/printf-parse.c
index 016b327..2e67980 100644
--- a/gettext-runtime/intl/printf-parse.c
+++ b/gettext-runtime/intl/printf-parse.c
@@ -1,30 +1,50 @@
/* Formatted output to strings.
Copyright (C) 1999-2000, 2002-2003, 2006-2007 Free Software Foundation, Inc.
- This program 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, or (at your option)
+ 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 this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- USA. */
-
-#include <config.h>
+ 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* This file can be parametrized with the following macros:
+ CHAR_T The element type of the format string.
+ CHAR_T_ONLY_ASCII Set to 1 to enable verification that all characters
+ in the format string are ASCII.
+ DIRECTIVE Structure denoting a format directive.
+ Depends on CHAR_T.
+ DIRECTIVES Structure denoting the set of format directives of a
+ format string. Depends on CHAR_T.
+ PRINTF_PARSE Function that parses a format string.
+ Depends on CHAR_T.
+ STATIC Set to 'static' to declare the function static.
+ ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions. */
+
+#ifndef PRINTF_PARSE
+# include <config.h>
+#endif
/* Specification. */
-#if WIDE_CHAR_VERSION
-# include "wprintf-parse.h"
-#else
+#ifndef PRINTF_PARSE
# include "printf-parse.h"
#endif
+/* Default parameters. */
+#ifndef PRINTF_PARSE
+# define PRINTF_PARSE printf_parse
+# define CHAR_T char
+# define DIRECTIVE char_directive
+# define DIRECTIVES char_directives
+#endif
+
/* Get size_t, NULL. */
#include <stddef.h>
@@ -46,16 +66,9 @@
/* Checked size_t computations. */
#include "xsize.h"
-#if WIDE_CHAR_VERSION
-# define PRINTF_PARSE wprintf_parse
-# define CHAR_T wchar_t
-# define DIRECTIVE wchar_t_directive
-# define DIRECTIVES wchar_t_directives
-#else
-# define PRINTF_PARSE printf_parse
-# define CHAR_T char
-# define DIRECTIVE char_directive
-# define DIRECTIVES char_directives
+#if CHAR_T_ONLY_ASCII
+/* c_isascii(). */
+# include "c-ctype.h"
#endif
#ifdef STATIC
@@ -120,7 +133,7 @@ PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
if (c == '%')
{
size_t arg_index = ARG_NONE;
- DIRECTIVE *dp = &d->dir[d->count];/* pointer to next directive */
+ DIRECTIVE *dp = &d->dir[d->count]; /* pointer to next directive */
/* Initialize the next directive. */
dp->dir_start = cp - 1;
@@ -480,6 +493,17 @@ PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
else
type = TYPE_COUNT_INT_POINTER;
break;
+#if ENABLE_UNISTDIO
+ /* The unistdio extensions. */
+ case 'U':
+ if (flags >= 16)
+ type = TYPE_U32_STRING;
+ else if (flags >= 8)
+ type = TYPE_U16_STRING;
+ else
+ type = TYPE_U8_STRING;
+ break;
+#endif
case '%':
type = TYPE_NONE;
break;
@@ -523,6 +547,13 @@ PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
d->dir = memory;
}
}
+#if CHAR_T_ONLY_ASCII
+ else if (!c_isascii (c))
+ {
+ /* Non-ASCII character. Not supported. */
+ goto error;
+ }
+#endif
}
d->dir[d->count].dir_start = cp;
@@ -538,7 +569,8 @@ error:
return -1;
}
+#undef PRINTF_PARSE
#undef DIRECTIVES
#undef DIRECTIVE
+#undef CHAR_T_ONLY_ASCII
#undef CHAR_T
-#undef PRINTF_PARSE