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

944{
945 int rc;
946 xwu64_t num;
947 char * str, * end;
948 struct xwvsnpf_format_spec spec = {0};
949
950 if (size > XWSSZ_MAX) {
951 /* Reject out-of-range values early. */
952 rc = 0;
953 goto err_oor;
954 }
955
956 str = buf;
957 end = buf + size;
958
959 /* Make sure end is always >= buf */
960 if (end < buf) {
961 end = ((void *)-1);
962 size = (xwsz_t)(end - buf);
963 }
964
965 while (*fmt) {
966 const char * oldfmt = fmt;
967 int read = xwvsnpf_format_decode(fmt, &spec);
968 fmt += read;
969 switch (spec.type) {
970 case XWVSNPF_FT_NONE: {
971 int copy = read;
972 if (str < end) {
973 if (copy > end - str) {
974 copy = end - str;
975 }
976 memcpy(str, oldfmt, (xwsz_t)copy);
977 }
978 str += read;
979 break;
980 }
981
982 case XWVSNPF_FT_WIDTH:
983 spec.field_width = (xws16_t)va_arg(args, int);
984 break;
985
987 spec.precision = (xws16_t)va_arg(args, int);
988 break;
989
990 case XWVSNPF_FT_CHAR: {
991 char c;
992
993 if (!(spec.flags & XWVSNPF_F_LEFT)) {
994 while (--spec.field_width > 0) {
995 if (str < end) {
996 *str = ' ';
997 }
998 ++str;
999 }
1000 }
1001 c = (char)va_arg(args, int);
1002 if (str < end) {
1003 *str = c;
1004 }
1005 ++str;
1006 while (--spec.field_width > 0) {
1007 if (str < end) {
1008 *str = ' ';
1009 }
1010 ++str;
1011 }
1012 break;
1013 }
1014
1015 case XWVSNPF_FT_STR:
1016 str = xwvsnpf_format_string(str, end, va_arg(args, char *),
1017 spec);
1018 break;
1019
1020 case XWVSNPF_FT_PTR:
1021 str = xwvsnpf_format_pointer(fmt+1, str, end,
1022 va_arg(args, void *), spec);
1023 while (isalnum((int)(*fmt))) {
1024 fmt++;
1025 }
1026 break;
1027
1029 if (str < end) {
1030 *str = '%';
1031 }
1032 ++str;
1033 break;
1034
1035 case XWVSNPF_FT_INVALID:
1036 if (str < end) {
1037 *str = '%';
1038 }
1039 ++str;
1040 break;
1041
1042 case XWVSNPF_FT_FLOAT:
1044 str = xwvsnpf_format_float(str, end, va_arg(args, double), spec);
1045 break;
1046
1049 str = xwvsnpf_format_long_double(str, end, va_arg(args, long double), spec);
1050 break;
1051
1052 default:
1053 switch (spec.type) {
1055 num = (xwu64_t)va_arg(args, long long);
1056 break;
1057 case XWVSNPF_FT_ULONG:
1058 num = (xwu64_t)va_arg(args, unsigned long);
1059 break;
1060 case XWVSNPF_FT_LONG:
1061 num = (xwu64_t)va_arg(args, long);
1062 break;
1063 case XWVSNPF_FT_XWSZ_T:
1064 if (spec.flags & XWVSNPF_F_SIGN) {
1065 num = (xwu64_t)va_arg(args, xwssz_t);
1066 } else {
1067 num = (xwu64_t)va_arg(args, xwsz_t);
1068 }
1069 break;
1070 case XWVSNPF_FT_PTRDIFF:
1071 num = (xwu64_t)va_arg(args, ptrdiff_t);
1072 break;
1073 case XWVSNPF_FT_UBYTE:
1074 num = (xwu64_t)va_arg(args, int);
1075 break;
1076 case XWVSNPF_FT_BYTE:
1077 num = (xwu64_t)va_arg(args, int);
1078 break;
1079 case XWVSNPF_FT_USHORT:
1080 num = (xwu64_t)va_arg(args, int);
1081 break;
1082 case XWVSNPF_FT_SHORT:
1083 num = (xwu64_t)va_arg(args, int);
1084 break;
1085 case XWVSNPF_FT_INT:
1086 num = (xwu64_t)va_arg(args, int);
1087 break;
1088 default:
1089 num = (xwu64_t)va_arg(args, unsigned int);
1090 }
1091 str = xwvsnpf_format_number(str, end, num, spec);
1092 }
1093 }
1094
1095 if (size > 0) {
1096 if (str < end) {
1097 *str = '\0';
1098 } else {
1099 end[-1] = '\0';
1100 }
1101 }
1102 rc = str - buf;
1103err_oor:
1104 return rc;
1105}
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:61
xws16_t field_width
Definition xwspf.c:60
static int xwvsnpf_format_decode(const char *fmt, struct xwvsnpf_format_spec *spec)
Definition xwspf.c:709
static char * xwvsnpf_format_string(char *buf, char *end, const char *s, struct xwvsnpf_format_spec spec)
Definition xwspf.c:381
#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:395
@ 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_FLOAT
Definition xwspf.c:49
@ XWVSNPF_FT_STR
Definition xwspf.c:34
@ XWVSNPF_FT_LONG_LONG
Definition xwspf.c:38
@ XWVSNPF_FT_FLOAT_SCI
Definition xwspf.c:50
@ 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_LONG_DOUBLE_SCI
Definition xwspf.c:52
@ XWVSNPF_FT_INVALID
Definition xwspf.c:37
@ XWVSNPF_FT_LONG_DOUBLE
Definition xwspf.c:51
@ 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_long_double(char *buf, char *end, long double num, struct xwvsnpf_format_spec spec)
Definition xwspf.c:576
static char * xwvsnpf_format_number(char *buf, char *end, xwu64_t num, struct xwvsnpf_format_spec spec)
Definition xwspf.c:167
static char * xwvsnpf_format_float(char *buf, char *end, double num, struct xwvsnpf_format_spec spec)
Definition xwspf.c:443
函数调用图:
这是这个函数的调用关系图:

◆ xwsnpf()

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

格式化字符串(同snprintf)

在文件 xwspf.c1107 行定义.

1108{
1109 va_list args;
1110 int i;
1111
1112 va_start(args, fmt);
1113 i = xwvsnpf(buf, size, fmt, args);
1114 va_end(args);
1115
1116 return i;
1117}
int xwvsnpf(char *buf, xwsz_t size, const char *fmt, va_list args)
格式化字符串(同vsnprintf)
Definition xwspf.c:943
函数调用图:

◆ xwvspf()

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

格式化字符串(同vsprintf)

在文件 xwspf.c1119 行定义.

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

◆ xwspf()

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

格式化字符串(同sprintf)

在文件 xwspf.c1124 行定义.

1125{
1126 va_list args;
1127 int i;
1128
1129 va_start(args, fmt);
1130 i = xwvspf(buf, fmt, args);
1131 va_end(args);
1132 return i;
1133}
int xwvspf(char *buf, const char *fmt, va_list args)
格式化字符串(同vsprintf)
Definition xwspf.c:1119
函数调用图: