mirror of
https://sourceware.org/git/glibc.git
synced 2025-10-24 13:33:08 +03:00
stdio-common: Convert macros across scanf input specifier tests
Convert 'compare_real', 'read_real', and 'verify_input' macros to functions so as to improve readability and avoid pitfalls. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
This commit is contained in:
@@ -16,36 +16,45 @@
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
|
||||
/* Reference data is a signed decimal integer constant to compare against
|
||||
arithmetically. */
|
||||
|
||||
/* Tweak our environment according to any TYPE_T_UNSIGNED_P setting
|
||||
supplied by the individual test case. */
|
||||
#ifdef TYPE_T_UNSIGNED_P
|
||||
# define UNSIGNED unsigned
|
||||
#else
|
||||
# define UNSIGNED
|
||||
#endif
|
||||
|
||||
#define pointer_to_value(val) (&(val))
|
||||
|
||||
#define initialize_value(val) \
|
||||
memset (&val, 0xa5, sizeof (val))
|
||||
|
||||
#define verify_input(f, val, count, errp) \
|
||||
({ \
|
||||
__label__ out; \
|
||||
bool match = true; \
|
||||
int err; \
|
||||
\
|
||||
UNSIGNED long long v = read_integer (&err); \
|
||||
if (err < 0) \
|
||||
goto out; \
|
||||
match = val == v; \
|
||||
\
|
||||
out: \
|
||||
if (err || !match) \
|
||||
{ \
|
||||
printf ("error: %s:%d: input: %016llx\n", \
|
||||
__FILE__, __LINE__, (long long) val); \
|
||||
printf ("error: %s:%d: value: %016llx\n", \
|
||||
__FILE__, __LINE__, v); \
|
||||
} \
|
||||
\
|
||||
*errp = err; \
|
||||
match; \
|
||||
})
|
||||
static bool
|
||||
verify_input (char f, type_t val, long long count, int *errp)
|
||||
{
|
||||
bool match = true;
|
||||
int err;
|
||||
|
||||
UNSIGNED long long v = read_integer (&err);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
match = val == v;
|
||||
|
||||
out:
|
||||
if (err || !match)
|
||||
{
|
||||
printf ("error: %s:%d: input: %016llx\n",
|
||||
__FILE__, __LINE__, (long long) val);
|
||||
printf ("error: %s:%d: value: %016llx\n",
|
||||
__FILE__, __LINE__, v);
|
||||
}
|
||||
|
||||
*errp = err;
|
||||
return match;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user