1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-08 17:42:12 +03:00
2003-05-27  Jakub Jelinek  <jakub@redhat.com>

	* stdio-common/vfprintf.c (process_arg, process_string_arg): Use
	pa_int/pa_u_int instead of pa_short_int, pa_u_short_int and pa_char.
	* stdio-common/printf-parse.h (union printf_arg): Remove pa_char,
	pa_short_int, pa_u_short_int and pa_float.

2003-05-26  Jakub Jelinek  <jakub@redhat.com>

	* libio/strops.c (_IO_str_init_static): Change into a wrapper around
	_IO_str_init_static_internal.
	(_IO_str_init_static_internal): Moved from _IO_str_init_static,
	change size argument to _IO_size_t, don't limit sprintf to 64M.
	(_IO_str_init_readonly): Call _IO_str_init_static_internal.
	* libio/wstrops.c (_IO_wstr_init_static): Change size argument to
	_IO_size_t, don't limit swprintf to 256M.
	(_IO_wstr_init_readonly): Remove.
	* libio/libioP.h (_IO_str_init_static_internal, _IO_wstr_init_static):
	Adjust prototypes.
	(_IO_wstr_init_readonly): Remove prototype.
	* libio/iovsprintf.c (_IO_vsprintf): Use
	_IO_str_init_static_internal instead of INTUSE(_IO_str_init_static).
	* libio/iovsscanf.c (_IO_vsscanf): Likewise.
	* libio/memstream.c (open_memstream): Likewise.
	* libio/obprintf.c (_IO_obstack_vfprintf): Likewise.
	* libio/vasprintf.c (_IO_vasprintf): Likewise.
	* libio/vsnprintf.c (_IO_vsnprintf): Likewise.
	* stdio-common/tst-sprintf.c (main): Add new test.
This commit is contained in:
Ulrich Drepper
2003-05-27 08:03:32 +00:00
parent 7661d9f783
commit 40a54e4d8d
13 changed files with 108 additions and 85 deletions

View File

@@ -51,17 +51,13 @@ struct printf_spec
/* The various kinds off arguments that can be passed to printf. */
union printf_arg
{
unsigned char pa_char;
wchar_t pa_wchar;
short int pa_short_int;
int pa_int;
long int pa_long_int;
long long int pa_long_long_int;
unsigned short int pa_u_short_int;
unsigned int pa_u_int;
unsigned long int pa_u_long_int;
unsigned long long int pa_u_long_long_int;
float pa_float;
double pa_double;
long double pa_long_double;
const char *pa_string;

View File

@@ -11,9 +11,30 @@ main (void)
if (sprintf (buf, "%.0ls", L"foo") != 0
|| strlen (buf) != 0)
{
puts ("sprintf (buf, \"%.0ls\", L\"foo\") produced some output\n");
puts ("sprintf (buf, \"%.0ls\", L\"foo\") produced some output");
result = 1;
}
#define SIZE (1024*70000)
#define STR(x) #x
char *dst = malloc (SIZE + 1);
if (dst == NULL)
{
puts ("memory allocation failure");
result = 1;
}
else
{
sprintf (dst, "%*s", SIZE, "");
if (strnlen (dst, SIZE + 1) != SIZE)
{
puts ("sprintf (dst, \"%*s\", " STR(SIZE) ", \"\") did not produce enough output");
result = 1;
}
free (dst);
}
return result;
}

View File

@@ -581,10 +581,8 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
else \
if (is_long_num) \
signed_number = args_value[fspec->data_arg].pa_long_int; \
else if (!is_short) \
else /* `char' and `short int' will be promoted to `int'. */ \
signed_number = args_value[fspec->data_arg].pa_int; \
else \
signed_number = args_value[fspec->data_arg].pa_short_int; \
\
is_negative = signed_number < 0; \
number.word = is_negative ? (- signed_number) : signed_number; \
@@ -675,12 +673,12 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
number.word = args_value[fspec->data_arg].pa_u_long_int; \
else if (is_char) \
number.word = (unsigned char) \
args_value[fspec->data_arg].pa_char; \
args_value[fspec->data_arg].pa_u_int; \
else if (!is_short) \
number.word = args_value[fspec->data_arg].pa_u_int; \
else \
number.word = (unsigned short int) \
args_value[fspec->data_arg].pa_u_short_int; \
args_value[fspec->data_arg].pa_u_int; \
\
LABEL (number): \
if (prec < 0) \
@@ -977,7 +975,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
outchar (__btowc ((unsigned char) va_arg (ap, int))); /* Promoted. */ \
else \
outchar (__btowc ((unsigned char) \
args_value[fspec->data_arg].pa_char)); \
args_value[fspec->data_arg].pa_int)); \
if (left) \
PAD (L' '); \
break; \
@@ -1096,7 +1094,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
if (fspec == NULL) \
outchar ((unsigned char) va_arg (ap, int)); /* Promoted. */ \
else \
outchar ((unsigned char) args_value[fspec->data_arg].pa_char); \
outchar ((unsigned char) args_value[fspec->data_arg].pa_int); \
if (left) \
PAD (' '); \
break; \