41 if (*length>SIZE_MAX-printed) {
55 static size_t print_char(
char** str,
size_t* size,
char c)
60 }
else if (NULL==str || NULL==*str || NULL==size) {
78 static size_t print_string(
char** str,
size_t* size,
const char* s)
95 static size_t print_unsigned(
char** str,
size_t* size, uint64_t u, uint32_t padding,
bool sign) {
96 char number[20] = {0};
100 number[digits++] =
'0'+(u%10);
106 for (uint32_t zeros = digits; zeros<padding; zeros++) {
109 for (uint8_t digit = 0; digit < digits; digit++) {
123 static size_t print_signed(
char** str,
size_t* size, int64_t d, uint32_t padding,
bool sign) {
143 static size_t print_float(
char** str,
size_t* size,
double f, uint32_t padding, uint32_t fractional,
bool sign) {
147 }
else if (isinf(f)) {
154 }
else if (isnormal(f)) {
160 double f_abs = fabs(f);
164 while (f_abs<pow(10.0, exponent-1)) {
171 while (f_abs>=pow(10.0, exponent)) {
181 f_abs /= pow(10.0, exponent);
186 f_abs -= (uint64_t)f_abs;
187 for (uint32_t frac=0; frac<fractional; frac++) {
190 f_abs -= (uint64_t)f_abs;
221 static size_t print_nibble(
char** str,
size_t* size, uint8_t nibble,
bool upcase) {
243 static size_t print_hex(
char** str,
size_t* size, uint64_t hex, uint32_t padding,
bool prefix,
bool upcase) {
251 if (hex>0xffffffffffffffUL) {
253 }
else if (hex>0xffffffffffffUL) {
255 }
else if (hex>0xffffffffffUL) {
257 }
else if (hex>0xffffffffUL) {
259 }
else if (hex>0xffffffUL) {
261 }
else if (hex>0xffffUL) {
263 }
else if (hex>0xffUL) {
268 for (uint32_t zeros = digits; zeros<padding; zeros++) {
271 for (uint8_t digit = 0; digit < digits; digit++) {
285 static size_t print_bits(
char** str,
size_t* size, uint64_t u, uint32_t padding,
bool prefix) {
290 bits[digits++] =
'0'+(u&0x1);
293 if (digits>
sizeof(bits)) {
300 for (uint32_t zeros = digits; zeros<padding; zeros++) {
303 for (uint8_t digit = 0; digit < digits; digit++) {
316 static size_t vsnprintf(
char** str,
size_t* size,
const char *format, va_list va)
319 uint32_t padding = 0;
320 uint32_t fractional = 0;
346 while (*format>=
'0' && *format<=
'9') {
347 if (padding>UINT32_MAX/10) {
352 if (padding>UINT32_MAX-(*format-
'0')) {
356 padding += *format-
'0';
368 while (*format>=
'0' && *format<=
'9') {
369 if (fractional>UINT32_MAX/10) {
374 if (fractional>UINT32_MAX-(*format-
'0')) {
378 fractional += *format-
'0';
437 if (NULL!=str && NULL!=*str && NULL!=size) {
452 va_start(arglist, format);
453 size_t length =
vsnprintf(NULL, NULL, format, arglist);
458 size_t snprintf(
char* str,
size_t size,
const char* format, ...)
462 va_start(arglist, format);
463 size_t length =
vsnprintf(&str, &size, format, arglist);
uint8_t print_error
flags to indicate which error(s) occurred within printf or snprintf
#define PRINT_ERROR_UNSUPPORTED
input format string is not supported
#define PRINT_ERROR_MAX
maximum returned printed length reached but more has been printed
static size_t print_float(char **str, size_t *size, double f, uint32_t padding, uint32_t fractional, bool sign)
print floating number
#define PRINT_ERROR_MALFORMED
input format string is malformed
static size_t print_signed(char **str, size_t *size, int64_t d, uint32_t padding, bool sign)
print signed integer
static size_t print_char(char **str, size_t *size, char c)
print character
static size_t vsnprintf(char **str, size_t *size, const char *format, va_list va)
print format string on string or user output
#define PRINT_ERROR_TRUNCATED
output string size is not large enough to include complete printed string
static size_t print_string(char **str, size_t *size, const char *s)
print string
#define PRINT_ERROR_NONE
no error occurred
static size_t print_nibble(char **str, size_t *size, uint8_t nibble, bool upcase)
print nibble (half-byte)
static size_t print_hex(char **str, size_t *size, uint64_t hex, uint32_t padding, bool prefix, bool upcase)
print hex value
size_t snprintf(char *str, size_t size, const char *format,...)
print format string on string or user output
size_t printf(const char *format,...)
print format string on user output
printing utilities to replace the large printf from the standard library (API)
static void print_printed(size_t *length, size_t printed)
add printed length to total printed length, and sets error if maximum size is exceeded ...
size_t putc(char c)
print a single character on user output
static size_t print_bits(char **str, size_t *size, uint64_t u, uint32_t padding, bool prefix)
print bits
static size_t print_unsigned(char **str, size_t *size, uint64_t u, uint32_t padding, bool sign)
print unsigned integer