41 static size_t print_char(char** str, size_t* size, char c) 46 }
else if (NULL==str || NULL==*str || NULL==size) {
52 }
else if (1==*size) {
65 static size_t print_string(
char** str,
size_t* size,
const char* s)
82 static size_t print_unsigned(
char** str,
size_t* size, uint64_t u, uint8_t padding,
bool sign) {
83 char number[20] = {0};
87 number[digits++] =
'0'+(u%10);
90 if (digits>
sizeof(number)) {
96 for (uint8_t zeros = digits; zeros<padding; zeros++) {
99 for (uint8_t digit = 0; digit < digits; digit++) {
100 length +=
print_char(str, size, number[digits-digit-1]);
113 static size_t print_signed(
char** str,
size_t* size, int64_t d, uint8_t padding,
bool sign) {
117 length +=
print_unsigned(str, size, (uint64_t)-d, padding,
false);
131 static size_t print_nibble(
char** str,
size_t* size, uint8_t nibble,
bool upcase) {
137 length +=
print_char(str, size,
'A'+nibble-10);
139 length +=
print_char(str, size,
'a'+nibble-10);
153 static size_t print_hex(
char** str,
size_t* size, uint32_t hex, uint8_t padding,
bool prefix,
bool upcase) {
161 if (hex>0x00ffffff) {
163 }
else if (hex>0x0000ffff) {
165 }
else if (hex>0x000000ff) {
170 for (uint8_t zeros = digits; zeros<padding; zeros++) {
173 for (uint8_t digit = 0; digit < digits; digit++) {
174 length +=
print_nibble(str, size, hex>>((digits-digit-1)*4), upcase);
187 static size_t print_bits(
char** str,
size_t* size, uint32_t u, uint8_t padding,
bool prefix) {
192 bits[digits++] =
'0'+(u&0x1);
195 if (digits>
sizeof(bits)) {
202 for (uint8_t zeros = digits; zeros<padding; zeros++) {
205 for (uint8_t digit = 0; digit < digits; digit++) {
206 length +=
print_char(str, size, bits[digits-digit-1]);
218 static size_t vsnprintf(
char** str,
size_t* size,
const char *format, va_list va)
245 while (*format>=
'0' && *format<=
'9') {
247 padding += *format-
'0';
257 length +=
print_unsigned(str, size, va_arg(va,uint32_t), padding, sign);
260 length +=
print_unsigned(str, size, va_arg(va,uint64_t), padding, sign);
263 length +=
print_signed(str, size, va_arg(va,int32_t), padding, sign);
266 length +=
print_signed(str, size, va_arg(va,int64_t), padding, sign);
269 length +=
print_char(str, size, (
char)(va_arg(va,
int)));
272 length +=
print_hex(str, size, va_arg(va,uint32_t), padding, sign,
false);
275 length +=
print_hex(str, size, va_arg(va,uint32_t), padding, sign,
true);
278 length +=
print_bits(str, size, va_arg(va,uint32_t), padding, sign);
290 if (NULL!=str && NULL!=*str && NULL!=size) {
300 va_start(arglist, format);
301 length =
vsnprintf(NULL, NULL, format, arglist);
306 size_t snprintf(
char* str,
size_t size,
const char* format, ...)
310 va_start(arglist, format);
311 length =
vsnprintf(&str, &size, format, arglist);
size_t putc(char c)
print a single character on user output
static size_t print_char(char **str, size_t *size, char c)
print character
static size_t print_hex(char **str, size_t *size, uint32_t hex, uint8_t padding, bool prefix, bool upcase)
print hex value
static size_t vsnprintf(char **str, size_t *size, const char *format, va_list va)
print format string on string or user output
static size_t print_unsigned(char **str, size_t *size, uint64_t u, uint8_t padding, bool sign)
print unsigned number
static size_t print_string(char **str, size_t *size, const char *s)
print string
static size_t print_nibble(char **str, size_t *size, uint8_t nibble, bool upcase)
print nibble (half-byte)
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
static size_t print_bits(char **str, size_t *size, uint32_t u, uint8_t padding, bool prefix)
print bits
printing utilities to replace the large printf from the standard library (API)
static size_t print_signed(char **str, size_t *size, int64_t d, uint8_t padding, bool sign)
print signed number