21#define XWVSNPF_F_ZEROPAD 0x01
22#define XWVSNPF_F_SIGN 0x02
23#define XWVSNPF_F_PLUS 0x04
24#define XWVSNPF_F_SPACE 0x08
25#define XWVSNPF_F_LEFT 0x10
26#define XWVSNPF_F_SMALL 0x20
27#define XWVSNPF_F_SPECIAL 0x40
51#if defined(XWLIBCFG_SPF_FLOAT) && (1U == XWLIBCFG_SPF_FLOAT)
55# if defined(XWLIBCFG_SPF_LONG_DOUBLE) && (1U == XWLIBCFG_SPF_LONG_DOUBLE)
80 while (isdigit((
int)(**s))) {
81 i = i * 10 + **s -
'0';
90 unsigned int d3, d2, d1, d0;
96 d0 = 6 * (d3 + d2 + d1) + (q & 0xf);
97 q = (d0 * 0xcd) >> 11;
99 *buf++ = (char)d0 +
'0';
101 d1 = q + 9 * d3 + 5 * d2 + d1;
103 q = (d1 * 0xcd) >> 11;
105 *buf++ = (char)d1 +
'0';
108 if ((d2 != 0) || (d3 != 0)) {
111 *buf++ = (char)d2 +
'0';
115 q = (d3 * 0xcd) >> 11;
117 *buf++ = (char)d3 +
'0';
119 *buf++ = (char)q +
'0';
130 unsigned int d3, d2, d1, d0;
136 d0 = 6 * (d3 + d2 + d1) + (q & 0xf);
137 q = (d0 * 0xcd) >> 11;
139 *buf++ = (char)d0 +
'0';
141 d1 = q + 9 * d3 + 5 * d2 + d1;
142 q = (d1 * 0xcd) >> 11;
144 *buf++ = (char)d1 +
'0';
149 *buf++ = (char)d2 +
'0';
152 q = (d3 * 0xcd) >> 11;
155 *buf++ = (char)d3 +
'0';
156 *buf++ = (char)q +
'0';
184 bool is_zero = num == 0LL;
192 if ((
signed long long)num < 0) {
194 num = (
unsigned long long)(-(
signed long long)num);
205 if (16 == spec.
base || 2 == spec.
base) {
207 }
else if (!is_zero) {
214 if (num < spec.
base) {
222 }
else if (spec.
base != 10) {
223 int mask = spec.
base - 1;
226 if (spec.
base == 16) {
228 }
else if (spec.
base == 2) {
263 if (spec.
base == 16 || spec.
base == 2 || !is_zero) {
269 if (spec.
base == 16) {
271 *buf = (
'X' | locase);
274 }
else if (spec.
base == 2) {
276 *buf = (
'B' | locase);
325 if (size <= spaces) {
326 memset(buf,
' ', (
xwsz_t)size);
330 if (len > size - spaces) {
333 memmove(buf + spaces, buf, (
xwsz_t)len);
335 memset(buf,
' ', (
xwsz_t)spaces);
409 default_width = (int)(2 *
sizeof(
void *) +
421#if defined(XWLIBCFG_SPF_FLOAT) && (1U == XWLIBCFG_SPF_FLOAT)
434 while (num > 0 && i < 29) {
435 tmp[i++] = (char)(
'0' + (num % 10));
440 while (i < digits && i < 29) {
444 for (j = i - 1; j >= 0; j--) {
457 char * exp_pos =
NULL;
463 }
else if ((
'e' == *q) || (
'E' == *q)) {
469 char * tail = (
NULL != exp_pos) ? exp_pos : p;
471 while ((q > dot + 1) && (
'0' == q[-1])) {
477 if (
NULL != exp_pos) {
478 memmove(q, exp_pos, (
xwsz_t)(p - exp_pos));
479 p = q + (p - exp_pos);
500 unsigned long long int_part = 0;
501 unsigned long long frac_part = 0;
510 if (buf < end) *buf++ =
'-';
512 if (buf < end) *buf++ =
'+';
514 if (buf < end) *buf++ =
' ';
516 if (buf < end) *buf++ =
'n';
517 if (buf < end) *buf++ =
'a';
518 if (buf < end) *buf++ =
'n';
524 if (buf < end) *buf++ =
'-';
526 if (buf < end) *buf++ =
'+';
528 if (buf < end) *buf++ =
' ';
530 if (buf < end) *buf++ =
'i';
531 if (buf < end) *buf++ =
'n';
532 if (buf < end) *buf++ =
'f';
536 if ((num < 0) || (signbit(num))) {
552 if (is_sci || is_general) {
555 if (precision == 0) {
559 if (abs_num == 0.0) {
561 }
else if (abs_num >= 1.0) {
562 while (abs_num >= 10.0) {
567 while (abs_num < 1.0) {
573 if ((exp < -4) || (exp >= precision)) {
575 digits = precision - 1;
577 is_sci_style =
false;
578 digits = precision - exp - 1;
586 is_sci_style =
false;
590 int_part = (
unsigned long long)abs_num;
591 double frac = abs_num - (double)int_part;
593 for (i = 0; i < digits; i++) {
596 frac_part = (
unsigned long long)(frac * mult + 0.5);
598 if (frac_part >= (
unsigned long long)mult) {
599 frac_part -= (
unsigned long long)mult;
602 int_part = (
unsigned long long)1;
604 }
else if (is_general) {
605 unsigned long long n = int_part;
611 if (exp_new >= precision) {
614 digits = precision - 1;
618 digits = precision - exp_new - 1;
648 len = (int)(p - tmp);
650 int pad_len = (total_width > len + need_sign) ? (total_width - len - need_sign) : 0;
654 if (pad_char ==
'0' && sign) {
655 if (buf < end) *buf++ = sign;
659 for (i = 0; i < pad_len; i++) {
660 if (buf < end) *buf++ = pad_char;
665 if (buf < end) *buf++ = sign;
668 for (i = 0; i < len; i++) {
669 if (buf < end) *buf++ = tmp[i];
673 for (i = 0; i < pad_len; i++) {
674 if (buf < end) *buf++ =
' ';
681# if defined(XWLIBCFG_SPF_LONG_DOUBLE) && (1U == XWLIBCFG_SPF_LONG_DOUBLE)
695 unsigned long long int_part = 0;
696 unsigned long long frac_part = 0;
698 long double abs_orig;
705 if (buf < end) *buf++ =
'-';
707 if (buf < end) *buf++ =
'+';
709 if (buf < end) *buf++ =
' ';
711 if (buf < end) *buf++ =
'n';
712 if (buf < end) *buf++ =
'a';
713 if (buf < end) *buf++ =
'n';
719 if (buf < end) *buf++ =
'-';
721 if (buf < end) *buf++ =
'+';
723 if (buf < end) *buf++ =
' ';
725 if (buf < end) *buf++ =
'i';
726 if (buf < end) *buf++ =
'n';
727 if (buf < end) *buf++ =
'f';
731 if ((num < 0) || (signbit(num))) {
747 if (is_sci || is_general) {
750 if (precision == 0) {
754 if (abs_num == 0.0L) {
756 }
else if (abs_num >= 1.0L) {
757 while (abs_num >= 10.0L) {
762 while (abs_num < 1.0L) {
768 if ((exp < -4) || (exp >= precision)) {
770 digits = precision - 1;
772 is_sci_style =
false;
773 digits = precision - exp - 1;
781 is_sci_style =
false;
785 int_part = (
unsigned long long)abs_num;
786 long double frac = abs_num - (
long double)int_part;
787 long double mult = 1.0L;
788 for (i = 0; i < digits; i++) {
791 frac_part = (
unsigned long long)(frac * mult + 0.5L);
793 if (frac_part >= (
unsigned long long)mult) {
794 frac_part -= (
unsigned long long)mult;
797 int_part = (
unsigned long long)1;
799 }
else if (is_general) {
800 unsigned long long n = int_part;
806 if (exp_new >= precision) {
809 digits = precision - 1;
813 digits = precision - exp_new - 1;
843 len = (int)(p - tmp);
845 int pad_len = (total_width > len + need_sign) ? (total_width - len - need_sign) : 0;
849 if (pad_char ==
'0' && sign) {
850 if (buf < end) *buf++ = sign;
854 for (i = 0; i < pad_len; i++) {
855 if (buf < end) *buf++ = pad_char;
860 if (buf < end) *buf++ = sign;
863 for (i = 0; i < len; i++) {
864 if (buf < end) *buf++ = tmp[i];
868 for (i = 0; i < pad_len; i++) {
869 if (buf < end) *buf++ =
' ';
882 const char * start = fmt;
905 for (; *fmt ; fmt++) {
912 if ((fmt != start) || !(*fmt)) {
949 if (isdigit((
int)(*fmt))) {
951 }
else if (
'*' == *fmt) {
963 if (isdigit((
int)(*fmt))) {
968 }
else if (*fmt ==
'*') {
979 if ((
'h' == *fmt) || (
'l' == *fmt) || (
'L' == *fmt) ||
980 (
'z' == *fmt) || (
'Z' == *fmt) || (
't' == *fmt) ||
1039#if defined(XWLIBCFG_SPF_FLOAT) && (1U == XWLIBCFG_SPF_FLOAT)
1041# if defined(XWLIBCFG_SPF_LONG_DOUBLE) && (1U == XWLIBCFG_SPF_LONG_DOUBLE)
1055# if defined(XWLIBCFG_SPF_LONG_DOUBLE) && (1U == XWLIBCFG_SPF_LONG_DOUBLE)
1068# if defined(XWLIBCFG_SPF_LONG_DOUBLE) && (1U == XWLIBCFG_SPF_LONG_DOUBLE)
1082# if defined(XWLIBCFG_SPF_LONG_DOUBLE) && (1U == XWLIBCFG_SPF_LONG_DOUBLE)
1095# if defined(XWLIBCFG_SPF_LONG_DOUBLE) && (1U == XWLIBCFG_SPF_LONG_DOUBLE)
1180 size = (
xwsz_t)(end - buf);
1184 const char * oldfmt = fmt;
1187 switch (spec.
type) {
1191 if (copy > end - str) {
1194 memcpy(str, oldfmt, (
xwsz_t)copy);
1219 c = (char)va_arg(args,
int);
1240 va_arg(args,
void *), spec);
1241 while (isalnum((
int)(*fmt))) {
1260#if defined(XWLIBCFG_SPF_FLOAT) && (1U == XWLIBCFG_SPF_FLOAT)
1267# if defined(XWLIBCFG_SPF_LONG_DOUBLE) && (1U == XWLIBCFG_SPF_LONG_DOUBLE)
1277 switch (spec.
type) {
1279 num = (
xwu64_t)va_arg(args,
long long);
1282 num = (
xwu64_t)va_arg(args,
unsigned long);
1285 num = (
xwu64_t)va_arg(args,
long);
1295 num = (
xwu64_t)va_arg(args, ptrdiff_t);
1298 num = (
xwu64_t)va_arg(args, intmax_t);
1301 num = (
xwu64_t)va_arg(args, uintmax_t);
1304 num = (
xwu64_t)va_arg(args,
int);
1307 num = (
xwu64_t)va_arg(args,
int);
1310 num = (
xwu64_t)va_arg(args,
int);
1313 num = (
xwu64_t)va_arg(args,
int);
1316 num = (
xwu64_t)va_arg(args,
int);
1319 num = (
xwu64_t)va_arg(args,
unsigned int);
1342 va_start(args, fmt);
1343 i =
xwvsnpf(buf, size, fmt, args);
1349int xwvspf(
char * buf,
const char * fmt, va_list args)
1354int xwspf(
char * buf,
const char * fmt, ...)
1359 va_start(args, fmt);
1360 i =
xwvspf(buf, fmt, args);
xwu32_t xwdiv64(xwu64_t *n, xwu32_t divisor)
64位除法运算
int xwspf(char *buf, const char *fmt,...)
格式化字符串(同sprintf)
int xwsnpf(char *buf, xwsz_t size, const char *fmt,...)
格式化字符串(同snprintf)
int xwvsnpf(char *buf, xwsz_t size, const char *fmt, va_list args)
格式化字符串(同vsnprintf)
int xwvspf(char *buf, const char *fmt, va_list args)
格式化字符串(同vsprintf)
static char * xwvsnpf_format_widen_string(char *buf, xwssz_t n, char *end, struct xwvsnpf_format_spec spec)
static int xwvsnpf_format_decode(const char *fmt, struct xwvsnpf_format_spec *spec)
static char * xwvsnpf_put_float_decimal(char *buf, char *end, unsigned long long num, int digits)
static char * xwvsnpf_format_strip_trailing_zeros(char *tmp, char *p)
static char * xwvsnpf_format_string(char *buf, char *end, const char *s, struct xwvsnpf_format_spec spec)
static char * xwvsnpf_format_pointer(const char *fmt, char *buf, char *end, void *ptr, struct xwvsnpf_format_spec spec)
static char * xwvsnpf_format_string_nocheck(char *buf, char *end, const char *s, struct xwvsnpf_format_spec spec)
@ XWVSNPF_FT_PERCENT_CHAR
@ XWVSNPF_FT_LONG_DOUBLE_GENERAL
@ XWVSNPF_FT_LONG_DOUBLE_SCI
@ XWVSNPF_FT_FLOAT_GENERAL
static char * xwvsnpf_put_dec_trunc(char *buf, unsigned int q)
#define XWVSNPF_F_SPECIAL
static void xwvsnpf_format_move_right(char *buf, char *end, xwssz_t len, xwssz_t spaces)
static const char xwvsnpf_nullstr[]
static char * xwvsnpf_format_long_double(char *buf, char *end, long double num, struct xwvsnpf_format_spec spec)
static char * xwvsnpf_put_dec_full(char *buf, unsigned int q)
#define XWVSNPF_F_ZEROPAD
static const char xwvsnpf_digits[]
static char * xwvsnpf_format_number(char *buf, char *end, xwu64_t num, struct xwvsnpf_format_spec spec)
static char * xwvsnpf_format_float(char *buf, char *end, double num, struct xwvsnpf_format_spec spec)
static int xwvsnpf_skip_atoi(const char **s)
static char * xwvsnpf_put_dec(char *buf, unsigned long long num)