#define PRINT(ptr, len) \
CYG_MACRO_START \
cyg_ucount32 length = MIN( (cyg_ucount32) len, n - ret - 1); \
- if (((Cyg_StdioStream *)stream)->write( (const cyg_uint8 *)ptr, \
+ if (((Cyg_OutputStream *)stream)->write( (const cyg_uint8 *)ptr, \
length, &length )) \
goto error; \
if (length < (cyg_ucount32)len) { \
/* NOSTRICT */
_uquad = (unsigned long)va_arg(arg, void *);
base = HEX;
- xdigs = "0123456789abcdef";
+ xdigs = (char *)"0123456789abcdef";
flags |= HEXPREFIX;
ch = 'x';
goto nosign;
case 's':
if ((cp = va_arg(arg, char *)) == NULL)
- cp = "(null)";
+ cp = (char *)"(null)";
if (prec >= 0) {
/*
* can't use strlen; can only look for the
base = DEC;
goto nosign;
case 'X':
- xdigs = "0123456789ABCDEF";
+ xdigs = (char *)"0123456789ABCDEF";
goto hex;
case 'x':
- xdigs = "0123456789abcdef";
+ xdigs = (char *)"0123456789abcdef";
hex: _uquad = UARG();
base = HEX;
/* leading 0x/X only if non-zero */
break;
case DEC:
- /* many numbers are 1 digit */
- while (_uquad >= 10) {
- *--cp = to_char(_uquad % 10);
- _uquad /= 10;
+ if (!(flags & QUADINT)) {
+ /* many numbers are 1 digit */
+ unsigned long v = (unsigned long)_uquad;
+ while (v >= 10) {
+ /* The following is usually faster than using a modulo */
+ unsigned long next = v / 10;
+ *--cp = to_char(v - (next * 10));
+ v = next;
+ }
+ *--cp = to_char(v);
+ }
+ else {
+ while (_uquad >= 10) {
+ /* The following is usually faster than using a modulo */
+ u_quad_t next = _uquad / 10;
+ *--cp = to_char(_uquad - (next * 10));
+ _uquad = next;
+ }
+ *--cp = to_char(_uquad);
}
- *--cp = to_char(_uquad);
break;
case HEX:
break;
default:
- cp = "bug in vfprintf: bad base";
+ cp = (char *)"bug in vfprintf: bad base";
size = strlen(cp);
goto skipsize;
}
}
done:
error:
- return (((Cyg_StdioStream *) stream)->get_error() ? EOF : ret);
+ return (((Cyg_OutputStream *) stream)->get_error() ? EOF : ret);
/* NOTREACHED */
}