mirror of
https://git.savannah.gnu.org/git/gnulib.git
synced 2025-08-08 17:22:05 +03:00
New 'c-*printf' modules for formatted output in C locale.
New module 'c-vasnprintf'. * modules/c-vasnprintf: New file. * lib/c-vasnprintf.c: New file. * lib/c-vasnprintf.h: New file. New module 'c-snprintf'. * modules/c-snprintf: New file. * modules/c-snprintf-tests: New file. * lib/c-snprintf.c: New file. * lib/c-snprintf.h: New file. * tests/test-c-snprintf.c: New file. * tests/test-c-snprintf.sh: New file. New module 'c-vsnprintf'. * modules/c-vsnprintf: New file. * modules/c-vsnprintf-tests: New file. * lib/c-vsnprintf.c: New file. * lib/c-vsnprintf.h: New file. * tests/test-c-vsnprintf.c: New file. * tests/test-c-vsnprintf.sh: New file. New module 'c-vasprintf'. * modules/c-vasprintf: New file. * modules/c-vasprintf-tests: New file. * lib/c-asprintf.c: New file. * lib/c-vasprintf.c: New file. * lib/c-vasprintf.h: New file. * tests/test-c-vasprintf.c +: New file. * tests/test-c-vasprintf.sh: New file. New module 'c-xvasprintf'. * modules/c-xvasprintf: New file. * modules/c-xvasprintf-tests: New file. * lib/c-xasprintf.c: New file. * lib/c-xvasprintf.c: New file. * lib/c-xvasprintf.h: New file. * tests/test-c-xvasprintf.c: New file. * tests/test-c-xvasprintf.sh: New file.
This commit is contained in:
43
ChangeLog
43
ChangeLog
@@ -1,3 +1,46 @@
|
|||||||
|
2012-12-15 Ben Pfaff <blp@cs.stanford.edu>
|
||||||
|
|
||||||
|
New 'c-*printf' modules for formatted output in C locale.
|
||||||
|
|
||||||
|
New module 'c-vasnprintf'.
|
||||||
|
* modules/c-vasnprintf: New file.
|
||||||
|
* lib/c-vasnprintf.c: New file.
|
||||||
|
* lib/c-vasnprintf.h: New file.
|
||||||
|
|
||||||
|
New module 'c-snprintf'.
|
||||||
|
* modules/c-snprintf: New file.
|
||||||
|
* modules/c-snprintf-tests: New file.
|
||||||
|
* lib/c-snprintf.c: New file.
|
||||||
|
* lib/c-snprintf.h: New file.
|
||||||
|
* tests/test-c-snprintf.c: New file.
|
||||||
|
* tests/test-c-snprintf.sh: New file.
|
||||||
|
|
||||||
|
New module 'c-vsnprintf'.
|
||||||
|
* modules/c-vsnprintf: New file.
|
||||||
|
* modules/c-vsnprintf-tests: New file.
|
||||||
|
* lib/c-vsnprintf.c: New file.
|
||||||
|
* lib/c-vsnprintf.h: New file.
|
||||||
|
* tests/test-c-vsnprintf.c: New file.
|
||||||
|
* tests/test-c-vsnprintf.sh: New file.
|
||||||
|
|
||||||
|
New module 'c-vasprintf'.
|
||||||
|
* modules/c-vasprintf: New file.
|
||||||
|
* modules/c-vasprintf-tests: New file.
|
||||||
|
* lib/c-asprintf.c: New file.
|
||||||
|
* lib/c-vasprintf.c: New file.
|
||||||
|
* lib/c-vasprintf.h: New file.
|
||||||
|
* tests/test-c-vasprintf.c +: New file.
|
||||||
|
* tests/test-c-vasprintf.sh: New file.
|
||||||
|
|
||||||
|
New module 'c-xvasprintf'.
|
||||||
|
* modules/c-xvasprintf: New file.
|
||||||
|
* modules/c-xvasprintf-tests: New file.
|
||||||
|
* lib/c-xasprintf.c: New file.
|
||||||
|
* lib/c-xvasprintf.c: New file.
|
||||||
|
* lib/c-xvasprintf.h: New file.
|
||||||
|
* tests/test-c-xvasprintf.c: New file.
|
||||||
|
* tests/test-c-xvasprintf.sh: New file.
|
||||||
|
|
||||||
2012-12-18 Paul Eggert <eggert@cs.ucla.edu>
|
2012-12-18 Paul Eggert <eggert@cs.ucla.edu>
|
||||||
|
|
||||||
argp: better 'inline'
|
argp: better 'inline'
|
||||||
|
35
lib/c-asprintf.c
Normal file
35
lib/c-asprintf.c
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
/* Formatted output to strings in C locale.
|
||||||
|
Copyright (C) 1999, 2002, 2006-2007, 2009-2012 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include "c-vasprintf.h"
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
c_asprintf (char **resultp, const char *format, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
int result;
|
||||||
|
|
||||||
|
va_start (args, format);
|
||||||
|
result = c_vasprintf (resultp, format, args);
|
||||||
|
va_end (args);
|
||||||
|
return result;
|
||||||
|
}
|
75
lib/c-snprintf.c
Normal file
75
lib/c-snprintf.c
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
/* Formatted output to strings in C locale.
|
||||||
|
Copyright (C) 2004, 2006-2012 Free Software Foundation, Inc.
|
||||||
|
Written by Simon Josefsson and Paul Eggert.
|
||||||
|
Modified for C locale by Ben Pfaff.
|
||||||
|
|
||||||
|
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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "c-vasnprintf.h"
|
||||||
|
|
||||||
|
/* Print formatted output to string STR. Similar to sprintf, but
|
||||||
|
additional length SIZE limit how much is written into STR. Returns
|
||||||
|
string length of formatted string (which may be larger than SIZE).
|
||||||
|
STR may be NULL, in which case nothing will be written. On error,
|
||||||
|
return a negative value.
|
||||||
|
|
||||||
|
Formatting takes place in the C locale, that is, the decimal point
|
||||||
|
used in floating-point formatting directives is always '.'. */
|
||||||
|
int
|
||||||
|
c_snprintf (char *str, size_t size, const char *format, ...)
|
||||||
|
{
|
||||||
|
char *output;
|
||||||
|
size_t len;
|
||||||
|
size_t lenbuf = size;
|
||||||
|
va_list args;
|
||||||
|
|
||||||
|
va_start (args, format);
|
||||||
|
output = c_vasnprintf (str, &lenbuf, format, args);
|
||||||
|
len = lenbuf;
|
||||||
|
va_end (args);
|
||||||
|
|
||||||
|
if (!output)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (output != str)
|
||||||
|
{
|
||||||
|
if (size)
|
||||||
|
{
|
||||||
|
size_t pruned_len = (len < size ? len : size - 1);
|
||||||
|
memcpy (str, output, pruned_len);
|
||||||
|
str[pruned_len] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
free (output);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (INT_MAX < len)
|
||||||
|
{
|
||||||
|
errno = EOVERFLOW;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
46
lib/c-snprintf.h
Normal file
46
lib/c-snprintf.h
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
/* snprintf in C locale.
|
||||||
|
Copyright (C) 2012 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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _C_SNPRINTF_H
|
||||||
|
#define _C_SNPRINTF_H
|
||||||
|
|
||||||
|
/* Get size_t. */
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
/* The __attribute__ feature is available in gcc versions 2.5 and later.
|
||||||
|
The __-protected variants of the attributes 'format' and 'printf' are
|
||||||
|
accepted by gcc versions 2.6.4 (effectively 2.7) and later.
|
||||||
|
We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
|
||||||
|
gnulib and libintl do '#define printf __printf__' when they override
|
||||||
|
the 'printf' function. */
|
||||||
|
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
|
||||||
|
# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
|
||||||
|
#else
|
||||||
|
# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int c_snprintf (char *str, size_t size, const char *format, ...)
|
||||||
|
_GL_ATTRIBUTE_FORMAT ((__printf__, 3, 4));
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _C_SNPRINTF_H */
|
43
lib/c-vasnprintf.c
Normal file
43
lib/c-vasnprintf.c
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
/* Formatted output to strings in C locale.
|
||||||
|
Copyright (C) 2009-2012 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 3 of the License, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "printf-parse.h"
|
||||||
|
|
||||||
|
#define VASNPRINTF c_vasnprintf
|
||||||
|
#define FCHAR_T char
|
||||||
|
#define DCHAR_T char
|
||||||
|
#define DIRECTIVE char_directive
|
||||||
|
#define DIRECTIVES char_directives
|
||||||
|
#define PRINTF_PARSE printf_parse
|
||||||
|
#define DCHAR_CPY memcpy
|
||||||
|
#define DCHAR_SET memset
|
||||||
|
#define DCHAR_IS_TCHAR 1
|
||||||
|
#define TCHAR_T char
|
||||||
|
|
||||||
|
#define NEED_PRINTF_DOUBLE 1
|
||||||
|
#define NEED_PRINTF_LONG_DOUBLE 1
|
||||||
|
#define decimal_point_char_defined 1
|
||||||
|
static char
|
||||||
|
decimal_point_char (void)
|
||||||
|
{
|
||||||
|
return '.';
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "vasnprintf.c"
|
76
lib/c-vasnprintf.h
Normal file
76
lib/c-vasnprintf.h
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
/* vsprintf with automatic memory allocation in C locale.
|
||||||
|
Copyright (C) 2002-2004, 2007-2012 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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _C_VASNPRINTF_H
|
||||||
|
#define _C_VASNPRINTF_H
|
||||||
|
|
||||||
|
/* Get va_list. */
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
/* Get size_t. */
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
/* The __attribute__ feature is available in gcc versions 2.5 and later.
|
||||||
|
The __-protected variants of the attributes 'format' and 'printf' are
|
||||||
|
accepted by gcc versions 2.6.4 (effectively 2.7) and later.
|
||||||
|
We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
|
||||||
|
gnulib and libintl do '#define printf __printf__' when they override
|
||||||
|
the 'printf' function. */
|
||||||
|
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
|
||||||
|
# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
|
||||||
|
#else
|
||||||
|
# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Write formatted output to a string dynamically allocated with malloc().
|
||||||
|
You can pass a preallocated buffer for the result in RESULTBUF and its
|
||||||
|
size in *LENGTHP; otherwise you pass RESULTBUF = NULL.
|
||||||
|
If successful, return the address of the string (this may be = RESULTBUF
|
||||||
|
if no dynamic memory allocation was necessary) and set *LENGTHP to the
|
||||||
|
number of resulting bytes, excluding the trailing NUL. Upon error, set
|
||||||
|
errno and return NULL.
|
||||||
|
|
||||||
|
When dynamic memory allocation occurs, the preallocated buffer is left
|
||||||
|
alone (with possibly modified contents). This makes it possible to use
|
||||||
|
a statically allocated or stack-allocated buffer, like this:
|
||||||
|
|
||||||
|
char buf[100];
|
||||||
|
size_t len = sizeof (buf);
|
||||||
|
char *output = vasnprintf (buf, &len, format, args);
|
||||||
|
if (output == NULL)
|
||||||
|
... error handling ...;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
... use the output string ...;
|
||||||
|
if (output != buf)
|
||||||
|
free (output);
|
||||||
|
}
|
||||||
|
|
||||||
|
Formatting takes place in the C locale, that is, the decimal point used in
|
||||||
|
floating-point formatting directives is always '.'.
|
||||||
|
*/
|
||||||
|
extern char *c_vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args)
|
||||||
|
_GL_ATTRIBUTE_FORMAT ((__printf__, 3, 0));
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _C_VASNPRINTF_H */
|
46
lib/c-vasprintf.c
Normal file
46
lib/c-vasprintf.c
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
/* Formatted output to strings in C locale.
|
||||||
|
Copyright (C) 1999, 2002, 2006-2012 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include "c-vasprintf.h"
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "c-vasnprintf.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
c_vasprintf (char **resultp, const char *format, va_list args)
|
||||||
|
{
|
||||||
|
size_t length;
|
||||||
|
char *result = c_vasnprintf (NULL, &length, format, args);
|
||||||
|
if (result == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (length > INT_MAX)
|
||||||
|
{
|
||||||
|
free (result);
|
||||||
|
errno = EOVERFLOW;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
*resultp = result;
|
||||||
|
/* Return the number of resulting bytes, excluding the trailing NUL. */
|
||||||
|
return length;
|
||||||
|
}
|
51
lib/c-vasprintf.h
Normal file
51
lib/c-vasprintf.h
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
/* vasprintf and asprintf, in C locale.
|
||||||
|
Copyright (C) 2002-2004, 2006-2012 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 3 of the License, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _C_VASPRINTF_H
|
||||||
|
#define _C_VASPRINTF_H
|
||||||
|
|
||||||
|
/* Get va_list. */
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
/* The __attribute__ feature is available in gcc versions 2.5 and later.
|
||||||
|
The __-protected variants of the attributes 'format' and 'printf' are
|
||||||
|
accepted by gcc versions 2.6.4 (effectively 2.7) and later.
|
||||||
|
We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
|
||||||
|
gnulib and libintl do '#define printf __printf__' when they override
|
||||||
|
the 'printf' function. */
|
||||||
|
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
|
||||||
|
# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
|
||||||
|
#else
|
||||||
|
# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* asprintf() and vasprintf(), but formatting takes place in the C locale, that
|
||||||
|
is, the decimal point used in floating-point formatting directives is always
|
||||||
|
'.'. */
|
||||||
|
int c_asprintf (char **resultp, const char *format, ...);
|
||||||
|
_GL_ATTRIBUTE_FORMAT ((__printf__, 2, 3));
|
||||||
|
int c_vasprintf (char **resultp, const char *format, va_list args)
|
||||||
|
_GL_ATTRIBUTE_FORMAT ((__printf__, 2, 0));
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _C_VASPRINTF_H */
|
74
lib/c-vsnprintf.c
Normal file
74
lib/c-vsnprintf.c
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
/* Formatted output to strings in C locale.
|
||||||
|
Copyright (C) 2004, 2006-2012 Free Software Foundation, Inc.
|
||||||
|
Written by Simon Josefsson and Yoann Vandoorselaere <yoann@prelude-ids.org>.
|
||||||
|
Modified for C locale by Ben Pfaff.
|
||||||
|
|
||||||
|
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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "c-vasnprintf.h"
|
||||||
|
|
||||||
|
/* Print formatted output to string STR. Similar to vsprintf, but
|
||||||
|
additional length SIZE limit how much is written into STR. Returns
|
||||||
|
string length of formatted string (which may be larger than SIZE).
|
||||||
|
STR may be NULL, in which case nothing will be written. On error,
|
||||||
|
return a negative value.
|
||||||
|
|
||||||
|
Formatting takes place in the C locale, that is, the decimal point
|
||||||
|
used in floating-point formatting directives is always '.'. */
|
||||||
|
int
|
||||||
|
c_vsnprintf (char *str, size_t size, const char *format, va_list args)
|
||||||
|
{
|
||||||
|
char *output;
|
||||||
|
size_t len;
|
||||||
|
size_t lenbuf = size;
|
||||||
|
|
||||||
|
output = c_vasnprintf (str, &lenbuf, format, args);
|
||||||
|
len = lenbuf;
|
||||||
|
|
||||||
|
if (!output)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (output != str)
|
||||||
|
{
|
||||||
|
if (size)
|
||||||
|
{
|
||||||
|
size_t pruned_len = (len < size ? len : size - 1);
|
||||||
|
memcpy (str, output, pruned_len);
|
||||||
|
str[pruned_len] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
free (output);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len > INT_MAX)
|
||||||
|
{
|
||||||
|
errno = EOVERFLOW;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
49
lib/c-vsnprintf.h
Normal file
49
lib/c-vsnprintf.h
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
/* vsnprintf in C locale.
|
||||||
|
Copyright (C) 2012 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 3, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _C_VSNPRINTF_H
|
||||||
|
#define _C_VSNPRINTF_H
|
||||||
|
|
||||||
|
/* Get size_t. */
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
/* Get va_list. */
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
/* The __attribute__ feature is available in gcc versions 2.5 and later.
|
||||||
|
The __-protected variants of the attributes 'format' and 'printf' are
|
||||||
|
accepted by gcc versions 2.6.4 (effectively 2.7) and later.
|
||||||
|
We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
|
||||||
|
gnulib and libintl do '#define printf __printf__' when they override
|
||||||
|
the 'printf' function. */
|
||||||
|
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
|
||||||
|
# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
|
||||||
|
#else
|
||||||
|
# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int c_vsnprintf (char *str, size_t size, const char *format, va_list args)
|
||||||
|
_GL_ATTRIBUTE_FORMAT ((__printf__, 3, 0));
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _C_VSNPRINTF_H */
|
34
lib/c-xasprintf.c
Normal file
34
lib/c-xasprintf.c
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
/* vasprintf and asprintf with out-of-memory checking in C locale.
|
||||||
|
Copyright (C) 1999, 2002-2004, 2006, 2009-2012 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 3 of the License, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include "c-xvasprintf.h"
|
||||||
|
|
||||||
|
char *
|
||||||
|
c_xasprintf (const char *format, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
char *result;
|
||||||
|
|
||||||
|
va_start (args, format);
|
||||||
|
result = c_xvasprintf (format, args);
|
||||||
|
va_end (args);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
40
lib/c-xvasprintf.c
Normal file
40
lib/c-xvasprintf.c
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
/* vasprintf with out-of-memory checking in C locale.
|
||||||
|
Copyright (C) 1999, 2002-2004, 2006-2012 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 3 of the License, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include "c-xvasprintf.h"
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "xalloc.h"
|
||||||
|
|
||||||
|
char *
|
||||||
|
c_xvasprintf (const char *format, va_list args)
|
||||||
|
{
|
||||||
|
char *result;
|
||||||
|
|
||||||
|
if (c_vasprintf (&result, format, args) < 0)
|
||||||
|
{
|
||||||
|
if (errno == ENOMEM)
|
||||||
|
xalloc_die ();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
58
lib/c-xvasprintf.h
Normal file
58
lib/c-xvasprintf.h
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
/* vasprintf and asprintf, with out-of-memory checking, in C locale.
|
||||||
|
Copyright (C) 2002-2004, 2006-2012 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 3 of the License, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _C_XVASPRINTF_H
|
||||||
|
#define _C_XVASPRINTF_H
|
||||||
|
|
||||||
|
/* Get va_list. */
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
/* The __attribute__ feature is available in gcc versions 2.5 and later.
|
||||||
|
The __-protected variants of the attributes 'format' and 'printf' are
|
||||||
|
accepted by gcc versions 2.6.4 (effectively 2.7) and later.
|
||||||
|
We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
|
||||||
|
gnulib and libintl do '#define printf __printf__' when they override
|
||||||
|
the 'printf' function. */
|
||||||
|
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
|
||||||
|
# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
|
||||||
|
#else
|
||||||
|
# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Write formatted output to a string dynamically allocated with malloc(),
|
||||||
|
and return it. Upon [ENOMEM] memory allocation error, call xalloc_die.
|
||||||
|
On some other error
|
||||||
|
- [EOVERFLOW] resulting string length is > INT_MAX,
|
||||||
|
- [EINVAL] invalid format string,
|
||||||
|
- [EILSEQ] error during conversion between wide and multibyte characters,
|
||||||
|
return NULL.
|
||||||
|
|
||||||
|
Formatting takes place in the C locale, that is, the decimal point
|
||||||
|
used in floating-point formatting directives is always '.'. */
|
||||||
|
extern char *c_xasprintf (const char *format, ...)
|
||||||
|
_GL_ATTRIBUTE_FORMAT ((__printf__, 1, 2));
|
||||||
|
extern char *c_xvasprintf (const char *format, va_list args)
|
||||||
|
_GL_ATTRIBUTE_FORMAT ((__printf__, 1, 0));
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _C_XVASPRINTF_H */
|
23
modules/c-snprintf
Normal file
23
modules/c-snprintf
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
Description:
|
||||||
|
c_snprintf(): print formatted output to a fixed length string in C locale
|
||||||
|
|
||||||
|
Files:
|
||||||
|
lib/c-snprintf.h
|
||||||
|
lib/c-snprintf.c
|
||||||
|
|
||||||
|
Depends-on:
|
||||||
|
c-vasnprintf
|
||||||
|
|
||||||
|
configure.ac:
|
||||||
|
|
||||||
|
Makefile.am:
|
||||||
|
lib_SOURCES += c-snprintf.c
|
||||||
|
|
||||||
|
Include:
|
||||||
|
"c-snprintf.h"
|
||||||
|
|
||||||
|
License:
|
||||||
|
GPL
|
||||||
|
|
||||||
|
Maintainer:
|
||||||
|
Ben Pfaff
|
17
modules/c-snprintf-tests
Normal file
17
modules/c-snprintf-tests
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
Files:
|
||||||
|
tests/test-c-snprintf.c
|
||||||
|
tests/test-c-snprintf.sh
|
||||||
|
m4/locale-fr.m4
|
||||||
|
tests/macros.h
|
||||||
|
|
||||||
|
Depends-on:
|
||||||
|
setlocale
|
||||||
|
snprintf
|
||||||
|
|
||||||
|
configure.ac:
|
||||||
|
gt_LOCALE_FR
|
||||||
|
|
||||||
|
Makefile.am:
|
||||||
|
TESTS += test-c-snprintf.sh
|
||||||
|
check_PROGRAMS += test-c-snprintf
|
||||||
|
TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@'
|
55
modules/c-vasnprintf
Normal file
55
modules/c-vasnprintf
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
Description:
|
||||||
|
Formatted output to strings in C locale.
|
||||||
|
|
||||||
|
Files:
|
||||||
|
lib/c-vasnprintf.h
|
||||||
|
lib/c-vasnprintf.c
|
||||||
|
lib/float+.h
|
||||||
|
lib/printf-args.h
|
||||||
|
lib/printf-args.c
|
||||||
|
lib/printf-parse.h
|
||||||
|
lib/printf-parse.c
|
||||||
|
lib/vasnprintf.h
|
||||||
|
lib/vasnprintf.c
|
||||||
|
m4/wchar_t.m4
|
||||||
|
m4/wint_t.m4
|
||||||
|
m4/longlong.m4
|
||||||
|
m4/intmax_t.m4
|
||||||
|
m4/stdint_h.m4
|
||||||
|
m4/inttypes_h.m4
|
||||||
|
m4/vasnprintf.m4
|
||||||
|
m4/printf.m4
|
||||||
|
m4/math_h.m4
|
||||||
|
m4/exponentd.m4
|
||||||
|
|
||||||
|
Depends-on:
|
||||||
|
isnand-nolibm
|
||||||
|
isnanl-nolibm
|
||||||
|
frexpl-nolibm
|
||||||
|
printf-frexp
|
||||||
|
printf-frexpl
|
||||||
|
signbit
|
||||||
|
fpucw
|
||||||
|
nocrash
|
||||||
|
printf-safe
|
||||||
|
alloca-opt
|
||||||
|
xsize
|
||||||
|
errno
|
||||||
|
memchr
|
||||||
|
multiarch
|
||||||
|
verify
|
||||||
|
|
||||||
|
configure.ac:
|
||||||
|
gl_PREREQ_VASNPRINTF_WITH_EXTRAS
|
||||||
|
|
||||||
|
Makefile.am:
|
||||||
|
lib_SOURCES += c-vasnprintf.c
|
||||||
|
|
||||||
|
Include:
|
||||||
|
"c-vasnprintf.h"
|
||||||
|
|
||||||
|
License:
|
||||||
|
GPL
|
||||||
|
|
||||||
|
Maintainer:
|
||||||
|
Ben Pfaff
|
24
modules/c-vasprintf
Normal file
24
modules/c-vasprintf
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
Description:
|
||||||
|
asprintf() and vasprintf() in C locale
|
||||||
|
|
||||||
|
Files:
|
||||||
|
lib/c-vasprintf.h
|
||||||
|
lib/c-asprintf.c
|
||||||
|
lib/c-vasprintf.c
|
||||||
|
|
||||||
|
Depends-on:
|
||||||
|
c-vasnprintf
|
||||||
|
|
||||||
|
configure.ac:
|
||||||
|
|
||||||
|
Makefile.am:
|
||||||
|
lib_SOURCES += c-asprintf.c c-vasprintf.c
|
||||||
|
|
||||||
|
Include:
|
||||||
|
"c-vasprintf.h"
|
||||||
|
|
||||||
|
License:
|
||||||
|
GPL
|
||||||
|
|
||||||
|
Maintainer:
|
||||||
|
Ben Pfaff
|
17
modules/c-vasprintf-tests
Normal file
17
modules/c-vasprintf-tests
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
Files:
|
||||||
|
tests/test-c-vasprintf.c
|
||||||
|
tests/test-c-vasprintf.sh
|
||||||
|
m4/locale-fr.m4
|
||||||
|
tests/macros.h
|
||||||
|
|
||||||
|
Depends-on:
|
||||||
|
setlocale
|
||||||
|
snprintf
|
||||||
|
|
||||||
|
configure.ac:
|
||||||
|
gt_LOCALE_FR
|
||||||
|
|
||||||
|
Makefile.am:
|
||||||
|
TESTS += test-c-vasprintf.sh
|
||||||
|
check_PROGRAMS += test-c-vasprintf
|
||||||
|
TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@'
|
24
modules/c-vsnprintf
Normal file
24
modules/c-vsnprintf
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
Description:
|
||||||
|
c_vsnprintf(): print formatted output from an stdarg argument listto a
|
||||||
|
fixed length string in C locale
|
||||||
|
|
||||||
|
Files:
|
||||||
|
lib/c-vsnprintf.h
|
||||||
|
lib/c-vsnprintf.c
|
||||||
|
|
||||||
|
Depends-on:
|
||||||
|
c-vasnprintf
|
||||||
|
|
||||||
|
configure.ac:
|
||||||
|
|
||||||
|
Makefile.am:
|
||||||
|
lib_SOURCES += c-vsnprintf.c
|
||||||
|
|
||||||
|
Include:
|
||||||
|
"c-vsnprintf.h"
|
||||||
|
|
||||||
|
License:
|
||||||
|
GPL
|
||||||
|
|
||||||
|
Maintainer:
|
||||||
|
Ben Pfaff
|
17
modules/c-vsnprintf-tests
Normal file
17
modules/c-vsnprintf-tests
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
Files:
|
||||||
|
tests/test-c-vsnprintf.c
|
||||||
|
tests/test-c-vsnprintf.sh
|
||||||
|
m4/locale-fr.m4
|
||||||
|
tests/macros.h
|
||||||
|
|
||||||
|
Depends-on:
|
||||||
|
setlocale
|
||||||
|
snprintf
|
||||||
|
|
||||||
|
configure.ac:
|
||||||
|
gt_LOCALE_FR
|
||||||
|
|
||||||
|
Makefile.am:
|
||||||
|
TESTS += test-c-vsnprintf.sh
|
||||||
|
check_PROGRAMS += test-c-vsnprintf
|
||||||
|
TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@'
|
24
modules/c-xvasprintf
Normal file
24
modules/c-xvasprintf
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
Description:
|
||||||
|
c_asprintf and c_vasprintf with out-of-memory checking. Also see xalloc-die.
|
||||||
|
|
||||||
|
Files:
|
||||||
|
lib/c-xvasprintf.h
|
||||||
|
lib/c-xasprintf.c
|
||||||
|
lib/c-xvasprintf.c
|
||||||
|
|
||||||
|
Depends-on:
|
||||||
|
c-vasprintf
|
||||||
|
|
||||||
|
configure.ac:
|
||||||
|
|
||||||
|
Makefile.am:
|
||||||
|
lib_SOURCES += c-xasprintf.c c-xvasprintf.c
|
||||||
|
|
||||||
|
Include:
|
||||||
|
"c-xvasprintf.h"
|
||||||
|
|
||||||
|
License:
|
||||||
|
GPL
|
||||||
|
|
||||||
|
Maintainer:
|
||||||
|
Ben Pfaff
|
18
modules/c-xvasprintf-tests
Normal file
18
modules/c-xvasprintf-tests
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
Files:
|
||||||
|
tests/test-c-xvasprintf.c
|
||||||
|
tests/test-c-xvasprintf.sh
|
||||||
|
m4/locale-fr.m4
|
||||||
|
tests/macros.h
|
||||||
|
|
||||||
|
Depends-on:
|
||||||
|
setlocale
|
||||||
|
snprintf
|
||||||
|
xalloc
|
||||||
|
|
||||||
|
configure.ac:
|
||||||
|
gt_LOCALE_FR
|
||||||
|
|
||||||
|
Makefile.am:
|
||||||
|
TESTS += test-c-xvasprintf.sh
|
||||||
|
check_PROGRAMS += test-c-xvasprintf
|
||||||
|
TESTS_ENVIRONMENT += LOCALE_FR='@LOCALE_FR@'
|
58
tests/test-c-snprintf.c
Normal file
58
tests/test-c-snprintf.c
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
/* Test of c_snprintf() function.
|
||||||
|
Copyright (C) 2011-2012 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 3 of the License, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "c-snprintf.h"
|
||||||
|
|
||||||
|
#include <locale.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "macros.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
main (int argc, char *argv[])
|
||||||
|
{
|
||||||
|
/* configure should already have checked that the locale is supported. */
|
||||||
|
if (setlocale (LC_ALL, "") == NULL)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
/* Test behaviour of snprintf() as a "control group".
|
||||||
|
(We should be running in a locale where ',' is the decimal point.) */
|
||||||
|
{
|
||||||
|
char s[16];
|
||||||
|
|
||||||
|
snprintf (s, sizeof s, "%#.0f", 1.0);
|
||||||
|
if (!strcmp (s, "1."))
|
||||||
|
{
|
||||||
|
/* Skip the test, since we're not in a useful locale for testing. */
|
||||||
|
return 77;
|
||||||
|
}
|
||||||
|
ASSERT (!strcmp (s, "1,"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Test behaviour of c_snprintf().
|
||||||
|
It should always use '.' as the decimal point. */
|
||||||
|
{
|
||||||
|
char s[16];
|
||||||
|
|
||||||
|
c_snprintf (s, sizeof s, "%#.0f", 1.0);
|
||||||
|
ASSERT (!strcmp (s, "1."));
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
15
tests/test-c-snprintf.sh
Executable file
15
tests/test-c-snprintf.sh
Executable file
@@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Test in an ISO-8859-1 or ISO-8859-15 locale.
|
||||||
|
: ${LOCALE_FR=fr_FR}
|
||||||
|
if test $LOCALE_FR = none; then
|
||||||
|
if test -f /usr/bin/localedef; then
|
||||||
|
echo "Skipping test: no traditional french locale is installed"
|
||||||
|
else
|
||||||
|
echo "Skipping test: no traditional french locale is supported"
|
||||||
|
fi
|
||||||
|
exit 77
|
||||||
|
fi
|
||||||
|
|
||||||
|
LC_ALL=$LOCALE_FR \
|
||||||
|
./test-c-snprintf${EXEEXT} 1
|
80
tests/test-c-vasprintf.c
Normal file
80
tests/test-c-vasprintf.c
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
/* Test of c_asprintf() and c_vasprintf() functions.
|
||||||
|
Copyright (C) 2011-2012 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 3 of the License, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "c-vasprintf.h"
|
||||||
|
|
||||||
|
#include <locale.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "macros.h"
|
||||||
|
|
||||||
|
static int
|
||||||
|
my_c_asprintf (char **result, const char *format, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
va_start (args, format);
|
||||||
|
ret = c_vasprintf (result, format, args);
|
||||||
|
va_end (args);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main (int argc, char *argv[])
|
||||||
|
{
|
||||||
|
/* configure should already have checked that the locale is supported. */
|
||||||
|
if (setlocale (LC_ALL, "") == NULL)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
/* Test behaviour of snprintf() as a "control group".
|
||||||
|
(We should be running in a locale where ',' is the decimal point.) */
|
||||||
|
{
|
||||||
|
char s[16];
|
||||||
|
|
||||||
|
snprintf (s, sizeof s, "%#.0f", 1.0);
|
||||||
|
if (!strcmp (s, "1."))
|
||||||
|
{
|
||||||
|
/* Skip the test, since we're not in a useful locale for testing. */
|
||||||
|
return 77;
|
||||||
|
}
|
||||||
|
ASSERT (!strcmp (s, "1,"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Test behaviour of c_asprintf() and c_vasprintf().
|
||||||
|
They should always use '.' as the decimal point. */
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
char *s;
|
||||||
|
|
||||||
|
retval = c_asprintf (&s, "%#.0f", 1.0);
|
||||||
|
ASSERT (s != NULL);
|
||||||
|
ASSERT (!strcmp (s, "1."));
|
||||||
|
ASSERT (retval == 2);
|
||||||
|
free (s);
|
||||||
|
|
||||||
|
retval = my_c_asprintf (&s, "%#.0f", 1.0);
|
||||||
|
ASSERT (s != NULL);
|
||||||
|
ASSERT (!strcmp (s, "1."));
|
||||||
|
ASSERT (retval == 2);
|
||||||
|
free (s);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
15
tests/test-c-vasprintf.sh
Executable file
15
tests/test-c-vasprintf.sh
Executable file
@@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Test in an ISO-8859-1 or ISO-8859-15 locale.
|
||||||
|
: ${LOCALE_FR=fr_FR}
|
||||||
|
if test $LOCALE_FR = none; then
|
||||||
|
if test -f /usr/bin/localedef; then
|
||||||
|
echo "Skipping test: no traditional french locale is installed"
|
||||||
|
else
|
||||||
|
echo "Skipping test: no traditional french locale is supported"
|
||||||
|
fi
|
||||||
|
exit 77
|
||||||
|
fi
|
||||||
|
|
||||||
|
LC_ALL=$LOCALE_FR \
|
||||||
|
./test-c-vasprintf${EXEEXT} 1
|
73
tests/test-c-vsnprintf.c
Normal file
73
tests/test-c-vsnprintf.c
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
/* Test of c_vsnprintf() function.
|
||||||
|
Copyright (C) 2011-2012 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 3 of the License, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "c-vsnprintf.h"
|
||||||
|
|
||||||
|
#include <locale.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "macros.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
static int
|
||||||
|
my_c_snprintf (char *buf, int size, const char *format, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
va_start (args, format);
|
||||||
|
ret = c_vsnprintf (buf, size, format, args);
|
||||||
|
va_end (args);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main (int argc, char *argv[])
|
||||||
|
{
|
||||||
|
/* configure should already have checked that the locale is supported. */
|
||||||
|
if (setlocale (LC_ALL, "") == NULL)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
/* Test behaviour of snprintf() as a "control group".
|
||||||
|
(We should be running in a locale where ',' is the decimal point.) */
|
||||||
|
{
|
||||||
|
char s[16];
|
||||||
|
|
||||||
|
snprintf (s, sizeof s, "%#.0f", 1.0);
|
||||||
|
if (!strcmp (s, "1."))
|
||||||
|
{
|
||||||
|
/* Skip the test, since we're not in a useful locale for testing. */
|
||||||
|
return 77;
|
||||||
|
}
|
||||||
|
ASSERT (!strcmp (s, "1,"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Test behaviour of c_vsnprintf().
|
||||||
|
It should always use '.' as the decimal point. */
|
||||||
|
{
|
||||||
|
char s[16];
|
||||||
|
|
||||||
|
my_c_snprintf (s, sizeof s, "%#.0f", 1.0);
|
||||||
|
ASSERT (!strcmp (s, "1."));
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
15
tests/test-c-vsnprintf.sh
Executable file
15
tests/test-c-vsnprintf.sh
Executable file
@@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Test in an ISO-8859-1 or ISO-8859-15 locale.
|
||||||
|
: ${LOCALE_FR=fr_FR}
|
||||||
|
if test $LOCALE_FR = none; then
|
||||||
|
if test -f /usr/bin/localedef; then
|
||||||
|
echo "Skipping test: no traditional french locale is installed"
|
||||||
|
else
|
||||||
|
echo "Skipping test: no traditional french locale is supported"
|
||||||
|
fi
|
||||||
|
exit 77
|
||||||
|
fi
|
||||||
|
|
||||||
|
LC_ALL=$LOCALE_FR \
|
||||||
|
./test-c-vsnprintf${EXEEXT} 1
|
78
tests/test-c-xvasprintf.c
Normal file
78
tests/test-c-xvasprintf.c
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
/* Test of c_xasprintf() and c_xvasprintf() functions.
|
||||||
|
Copyright (C) 2011-2012 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 3 of the License, 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "c-xvasprintf.h"
|
||||||
|
|
||||||
|
#include <locale.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "macros.h"
|
||||||
|
|
||||||
|
static char *
|
||||||
|
my_c_xasprintf (const char *format, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
char *s;
|
||||||
|
|
||||||
|
va_start (args, format);
|
||||||
|
s = c_xvasprintf (format, args);
|
||||||
|
va_end (args);
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main (int argc, char *argv[])
|
||||||
|
{
|
||||||
|
/* configure should already have checked that the locale is supported. */
|
||||||
|
if (setlocale (LC_ALL, "") == NULL)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
/* Test behaviour of snprintf() as a "control group".
|
||||||
|
(We should be running in a locale where ',' is the decimal point.) */
|
||||||
|
{
|
||||||
|
char s[16];
|
||||||
|
|
||||||
|
snprintf (s, sizeof s, "%#.0f", 1.0);
|
||||||
|
if (!strcmp (s, "1."))
|
||||||
|
{
|
||||||
|
/* Skip the test, since we're not in a useful locale for testing. */
|
||||||
|
return 77;
|
||||||
|
}
|
||||||
|
ASSERT (!strcmp (s, "1,"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Test behaviour of c_xasprintf() and c_xvasprintf().
|
||||||
|
They should always use '.' as the decimal point. */
|
||||||
|
{
|
||||||
|
char *s;
|
||||||
|
|
||||||
|
s = c_xasprintf ("%#.0f", 1.0);
|
||||||
|
ASSERT (s != NULL);
|
||||||
|
ASSERT (!strcmp (s, "1."));
|
||||||
|
free (s);
|
||||||
|
|
||||||
|
s = my_c_xasprintf ("%#.0f", 1.0);
|
||||||
|
ASSERT (s != NULL);
|
||||||
|
ASSERT (!strcmp (s, "1."));
|
||||||
|
free (s);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
15
tests/test-c-xvasprintf.sh
Executable file
15
tests/test-c-xvasprintf.sh
Executable file
@@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Test in an ISO-8859-1 or ISO-8859-15 locale.
|
||||||
|
: ${LOCALE_FR=fr_FR}
|
||||||
|
if test $LOCALE_FR = none; then
|
||||||
|
if test -f /usr/bin/localedef; then
|
||||||
|
echo "Skipping test: no traditional french locale is installed"
|
||||||
|
else
|
||||||
|
echo "Skipping test: no traditional french locale is supported"
|
||||||
|
fi
|
||||||
|
exit 77
|
||||||
|
fi
|
||||||
|
|
||||||
|
LC_ALL=$LOCALE_FR \
|
||||||
|
./test-c-xvasprintf${EXEEXT} 1
|
Reference in New Issue
Block a user