INT,
LONG,
LONG_LONG,
- /* FIXME: add INTMAX support, too */
+ INTMAX,
FLOAT_HALF,
FLOAT_SINGLE,
FLOAT_DOUBLE,
CHARACTER
};
-enum { MAX_INTEGRAL_TYPE_WIDTH = ULLONG_WIDTH };
+enum { MAX_INTEGRAL_TYPE_WIDTH = UINTMAX_WIDTH };
/* The maximum number of bytes needed for a format string, including
the trailing nul. Each format string expects a variable amount of
enum
{
FMT_BYTES_ALLOCATED =
- (sizeof "%*.99" + 1
- + MAX (sizeof "ld",
+ (sizeof "%*.99" - 1
+ + MAX (sizeof "lld",
MAX (sizeof "jd",
MAX (sizeof "jo",
MAX (sizeof "ju",
sizeof (int),
sizeof (long int),
sizeof (unsigned long long int),
+ sizeof (uintmax_t),
#if BF16_SUPPORTED
sizeof (bfloat16),
#else
#if UINT_MAX < ULONG_MAX
[sizeof (unsigned long int)] = LONG,
#endif
-#if ULONG_MAX < ULLONG_MAX
+#if ULONG_MAX < ULLONG_MAX && ULLONG_MAX < UINTMAX_MAX
[sizeof (unsigned long long int)] = LONG_LONG,
+#endif
+#if ULONG_MAX < UINTMAX_MAX
+ [sizeof (uintmax_t)] = INTMAX,
#endif
};
PRINT_TYPE (print_int, unsigned int)
PRINT_TYPE (print_long, unsigned long int)
PRINT_TYPE (print_long_long, unsigned long long int)
+PRINT_TYPE (print_intmax, uintmax_t)
PRINT_FLOATTYPE (print_bfloat, bfloat16, ftoastr, FLT_BUFSIZE_BOUND)
PRINT_FLOATTYPE (print_halffloat, float16, ftoastr, FLT_BUFSIZE_BOUND)
break;
}
-#define ISPEC_TO_FORMAT(Spec, Min_format, Long_format, Max_format) \
- ((Spec) == LONG_LONG ? (Max_format) \
- : ((Spec) == LONG ? (Long_format) \
- : (Min_format))) \
+#define ISPEC_TO_FORMAT(Spec, Min_fmt, Long_fmt, Long_long_fmt, Max_fmt) \
+ ((Spec) == INTMAX ? (Max_fmt) \
+ : (Spec) == LONG_LONG ? (Long_long_fmt) \
+ : (Spec) == LONG ? (Long_fmt) \
+ : (Min_fmt))
size_spec = integral_type_size[size];
fmt = SIGNED_DECIMAL;
field_width = bytes_to_signed_dec_digits[size];
sprintf (tspec->fmt_string, "%%*%s",
- ISPEC_TO_FORMAT (size_spec, "d", "ld", "jd"));
+ ISPEC_TO_FORMAT (size_spec, "d", "ld", "lld", "jd"));
break;
case 'o':
fmt = OCTAL;
sprintf (tspec->fmt_string, "%%*.%d%s",
(field_width = bytes_to_oct_digits[size]),
- ISPEC_TO_FORMAT (size_spec, "o", "lo", "jo"));
+ ISPEC_TO_FORMAT (size_spec, "o", "lo", "llo", "jo"));
break;
case 'u':
fmt = UNSIGNED_DECIMAL;
field_width = bytes_to_unsigned_dec_digits[size];
sprintf (tspec->fmt_string, "%%*%s",
- ISPEC_TO_FORMAT (size_spec, "u", "lu", "ju"));
+ ISPEC_TO_FORMAT (size_spec, "u", "lu", "llu", "ju"));
break;
case 'x':
fmt = HEXADECIMAL;
sprintf (tspec->fmt_string, "%%*.%d%s",
(field_width = bytes_to_hex_digits[size]),
- ISPEC_TO_FORMAT (size_spec, "x", "lx", "jx"));
+ ISPEC_TO_FORMAT (size_spec, "x", "lx", "llx", "jx"));
break;
default:
print_function = print_long_long;
break;
+ case INTMAX:
+ print_function = print_intmax;
+ break;
+
default:
affirm (false);
}