From fb5750bfb4c4ffd5ae839c416de192c8bc262b4b Mon Sep 17 00:00:00 2001 From: Jeff Johnston Date: Tue, 17 Apr 2007 20:53:24 +0000 Subject: [PATCH] 2007-04-17 Brian Dessent * libc/stdio/sscanf.c: Update documentation comments. * libc/stdio/vfscanf.c (__SVFSCANF_R): Handle j, t, and z modifiers. --- newlib/ChangeLog | 5 +++++ newlib/libc/stdio/sscanf.c | 24 +++++++++++++++++++---- newlib/libc/stdio/vfscanf.c | 38 +++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 4 deletions(-) diff --git a/newlib/ChangeLog b/newlib/ChangeLog index 67ae8054e..bfb444fa8 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,8 @@ +2007-04-17 Brian Dessent + + * libc/stdio/sscanf.c: Update documentation comments. + * libc/stdio/vfscanf.c (__SVFSCANF_R): Handle j, t, and z modifiers. + 2007-04-12 Eric Blake * libc/stdio/vfprintf.c (_VFPRINTF_F, cvt): Don't confuse %F with %e. diff --git a/newlib/libc/stdio/sscanf.c b/newlib/libc/stdio/sscanf.c index 5ad39d8b7..b74dd3ebe 100644 --- a/newlib/libc/stdio/sscanf.c +++ b/newlib/libc/stdio/sscanf.c @@ -147,9 +147,9 @@ DESCRIPTION Then <> proceeds to the next format specification. o size - <>, <>, and <> are optional size characters which - override the default way that <> interprets the - data type of the corresponding argument. + <>, <>, <>, <>, <>, and <> are optional size + characters which override the default way that <> + interprets the data type of the corresponding argument. .Modifier Type(s) @@ -162,6 +162,11 @@ DESCRIPTION . h D, I, O, U, X no effect . e, f, c, s, p . +. j d, i, o, u, x, n convert input to intmax_t, +. store in intmax_t object +. +. j all others no effect +. . l d, i, o, u, x, n convert input to long, . store in long object . @@ -180,7 +185,18 @@ DESCRIPTION . L e, f, g, E, G convert to long double, . store in long double . -. L all others no effect +. L all others no effect +. +. t d, i, o, u, x, n convert input to ptrdiff_t, +. store in ptrdiff_t object +. +. t all others no effect +. +. z d, i, o, u, x, n convert input to size_t, +. store in size_t object +. +. z all others no effect +. o <[type]> diff --git a/newlib/libc/stdio/vfscanf.c b/newlib/libc/stdio/vfscanf.c index c9808bb48..3b3f63af8 100644 --- a/newlib/libc/stdio/vfscanf.c +++ b/newlib/libc/stdio/vfscanf.c @@ -109,6 +109,7 @@ Supporting OS subroutines required: #include #include #include +#include #include #include #include @@ -380,6 +381,43 @@ _DEFUN(__SVFSCANF_R, (rptr, fp, fmt0, ap), else flags |= SHORT; goto again; + case 'j': /* intmax_t */ + if (sizeof (intmax_t) == sizeof (long)) + flags |= LONG; + else + flags |= LONGDBL; + goto again; + case 't': /* ptrdiff_t */ + if (sizeof (ptrdiff_t) < sizeof (int)) + /* POSIX states ptrdiff_t is 16 or more bits, as + is short. */ + flags |= SHORT; + else if (sizeof (ptrdiff_t) == sizeof (int)) + /* no flag needed */; + else if (sizeof (ptrdiff_t) <= sizeof (long)) + flags |= LONG; + else + /* POSIX states that at least one programming + environment must support ptrdiff_t no wider than + long, but that means other environments can + have ptrdiff_t as wide as long long. */ + flags |= LONGDBL; + goto again; + case 'z': /* size_t */ + if (sizeof (size_t) < sizeof (int)) + /* POSIX states size_t is 16 or more bits, as is short. */ + flags |= SHORT; + else if (sizeof (size_t) == sizeof (int)) + /* no flag needed */; + else if (sizeof (size_t) <= sizeof (long)) + flags |= LONG; + else + /* POSIX states that at least one programming + environment must support size_t no wider than + long, but that means other environments can + have size_t as wide as long long. */ + flags |= LONGDBL; + goto again; case '0': case '1': -- 2.43.5