Skip to content
This repository has been archived by the owner on Nov 17, 2020. It is now read-only.

Commit

Permalink
Handle empty digit string for precision correctly. (#142400)
Browse files Browse the repository at this point in the history
2004-05-14  Tor Lillqvist  <tml@iki.fi>

	* glib/gnulib/vasnprintf.c (vasnprintf): Handle empty digit string
	for precision correctly. (#142400)

	For backward compatibility with the Trio implementation, make "ll"
	format modifer work on Win32, too. Change into "I64" before
	passing to the system printf. (#142433)

	* tests/printf-test.c (main): Add tests for the above.
  • Loading branch information
tml1024 authored and Tor Lillqvist committed May 14, 2004
1 parent 52e2311 commit 267009b
Show file tree
Hide file tree
Showing 7 changed files with 84 additions and 7 deletions.
11 changes: 11 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,14 @@
2004-05-14 Tor Lillqvist <tml@iki.fi>

* glib/gnulib/vasnprintf.c (vasnprintf): Handle empty digit string
for precision correctly. (#142400)

For backward compatibility with the Trio implementation, make "ll"
format modifer work on Win32, too. Change into "I64" before
passing to the system printf. (#142433)

* tests/printf-test.c (main): Add tests for the above.

2004-05-10 Matthias Clasen <mclasen@redhat.com>

Merge from 2.4:
Expand Down
11 changes: 11 additions & 0 deletions ChangeLog.pre-2-10
Original file line number Diff line number Diff line change
@@ -1,3 +1,14 @@
2004-05-14 Tor Lillqvist <tml@iki.fi>

* glib/gnulib/vasnprintf.c (vasnprintf): Handle empty digit string
for precision correctly. (#142400)

For backward compatibility with the Trio implementation, make "ll"
format modifer work on Win32, too. Change into "I64" before
passing to the system printf. (#142433)

* tests/printf-test.c (main): Add tests for the above.

2004-05-10 Matthias Clasen <mclasen@redhat.com>

Merge from 2.4:
Expand Down
11 changes: 11 additions & 0 deletions ChangeLog.pre-2-12
Original file line number Diff line number Diff line change
@@ -1,3 +1,14 @@
2004-05-14 Tor Lillqvist <tml@iki.fi>

* glib/gnulib/vasnprintf.c (vasnprintf): Handle empty digit string
for precision correctly. (#142400)

For backward compatibility with the Trio implementation, make "ll"
format modifer work on Win32, too. Change into "I64" before
passing to the system printf. (#142433)

* tests/printf-test.c (main): Add tests for the above.

2004-05-10 Matthias Clasen <mclasen@redhat.com>

Merge from 2.4:
Expand Down
11 changes: 11 additions & 0 deletions ChangeLog.pre-2-6
Original file line number Diff line number Diff line change
@@ -1,3 +1,14 @@
2004-05-14 Tor Lillqvist <tml@iki.fi>

* glib/gnulib/vasnprintf.c (vasnprintf): Handle empty digit string
for precision correctly. (#142400)

For backward compatibility with the Trio implementation, make "ll"
format modifer work on Win32, too. Change into "I64" before
passing to the system printf. (#142433)

* tests/printf-test.c (main): Add tests for the above.

2004-05-10 Matthias Clasen <mclasen@redhat.com>

Merge from 2.4:
Expand Down
11 changes: 11 additions & 0 deletions ChangeLog.pre-2-8
Original file line number Diff line number Diff line change
@@ -1,3 +1,14 @@
2004-05-14 Tor Lillqvist <tml@iki.fi>

* glib/gnulib/vasnprintf.c (vasnprintf): Handle empty digit string
for precision correctly. (#142400)

For backward compatibility with the Trio implementation, make "ll"
format modifer work on Win32, too. Change into "I64" before
passing to the system printf. (#142433)

* tests/printf-test.c (main): Add tests for the above.

2004-05-10 Matthias Clasen <mclasen@redhat.com>

Merge from 2.4:
Expand Down
12 changes: 10 additions & 2 deletions glib/gnulib/vasnprintf.c
Original file line number Diff line number Diff line change
Expand Up @@ -405,9 +405,8 @@ vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args)
const char *digitp = dp->precision_start + 1;

precision = 0;
do
while (digitp != dp->precision_end)
precision = precision * 10 + (*digitp++ - '0');
while (digitp != dp->precision_end);
}
}

Expand Down Expand Up @@ -626,8 +625,17 @@ vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args)
#ifdef HAVE_LONG_LONG
case TYPE_LONGLONGINT:
case TYPE_ULONGLONGINT:
#ifdef HAVE_INT64_AND_I64 /* The system (sn)printf uses %I64. Also assume
* that long long == __int64.
*/
*p++ = 'I';
*p++ = '6';
*p++ = '4';
break;
#else
*p++ = 'l';
/*FALLTHROUGH*/
#endif
#endif
case TYPE_LONGINT:
case TYPE_ULONGINT:
Expand Down
24 changes: 19 additions & 5 deletions tests/printf-test.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ main (int argc,
TEST (NULL, g_snprintf (buf, 128, "%d", 0) == 1 && !strcmp (buf, "0"));
TEST (NULL, g_snprintf (buf, 128, "%.0d", 0) == 0 && !strcmp (buf, ""));
TEST (NULL, g_snprintf (buf, 128, "%.0d", 1) == 1 && !strcmp (buf, "1"));
TEST (NULL, g_snprintf (buf, 128, "%.d", 2) == 1 && !strcmp (buf, "2"));
TEST (NULL, g_snprintf (buf, 128, "%d", -1) == 2 && !strcmp (buf, "-1"));
TEST (NULL, g_snprintf (buf, 128, "%.3d", 5) == 3 && !strcmp (buf, "005"));
TEST (NULL, g_snprintf (buf, 128, "%.3d", -5) == 4 && !strcmp (buf, "-005"));
Expand Down Expand Up @@ -159,6 +160,8 @@ main (int argc,
TEST (NULL, g_snprintf (buf, 128, "%f", G_PI) == 8 && !strncmp (buf, "3.14159", 7));
TEST (NULL, g_snprintf (buf, 128, "%.8f", G_PI) == 10 && !strncmp (buf, "3.1415926", 9));
TEST (NULL, g_snprintf (buf, 128, "%.0f", G_PI) == 1 && !strcmp (buf, "3"));
TEST (NULL, g_snprintf (buf, 128, "%1.f", G_PI) == 1 && !strcmp (buf, "3"));
TEST (NULL, g_snprintf (buf, 128, "%3.f", G_PI) == 3 && !strcmp (buf, " 3"));
/* %f, flags */
TEST (NULL, g_snprintf (buf, 128, "%+f", G_PI) == 9 && !strncmp (buf, "+3.14159", 8));
TEST (NULL, g_snprintf (buf, 128, "% f", G_PI) == 9 && !strncmp (buf, " 3.14159", 8));
Expand Down Expand Up @@ -220,11 +223,22 @@ main (int argc,
TEST (NULL, g_snprintf (buf, 128, "%" G_GINT64_MODIFIER "x", (gint64)123456) == 5 && !strcmp (buf, "1e240"));
TEST (NULL, g_snprintf (buf, 128, "%#" G_GINT64_MODIFIER "x", (gint64)123456) == 7 && !strcmp (buf, "0x1e240"));
TEST (NULL, g_snprintf (buf, 128, "%" G_GINT64_MODIFIER "X", (gint64)123456) == 5 && !strcmp (buf, "1E240"));
#ifdef G_OS_WIN32
/* On Win32, test that the "ll" modifier also works, for backward
* compatibility. One really should use the G_GINT64_MODIFIER (which
* on Win32 is the "I64" that the (msvcrt) C library's printf uses),
* but "ll" used to work with the "trio" g_printf implementation in
* GLib 2.2, so it's best if it continues to work.
*/
TEST (NULL, g_snprintf (buf, 128, "%" "lli", (gint64)123456) == 6 && !strcmp (buf, "123456"));
TEST (NULL, g_snprintf (buf, 128, "%" "lli", (gint64)-123456) == 7 && !strcmp (buf, "-123456"));
TEST (NULL, g_snprintf (buf, 128, "%" "llu", (guint64)123456) == 6 && !strcmp (buf, "123456"));
TEST (NULL, g_snprintf (buf, 128, "%" "ll" "o", (gint64)123456) == 6 && !strcmp (buf, "361100"));
TEST (NULL, g_snprintf (buf, 128, "%#" "ll" "o", (gint64)123456) == 7 && !strcmp (buf, "0361100"));
TEST (NULL, g_snprintf (buf, 128, "%" "ll" "x", (gint64)123456) == 5 && !strcmp (buf, "1e240"));
TEST (NULL, g_snprintf (buf, 128, "%#" "ll" "x", (gint64)123456) == 7 && !strcmp (buf, "0x1e240"));
TEST (NULL, g_snprintf (buf, 128, "%" "ll" "X", (gint64)123456) == 5 && !strcmp (buf, "1E240"));
#endif

return any_failed;
}





0 comments on commit 267009b

Please sign in to comment.