Yes, works for Print::printNumber() too, only need one pointer to track the end of the string.
size_t Print::printNumber(unsigned long n, uint8_t base) {
char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
char *str = &buf[sizeof(buf) - 1];
char *estr = str;
*str = '\0';
uint8_t c;
uint32_t d;
// prevent crash if called with base <= 1
if (base < 2) base = 10;
switch(base)
{
case HEX:
do {
c = n & 0x0F;
n >>= 4;
*--str = c < 10 ? c + '0' : c + ('A' - 10);
} while(n > 0);
break;
case DEC:
do {
divmod10_asm(n, c, d);
*--str = c + '0';
} while(n > 0);
break;
case OCT:
// *--str = '0'; //leading 0 to indicate octal ?
do {
c = n & 0x07;
n >>= 3;
*--str = c + '0';
} while(n > 0);
break;
case BIN:
// *--str = 'b'; // leading b to indicate binary ?
do {
c = n & 0x01;
n >>= 1;
*--str = c + '0';
} while(n > 0);
break;
default:
do {
d = n;
n /= base;
c = d - base * n;
*--str = c < 10 ? c + '0' : c + 'A' - 10;
} while(n);
break;
}
return write((const uint8_t*)str, (size_t)(estr-str));
}
As printFloat() uses printNumber() for the integer part its timing is improved too
Time=665
per char incl .\r\n : 23.75