//------------------------------------------------------------------------------ int StdioStream::printDec(uint32_t n) { #ifdef NEW_WAY char buf[10]; char *ptr = fmtDec(n, buf + sizeof(buf)); uint8_t len = buf + sizeof(buf) - ptr; return write(ptr, len); #else uint8_t len; if (n < 0X10000) { return printDec((uint16_t)n); } if (n < 10000000) { len = n < 100000 ? 5 : n < 1000000 ? 6 : 7; } else { len = n < 100000000 ? 8 : n < 1000000000 ? 9 : 10; } char* str = fmtSpace(len); if (!str) { return -1; } fmtDec(n, str); return len; #endif }
//------------------------------------------------------------------------------ size_t FatFile::printFileSize(print_t* pr) { char buf[11]; char *ptr = buf + sizeof(buf); *--ptr = 0; ptr = fmtDec(fileSize(), ptr); while (ptr > buf) { *--ptr = ' '; } return pr->write(buf); }
//------------------------------------------------------------------------------ int StdioStream::printDec(uint16_t n) { #define NEW_WAY #ifdef NEW_WAY char buf[5]; char *ptr = fmtDec(n, buf + sizeof(buf)); uint8_t len = buf + sizeof(buf) - ptr; return write(ptr, len); #else uint8_t len; if (n < 100) { len = n < 10 ? 1 : 2; } else { len = n < 1000 ? 3 : n < 10000 ? 4 : 5; } char* str = fmtSpace(len); if (!str) { return -1; } fmtDec(n, str); return len; #endif }
static int printFieldT(FatFile* file, char sign, Type value, char term) { char buf[3*sizeof(Type) + 3]; char* str = &buf[sizeof(buf)]; if (term) { *--str = term; if (term == '\n') { *--str = '\r'; } } #ifdef OLD_FMT do { Type m = value; value /= 10; *--str = '0' + m - 10*value; } while (value); #else // OLD_FMT str = fmtDec(value, str); #endif // OLD_FMT if (sign) { *--str = sign; } return file->write(str, &buf[sizeof(buf)] - str); }
//------------------------------------------------------------------------------ int StdioStream::printDec(float value, uint8_t prec) { #define FLOAT_NEW_WAY #ifdef FLOAT_NEW_WAY char buf[24]; char *ptr = fmtFloat(value, buf + sizeof(buf), prec); // return fputs(ptr); // uint8_t len = buf + sizeof(buf) - ptr; return write(ptr, buf + sizeof(buf) - ptr); #else char* ptr; uint8_t rtn = 0; uint8_t sign = 0; if (value < 0) { value = -value; sign = '-'; } // check for NaN INF OVF if (isnan(value)) { if (fputs_P(PSTR("nan")) < 0) { return -1; } rtn += 3; } else if (isinf(value)) { if (fputs_P(PSTR("inf")) < 0) { return -1; } rtn += 3; } else if (value > 4294967040.0) { if (fputs_P(PSTR("ovf")) < 0) { return -1; } rtn += 3; } else { if (sign) { if (putc(sign) < 0) { return -1; } rtn++; } if (prec > 9) { prec = 9; } /* uint32_t s = 1; for (uint8_t i = 0; i < prec; i++) { // s *= 10; s = ((s << 2) + s) << 1; } // round value value += 0.5/s; */ value += scale10(0.5, -prec); uint32_t whole = value; int np; if ((np = printDec(whole)) < 0) { return -1; } rtn += np; if (prec) { if (putc('.') < 0) { return -1; } char* str = fmtSpace(prec); if (!str) { return -1; } char* tmp = str - prec; // uint32_t fraction = s*(value - whole); uint32_t fraction = scale10(value - whole, prec); ptr = fmtDec(fraction, str); while (ptr > tmp) { *--ptr = '0'; } rtn += prec + 1; } } return rtn; #endif }
//------------------------------------------------------------------------------ static void printU32(print_t* pr, uint32_t v) { char buf[11]; char* ptr = buf + sizeof(buf); *--ptr = 0; pr->write(fmtDec(v, ptr)); }