Skip to content

Commit 0aec636

Browse files
committed
test: Test printf/scanf integer type modifiers
Test all integer size modifiers, from hh through ll as well as the C99 ones. Signed-off-by: Keith Packard <keithp@keithp.com>
1 parent 6b93496 commit 0aec636

File tree

1 file changed

+37
-33
lines changed

1 file changed

+37
-33
lines changed

test/printf_scanf.c

Lines changed: 37 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -79,15 +79,6 @@ main(int argc, char **argv)
7979
char buf[256];
8080
int errors = 0;
8181

82-
float v;
83-
double dv;
84-
85-
#define STR "0x1.7a27cc3ed6cf7p+124"
86-
sscanf(STR, "%f", &v);
87-
printf("%s = %.17e %.17a\n", STR, printf_float(v), printf_float(v));
88-
sscanf(STR, "%lf", &dv);
89-
printf("%s = %.17e %.17a\n", STR, printf_float(dv), printf_float(dv));
90-
9182
#if 0
9283
double a;
9384

@@ -153,32 +144,45 @@ main(int argc, char **argv)
153144
}
154145
}
155146
}
156-
for (x = 0; x < 32; x++) {
157-
unsigned int v = 0x12345678 >> x;
158-
unsigned int r;
159147

160-
sprintf(buf, "%u", v);
161-
sscanf(buf, "%u", &r);
162-
if (v != r) {
163-
printf("\t%3d: wanted %u got %u\n", x, v, r);
164-
errors++;
165-
fflush(stdout);
166-
}
167-
sprintf(buf, "%x", v);
168-
sscanf(buf, "%x", &r);
169-
if (v != r) {
170-
printf("\t%3d: wanted %u got %u\n", x, v, r);
171-
errors++;
172-
fflush(stdout);
173-
}
174-
sprintf(buf, "%o", v);
175-
sscanf(buf, "%o", &r);
176-
if (v != r) {
177-
printf("\t%3d: wanted %u got %u\n", x, v, r);
178-
errors++;
179-
fflush(stdout);
180-
}
148+
#define FMT(prefix,conv) "%" prefix conv
149+
150+
#define VERIFY(prefix, conv) do { \
151+
sprintf(buf, FMT(prefix, conv), v); \
152+
sscanf(buf, FMT(prefix, conv), &r); \
153+
if (v != r) { \
154+
printf("\t%3d: " prefix " " conv " wanted " FMT(prefix, conv) " got " FMT(prefix, conv) "\n", x, v, r); \
155+
errors++; \
156+
fflush(stdout); \
157+
} \
158+
} while(0)
159+
160+
#define CHECK_RT(type, prefix) do { \
161+
for (x = 0; x < sizeof(type) * 8; x++) { \
162+
type v = (type) (0x123456789abcdef0LL >> (64 - sizeof(type) * 8)) >> x; \
163+
type r; \
164+
VERIFY(prefix, "d"); \
165+
VERIFY(prefix, "u"); \
166+
VERIFY(prefix, "x"); \
167+
VERIFY(prefix, "o"); \
168+
} \
169+
} while(0)
170+
171+
CHECK_RT(unsigned char, "hh");
172+
CHECK_RT(unsigned short, "h");
173+
CHECK_RT(unsigned int, "");
174+
CHECK_RT(unsigned long, "l");
175+
#if defined(_WANT_IO_LONG_LONG) || defined(TINY_STDIO)
176+
CHECK_RT(unsigned long long, "ll");
177+
#endif
178+
#if !defined(_WANT_IO_LONG_LONG) && !defined(TINY_STDIO)
179+
if (sizeof(intmax_t) <= sizeof(long))
180+
#endif
181+
{
182+
CHECK_RT(intmax_t, "j");
181183
}
184+
CHECK_RT(size_t, "z");
185+
CHECK_RT(ptrdiff_t, "t");
182186

183187
#if defined(TINY_STDIO) || !defined(NO_FLOATING_POINT)
184188
#ifdef PICOLIBC_FLOAT_PRINTF_SCANF

0 commit comments

Comments
 (0)