about summary refs log tree commit diff
path: root/stdio-common
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-05-27 08:03:32 +0000
committerUlrich Drepper <drepper@redhat.com>2003-05-27 08:03:32 +0000
commit40a54e4d8d66e81a2a5dd5de020ae97cd0019b01 (patch)
tree960b008144bc080d27ae064c70106fa5052d4424 /stdio-common
parent7661d9f7838cedc4e35bf86b83cd4d27e41c8e4d (diff)
downloadglibc-40a54e4d8d66e81a2a5dd5de020ae97cd0019b01.tar.gz
glibc-40a54e4d8d66e81a2a5dd5de020ae97cd0019b01.tar.xz
glibc-40a54e4d8d66e81a2a5dd5de020ae97cd0019b01.zip
Update.
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.
Diffstat (limited to 'stdio-common')
-rw-r--r--stdio-common/printf-parse.h4
-rw-r--r--stdio-common/tst-sprintf.c23
-rw-r--r--stdio-common/vfprintf.c12
3 files changed, 27 insertions, 12 deletions
diff --git a/stdio-common/printf-parse.h b/stdio-common/printf-parse.h
index eff2816607..ed0dc8bbc8 100644
--- a/stdio-common/printf-parse.h
+++ b/stdio-common/printf-parse.h
@@ -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;
diff --git a/stdio-common/tst-sprintf.c b/stdio-common/tst-sprintf.c
index afbacd9037..b20561ebfd 100644
--- a/stdio-common/tst-sprintf.c
+++ b/stdio-common/tst-sprintf.c
@@ -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;
 }
diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c
index f8e01b73a1..63440f4b76 100644
--- a/stdio-common/vfprintf.c
+++ b/stdio-common/vfprintf.c
@@ -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;								      \