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.c1161 行定义.

1162{
1163 int rc;
1164 xwu64_t num;
1165 char * str, * end;
1166 struct xwvsnpf_format_spec spec = {0};
1167
1168 if (size > XWSSZ_MAX) {
1169 /* Reject out-of-range values early. */
1170 rc = 0;
1171 goto err_oor;
1172 }
1173
1174 str = buf;
1175 end = buf + size;
1176
1177 /* Make sure end is always >= buf */
1178 if (end < buf) {
1179 end = ((void *)-1);
1180 size = (xwsz_t)(end - buf);
1181 }
1182
1183 while (*fmt) {
1184 const char * oldfmt = fmt;
1185 int read = xwvsnpf_format_decode(fmt, &spec);
1186 fmt += read;
1187 switch (spec.type) {
1188 case XWVSNPF_FT_NONE: {
1189 int copy = read;
1190 if (str < end) {
1191 if (copy > end - str) {
1192 copy = end - str;
1193 }
1194 memcpy(str, oldfmt, (xwsz_t)copy);
1195 }
1196 str += read;
1197 break;
1198 }
1199
1200 case XWVSNPF_FT_WIDTH:
1201 spec.field_width = (xws16_t)va_arg(args, int);
1202 break;
1203
1205 spec.precision = (xws16_t)va_arg(args, int);
1206 break;
1207
1208 case XWVSNPF_FT_CHAR: {
1209 char c;
1210
1211 if (!(spec.flags & XWVSNPF_F_LEFT)) {
1212 while (--spec.field_width > 0) {
1213 if (str < end) {
1214 *str = ' ';
1215 }
1216 ++str;
1217 }
1218 }
1219 c = (char)va_arg(args, int);
1220 if (str < end) {
1221 *str = c;
1222 }
1223 ++str;
1224 while (--spec.field_width > 0) {
1225 if (str < end) {
1226 *str = ' ';
1227 }
1228 ++str;
1229 }
1230 break;
1231 }
1232
1233 case XWVSNPF_FT_STR:
1234 str = xwvsnpf_format_string(str, end, va_arg(args, char *),
1235 spec);
1236 break;
1237
1238 case XWVSNPF_FT_PTR:
1239 str = xwvsnpf_format_pointer(fmt+1, str, end,
1240 va_arg(args, void *), spec);
1241 while (isalnum((int)(*fmt))) {
1242 fmt++;
1243 }
1244 break;
1245
1247 if (str < end) {
1248 *str = '%';
1249 }
1250 ++str;
1251 break;
1252
1253 case XWVSNPF_FT_INVALID:
1254 if (str < end) {
1255 *str = '%';
1256 }
1257 ++str;
1258 break;
1259
1260#if defined(XWLIBCFG_SPF_FLOAT) && (1U == XWLIBCFG_SPF_FLOAT)
1261 case XWVSNPF_FT_FLOAT:
1264 str = xwvsnpf_format_float(str, end, va_arg(args, double), spec);
1265 break;
1266
1267# if defined(XWLIBCFG_SPF_LONG_DOUBLE) && (1U == XWLIBCFG_SPF_LONG_DOUBLE)
1271 str = xwvsnpf_format_long_double(str, end, va_arg(args, long double), spec);
1272 break;
1273# endif /* XWLIBCFG_SPF_LONG_DOUBLE */
1274#endif /* XWLIBCFG_SPF_FLOAT */
1275
1276 default:
1277 switch (spec.type) {
1279 num = (xwu64_t)va_arg(args, long long);
1280 break;
1281 case XWVSNPF_FT_ULONG:
1282 num = (xwu64_t)va_arg(args, unsigned long);
1283 break;
1284 case XWVSNPF_FT_LONG:
1285 num = (xwu64_t)va_arg(args, long);
1286 break;
1287 case XWVSNPF_FT_XWSZ_T:
1288 if (spec.flags & XWVSNPF_F_SIGN) {
1289 num = (xwu64_t)va_arg(args, xwssz_t);
1290 } else {
1291 num = (xwu64_t)va_arg(args, xwsz_t);
1292 }
1293 break;
1294 case XWVSNPF_FT_PTRDIFF:
1295 num = (xwu64_t)va_arg(args, ptrdiff_t);
1296 break;
1298 num = (xwu64_t)va_arg(args, intmax_t);
1299 break;
1301 num = (xwu64_t)va_arg(args, uintmax_t);
1302 break;
1303 case XWVSNPF_FT_UBYTE:
1304 num = (xwu64_t)va_arg(args, int);
1305 break;
1306 case XWVSNPF_FT_BYTE:
1307 num = (xwu64_t)va_arg(args, int);
1308 break;
1309 case XWVSNPF_FT_USHORT:
1310 num = (xwu64_t)va_arg(args, int);
1311 break;
1312 case XWVSNPF_FT_SHORT:
1313 num = (xwu64_t)va_arg(args, int);
1314 break;
1315 case XWVSNPF_FT_INT:
1316 num = (xwu64_t)va_arg(args, int);
1317 break;
1318 default:
1319 num = (xwu64_t)va_arg(args, unsigned int);
1320 }
1321 str = xwvsnpf_format_number(str, end, num, spec);
1322 }
1323 }
1324
1325 if (size > 0) {
1326 if (str < end) {
1327 *str = '\0';
1328 } else {
1329 end[-1] = '\0';
1330 }
1331 }
1332 rc = str - buf;
1333err_oor:
1334 return rc;
1335}
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:69
xws16_t field_width
Definition xwspf.c:68
static int xwvsnpf_format_decode(const char *fmt, struct xwvsnpf_format_spec *spec)
Definition xwspf.c:879
static char * xwvsnpf_format_string(char *buf, char *end, const char *s, struct xwvsnpf_format_spec spec)
Definition xwspf.c:389
#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:403
@ XWVSNPF_FT_NONE
Definition xwspf.c:30
@ XWVSNPF_FT_LONG
Definition xwspf.c:40
@ XWVSNPF_FT_UINTMAX_T
Definition xwspf.c:50
@ 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_FLOAT
Definition xwspf.c:52
@ XWVSNPF_FT_STR
Definition xwspf.c:34
@ XWVSNPF_FT_LONG_LONG
Definition xwspf.c:38
@ XWVSNPF_FT_FLOAT_SCI
Definition xwspf.c:53
@ 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_LONG_DOUBLE_GENERAL
Definition xwspf.c:58
@ XWVSNPF_FT_ULONG
Definition xwspf.c:39
@ XWVSNPF_FT_INTMAX_T
Definition xwspf.c:49
@ XWVSNPF_FT_LONG_DOUBLE_SCI
Definition xwspf.c:57
@ XWVSNPF_FT_INVALID
Definition xwspf.c:37
@ XWVSNPF_FT_LONG_DOUBLE
Definition xwspf.c:56
@ XWVSNPF_FT_CHAR
Definition xwspf.c:33
@ XWVSNPF_FT_PTR
Definition xwspf.c:35
@ XWVSNPF_FT_FLOAT_GENERAL
Definition xwspf.c:54
@ XWVSNPF_FT_USHORT
Definition xwspf.c:43
#define XWVSNPF_F_SIGN
Definition xwspf.c:22
static char * xwvsnpf_format_long_double(char *buf, char *end, long double num, struct xwvsnpf_format_spec spec)
Definition xwspf.c:683
static char * xwvsnpf_format_number(char *buf, char *end, xwu64_t num, struct xwvsnpf_format_spec spec)
Definition xwspf.c:175
static char * xwvsnpf_format_float(char *buf, char *end, double num, struct xwvsnpf_format_spec spec)
Definition xwspf.c:488
函数调用图:
这是这个函数的调用关系图:

◆ xwsnpf()

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

格式化字符串(同snprintf)

在文件 xwspf.c1337 行定义.

1338{
1339 va_list args;
1340 int i;
1341
1342 va_start(args, fmt);
1343 i = xwvsnpf(buf, size, fmt, args);
1344 va_end(args);
1345
1346 return i;
1347}
int xwvsnpf(char *buf, xwsz_t size, const char *fmt, va_list args)
格式化字符串(同vsnprintf)
Definition xwspf.c:1161
函数调用图:

◆ xwvspf()

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

格式化字符串(同vsprintf)

在文件 xwspf.c1349 行定义.

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

◆ xwspf()

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

格式化字符串(同sprintf)

在文件 xwspf.c1354 行定义.

1355{
1356 va_list args;
1357 int i;
1358
1359 va_start(args, fmt);
1360 i = xwvspf(buf, fmt, args);
1361 va_end(args);
1362 return i;
1363}
int xwvspf(char *buf, const char *fmt, va_list args)
格式化字符串(同vsprintf)
Definition xwspf.c:1349
函数调用图: