XWOS API  4.0
XWOS C/C++ API参考手册
载入中...
搜索中...
未找到
spf 的协作图:

函数

int xwvsnpf (char *buf, xwsz_t size, const char *fmt, va_list args)
 格式化字符串(同vsnprintf)
 
int xwsnpf (char *buf, xwsz_t size, const char *fmt,...)
 格式化字符串(同snprintf)
 
int xwvspf (char *buf, const char *fmt, va_list args)
 格式化字符串(同vsprintf)
 
int xwspf (char *buf, const char *fmt,...)
 格式化字符串(同sprintf)
 

详细描述

函数说明

◆ xwvsnpf()

int xwvsnpf ( char *  buf,
xwsz_t  size,
const char *  fmt,
va_list  args 
)

格式化字符串(同vsnprintf)

< left justified

< unsigned/signed long

在文件 xwspf.c965 行定义.

966{
967 int rc;
968 xwu64_t num;
969 char * str, * end;
970 struct xwvsnpf_format_spec spec = {0};
971
972 if (size > XWSSZ_MAX) {
973 /* Reject out-of-range values early. */
974 rc = 0;
975 goto err_oor;
976 }
977
978 str = buf;
979 end = buf + size;
980
981 /* Make sure end is always >= buf */
982 if (end < buf) {
983 end = ((void *)-1);
984 size = (xwsz_t)(end - buf);
985 }
986
987 while (*fmt) {
988 const char * oldfmt = fmt;
989 int read = xwvsnpf_format_decode(fmt, &spec);
990 fmt += read;
991 switch (spec.type) {
992 case XWVSNPF_FT_NONE: {
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
1004 case XWVSNPF_FT_WIDTH:
1005 spec.field_width = (xws16_t)va_arg(args, int);
1006 break;
1007
1009 spec.precision = (xws16_t)va_arg(args, int);
1010 break;
1011
1012 case XWVSNPF_FT_CHAR: {
1013 char c;
1014
1015 if (!(spec.flags & XWVSNPF_F_LEFT)) {
1016 while (--spec.field_width > 0) {
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;
1028 while (--spec.field_width > 0) {
1029 if (str < end) {
1030 *str = ' ';
1031 }
1032 ++str;
1033 }
1034 break;
1035 }
1036
1037 case XWVSNPF_FT_STR:
1038 str = xwvsnpf_format_string(str, end, va_arg(args, char *),
1039 spec);
1040 break;
1041
1042 case XWVSNPF_FT_PTR:
1043 str = xwvsnpf_format_pointer(fmt+1, str, end,
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
1057 case XWVSNPF_FT_INVALID:
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 /* XWLIBCFG_SPF_LONG_DOUBLE */
1076#endif /* XWLIBCFG_SPF_FLOAT */
1077
1078 default:
1079 switch (spec.type) {
1081 num = (xwu64_t)va_arg(args, long long);
1082 break;
1083 case XWVSNPF_FT_ULONG:
1084 num = (xwu64_t)va_arg(args, unsigned long);
1085 break;
1086 case XWVSNPF_FT_LONG:
1087 num = (xwu64_t)va_arg(args, long);
1088 break;
1089 case XWVSNPF_FT_XWSZ_T:
1090 if (spec.flags & XWVSNPF_F_SIGN) {
1091 num = (xwu64_t)va_arg(args, xwssz_t);
1092 } else {
1093 num = (xwu64_t)va_arg(args, xwsz_t);
1094 }
1095 break;
1096 case XWVSNPF_FT_PTRDIFF:
1097 num = (xwu64_t)va_arg(args, ptrdiff_t);
1098 break;
1099 case XWVSNPF_FT_UBYTE:
1100 num = (xwu64_t)va_arg(args, int);
1101 break;
1102 case XWVSNPF_FT_BYTE:
1103 num = (xwu64_t)va_arg(args, int);
1104 break;
1105 case XWVSNPF_FT_USHORT:
1106 num = (xwu64_t)va_arg(args, int);
1107 break;
1108 case XWVSNPF_FT_SHORT:
1109 num = (xwu64_t)va_arg(args, int);
1110 break;
1111 case XWVSNPF_FT_INT:
1112 num = (xwu64_t)va_arg(args, int);
1113 break;
1114 default:
1115 num = (xwu64_t)va_arg(args, unsigned int);
1116 }
1117 str = xwvsnpf_format_number(str, end, num, spec);
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}
unsigned long xwsz_t
Definition type.h:339
uint64_t xwu64_t
Definition type.h:303
signed long xwssz_t
Definition type.h:355
#define XWSSZ_MAX
Definition type.h:367
int16_t xws16_t
Definition type.h:246
xws16_t precision
Definition xwspf.c:65
xws16_t field_width
Definition xwspf.c:64
static int xwvsnpf_format_decode(const char *fmt, struct xwvsnpf_format_spec *spec)
Definition xwspf.c:717
static char * xwvsnpf_format_string(char *buf, char *end, const char *s, struct xwvsnpf_format_spec spec)
Definition xwspf.c:385
#define XWVSNPF_F_LEFT
Definition xwspf.c:25
static char * xwvsnpf_format_pointer(const char *fmt, char *buf, char *end, void *ptr, struct xwvsnpf_format_spec spec)
Definition xwspf.c:399
@ XWVSNPF_FT_NONE
Definition xwspf.c:30
@ XWVSNPF_FT_LONG
Definition xwspf.c:40
@ XWVSNPF_FT_PTRDIFF
Definition xwspf.c:48
@ XWVSNPF_FT_WIDTH
Definition xwspf.c:31
@ XWVSNPF_FT_PRECISION
Definition xwspf.c:32
@ XWVSNPF_FT_SHORT
Definition xwspf.c:44
@ XWVSNPF_FT_INT
Definition xwspf.c:46
@ XWVSNPF_FT_BYTE
Definition xwspf.c:42
@ XWVSNPF_FT_STR
Definition xwspf.c:34
@ XWVSNPF_FT_LONG_LONG
Definition xwspf.c:38
@ XWVSNPF_FT_UBYTE
Definition xwspf.c:41
@ XWVSNPF_FT_XWSZ_T
Definition xwspf.c:47
@ XWVSNPF_FT_PERCENT_CHAR
Definition xwspf.c:36
@ XWVSNPF_FT_ULONG
Definition xwspf.c:39
@ XWVSNPF_FT_INVALID
Definition xwspf.c:37
@ XWVSNPF_FT_CHAR
Definition xwspf.c:33
@ XWVSNPF_FT_PTR
Definition xwspf.c:35
@ XWVSNPF_FT_USHORT
Definition xwspf.c:43
#define XWVSNPF_F_SIGN
Definition xwspf.c:22
static char * xwvsnpf_format_number(char *buf, char *end, xwu64_t num, struct xwvsnpf_format_spec spec)
Definition xwspf.c:171
函数调用图:
这是这个函数的调用关系图:

◆ xwsnpf()

int xwsnpf ( char *  buf,
xwsz_t  size,
const char *  fmt,
  ... 
)

格式化字符串(同snprintf)

在文件 xwspf.c1133 行定义.

1134{
1135 va_list args;
1136 int i;
1137
1138 va_start(args, fmt);
1139 i = xwvsnpf(buf, size, fmt, args);
1140 va_end(args);
1141
1142 return i;
1143}
int xwvsnpf(char *buf, xwsz_t size, const char *fmt, va_list args)
格式化字符串(同vsnprintf)
Definition xwspf.c:965
函数调用图:

◆ xwvspf()

int xwvspf ( char *  buf,
const char *  fmt,
va_list  args 
)

格式化字符串(同vsprintf)

在文件 xwspf.c1145 行定义.

1146{
1147 return xwvsnpf(buf, INT_MAX, fmt, args);
1148}
#define INT_MAX
Definition type.h:95
函数调用图:
这是这个函数的调用关系图:

◆ xwspf()

int xwspf ( char *  buf,
const char *  fmt,
  ... 
)

格式化字符串(同sprintf)

在文件 xwspf.c1150 行定义.

1151{
1152 va_list args;
1153 int i;
1154
1155 va_start(args, fmt);
1156 i = xwvspf(buf, fmt, args);
1157 va_end(args);
1158 return i;
1159}
int xwvspf(char *buf, const char *fmt, va_list args)
格式化字符串(同vsprintf)
Definition xwspf.c:1145
函数调用图: