while (0)
const HChar* saved_format;
- Bool longlong, ljustify;
+ Bool longlong, ljustify, is_sizet;
HChar padchar;
Int fwidth, nout, len1, len2, len3;
HChar intbuf[100]; /* big enough for a 64-bit # in base 2 */
}
saved_format = format;
- longlong = False;
+ longlong = is_sizet = False;
ljustify = False;
padchar = ' ';
fwidth = 0;
format++;
if (*format == 'l') {
format++;
- longlong = True;
+ longlong = True;
}
+ } else if (*format == 'z') {
+ format++;
+ is_sizet = True;
}
switch (*format) {
}
case 'd': {
Long l;
+ vassert(is_sizet == False); // %zd is obscure; we don't allow it
if (longlong) {
l = va_arg(ap, Long);
} else {
Int base = *format == 'u' ? 10 : 16;
Bool hexcaps = True; /* *format == 'X'; */
ULong l;
- if (longlong) {
+ if (is_sizet) {
+ l = (ULong)va_arg(ap, SizeT);
+ } else if (longlong) {
l = va_arg(ap, ULong);
} else {
l = (ULong)va_arg(ap, UInt);
typedef unsigned long long int ULong;
typedef signed long long int Long;
+/* Equivalent of C's size_t type. The type is unsigned and has this
+ storage requirement:
+ 32 bits on a 32-bit architecture
+ 64 bits on a 64-bit architecture. */
+typedef unsigned long SizeT;
+
/* Always 128 bits. */
typedef UInt U128[4];