966{
967 int rc;
969 char * str, * end;
971
973
974 rc = 0;
975 goto err_oor;
976 }
977
978 str = buf;
979 end = buf + size;
980
981
982 if (end < buf) {
983 end = ((void *)-1);
984 size = (
xwsz_t)(end - buf);
985 }
986
987 while (*fmt) {
988 const char * oldfmt = fmt;
990 fmt += read;
993 int copy = read;
994 if (str < end) {
995 if (copy > end - str) {
996 copy = end - str;
997 }
998 memcpy(str, oldfmt, (
xwsz_t)copy);
999 }
1000 str += read;
1001 break;
1002 }
1003
1006 break;
1007
1010 break;
1011
1013 char c;
1014
1017 if (str < end) {
1018 *str = ' ';
1019 }
1020 ++str;
1021 }
1022 }
1023 c = (char)va_arg(args, int);
1024 if (str < end) {
1025 *str = c;
1026 }
1027 ++str;
1029 if (str < end) {
1030 *str = ' ';
1031 }
1032 ++str;
1033 }
1034 break;
1035 }
1036
1039 spec);
1040 break;
1041
1044 va_arg(args, void *), spec);
1045 while (isalnum((int)(*fmt))) {
1046 fmt++;
1047 }
1048 break;
1049
1051 if (str < end) {
1052 *str = '%';
1053 }
1054 ++str;
1055 break;
1056
1058 if (str < end) {
1059 *str = '%';
1060 }
1061 ++str;
1062 break;
1063
1064#if defined(XWLIBCFG_SPF_FLOAT) && (1U == XWLIBCFG_SPF_FLOAT)
1065 case XWVSNPF_FT_FLOAT:
1066 case XWVSNPF_FT_FLOAT_SCI:
1067 str = xwvsnpf_format_float(str, end, va_arg(args, double), spec);
1068 break;
1069
1070# if defined(XWLIBCFG_SPF_LONG_DOUBLE) && (1U == XWLIBCFG_SPF_LONG_DOUBLE)
1071 case XWVSNPF_FT_LONG_DOUBLE:
1072 case XWVSNPF_FT_LONG_DOUBLE_SCI:
1073 str = xwvsnpf_format_long_double(str, end, va_arg(args, long double), spec);
1074 break;
1075# endif
1076#endif
1077
1078 default:
1079 switch (spec.
type) {
1081 num = (
xwu64_t)va_arg(args,
long long);
1082 break;
1084 num = (
xwu64_t)va_arg(args,
unsigned long);
1085 break;
1087 num = (
xwu64_t)va_arg(args,
long);
1088 break;
1092 } else {
1094 }
1095 break;
1097 num = (
xwu64_t)va_arg(args, ptrdiff_t);
1098 break;
1100 num = (
xwu64_t)va_arg(args,
int);
1101 break;
1103 num = (
xwu64_t)va_arg(args,
int);
1104 break;
1106 num = (
xwu64_t)va_arg(args,
int);
1107 break;
1109 num = (
xwu64_t)va_arg(args,
int);
1110 break;
1112 num = (
xwu64_t)va_arg(args,
int);
1113 break;
1114 default:
1115 num = (
xwu64_t)va_arg(args,
unsigned int);
1116 }
1118 }
1119 }
1120
1121 if (size > 0) {
1122 if (str < end) {
1123 *str = '\0';
1124 } else {
1125 end[-1] = '\0';
1126 }
1127 }
1128 rc = str - buf;
1129err_oor:
1130 return rc;
1131}
static int xwvsnpf_format_decode(const char *fmt, struct xwvsnpf_format_spec *spec)
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)
@ XWVSNPF_FT_PERCENT_CHAR
static char * xwvsnpf_format_number(char *buf, char *end, xwu64_t num, struct xwvsnpf_format_spec spec)