XWOS API  4.0
XWOS C/C++ API参考手册
载入中...
搜索中...
未找到
xwspf.c 文件参考

XWOS通用库:格式化字符串 更多...

#include <xwos/standard.h>
#include <string.h>
#include <ctype.h>
#include <stddef.h>
#include <math.h>
#include <float.h>
#include <xwos/lib/div64.h>
xwspf.c 的引用(Include)关系图:

浏览源代码.

结构体

struct  xwvsnpf_format_spec
 

宏定义

#define XWVSNPF_F_ZEROPAD   0x01
 
#define XWVSNPF_F_SIGN   0x02
 
#define XWVSNPF_F_PLUS   0x04
 
#define XWVSNPF_F_SPACE   0x08
 
#define XWVSNPF_F_LEFT   0x10
 
#define XWVSNPF_F_SMALL   0x20
 
#define XWVSNPF_F_SPECIAL   0x40
 

枚举

enum  xwvsnpf_format_type_em {
  XWVSNPF_FT_NONE , XWVSNPF_FT_WIDTH , XWVSNPF_FT_PRECISION , XWVSNPF_FT_CHAR ,
  XWVSNPF_FT_STR , XWVSNPF_FT_PTR , XWVSNPF_FT_PERCENT_CHAR , XWVSNPF_FT_INVALID ,
  XWVSNPF_FT_LONG_LONG , XWVSNPF_FT_ULONG , XWVSNPF_FT_LONG , XWVSNPF_FT_UBYTE ,
  XWVSNPF_FT_BYTE , XWVSNPF_FT_USHORT , XWVSNPF_FT_SHORT , XWVSNPF_FT_UINT ,
  XWVSNPF_FT_INT , XWVSNPF_FT_XWSZ_T , XWVSNPF_FT_PTRDIFF
}
 

函数

static int xwvsnpf_skip_atoi (const char **s)
 
static char * xwvsnpf_put_dec_trunc (char *buf, unsigned int q)
 
static char * xwvsnpf_put_dec_full (char *buf, unsigned int q)
 
static char * xwvsnpf_put_dec (char *buf, unsigned long long num)
 
static char * xwvsnpf_format_number (char *buf, char *end, xwu64_t num, struct xwvsnpf_format_spec spec)
 
static void xwvsnpf_format_move_right (char *buf, char *end, xwssz_t len, xwssz_t spaces)
 
static char * xwvsnpf_format_widen_string (char *buf, xwssz_t n, char *end, struct xwvsnpf_format_spec spec)
 
static char * xwvsnpf_format_string_nocheck (char *buf, char *end, const char *s, 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)
 
static int xwvsnpf_format_decode (const char *fmt, struct xwvsnpf_format_spec *spec)
 
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)
 

变量

static const char xwvsnpf_digits [] = "0123456789ABCDEF"
 
static const char xwvsnpf_nullstr [] = "(null)"
 

详细描述

XWOS通用库:格式化字符串

作者

在文件 xwspf.c 中定义.

宏定义说明

◆ XWVSNPF_F_ZEROPAD

#define XWVSNPF_F_ZEROPAD   0x01

pad with zero

在文件 xwspf.c21 行定义.

◆ XWVSNPF_F_SIGN

#define XWVSNPF_F_SIGN   0x02

unsigned/signed long

在文件 xwspf.c22 行定义.

◆ XWVSNPF_F_PLUS

#define XWVSNPF_F_PLUS   0x04

show plus

在文件 xwspf.c23 行定义.

◆ XWVSNPF_F_SPACE

#define XWVSNPF_F_SPACE   0x08

space if plus

在文件 xwspf.c24 行定义.

◆ XWVSNPF_F_LEFT

#define XWVSNPF_F_LEFT   0x10

left justified

在文件 xwspf.c25 行定义.

◆ XWVSNPF_F_SMALL

#define XWVSNPF_F_SMALL   0x20

Must be 32 == 0x20

在文件 xwspf.c26 行定义.

◆ XWVSNPF_F_SPECIAL

#define XWVSNPF_F_SPECIAL   0x40

leading flag:0x

在文件 xwspf.c27 行定义.

枚举类型说明

◆ xwvsnpf_format_type_em

枚举值
XWVSNPF_FT_NONE 
XWVSNPF_FT_WIDTH 
XWVSNPF_FT_PRECISION 
XWVSNPF_FT_CHAR 
XWVSNPF_FT_STR 
XWVSNPF_FT_PTR 
XWVSNPF_FT_PERCENT_CHAR 
XWVSNPF_FT_INVALID 
XWVSNPF_FT_LONG_LONG 
XWVSNPF_FT_ULONG 
XWVSNPF_FT_LONG 
XWVSNPF_FT_UBYTE 
XWVSNPF_FT_BYTE 
XWVSNPF_FT_USHORT 
XWVSNPF_FT_SHORT 
XWVSNPF_FT_UINT 
XWVSNPF_FT_INT 
XWVSNPF_FT_XWSZ_T 
XWVSNPF_FT_PTRDIFF 

在文件 xwspf.c29 行定义.

29 {
30 XWVSNPF_FT_NONE, /* a string part */
49#if defined(XWLIBCFG_SPF_FLOAT) && (1U == XWLIBCFG_SPF_FLOAT)
50 XWVSNPF_FT_FLOAT,
51 XWVSNPF_FT_FLOAT_SCI,
52# if defined(XWLIBCFG_SPF_LONG_DOUBLE) && (1U == XWLIBCFG_SPF_LONG_DOUBLE)
53 XWVSNPF_FT_LONG_DOUBLE,
54 XWVSNPF_FT_LONG_DOUBLE_SCI,
55# endif /* XWLIBCFG_SPF_LONG_DOUBLE */
56#endif /* XWLIBCFG_SPF_FLOAT */
57};
@ 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_UINT
Definition xwspf.c:45
@ 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

函数说明

◆ xwvsnpf_skip_atoi()

static int xwvsnpf_skip_atoi ( const char **  s)
inlinestatic

在文件 xwspf.c72 行定义.

73{
74 int i = 0;
75
76 while (isdigit((int)(**s))) {
77 i = i * 10 + **s - '0';
78 (*s)++;
79 }
80 return i;
81}
这是这个函数的调用关系图:

◆ xwvsnpf_put_dec_trunc()

static char * xwvsnpf_put_dec_trunc ( char *  buf,
unsigned int  q 
)
inlinestatic

在文件 xwspf.c84 行定义.

85{
86 unsigned int d3, d2, d1, d0;
87
88 d1 = (q >> 4) & 0xf;
89 d2 = (q >> 8) & 0xf;
90 d3 = (q >> 12);
91
92 d0 = 6 * (d3 + d2 + d1) + (q & 0xf);
93 q = (d0 * 0xcd) >> 11;
94 d0 = d0 - 10 * q;
95 *buf++ = (char)d0 + '0';
96
97 d1 = q + 9 * d3 + 5 * d2 + d1;
98 if (d1 != 0) {
99 q = (d1 * 0xcd) >> 11;
100 d1 = d1 - 10 * q;
101 *buf++ = (char)d1 + '0'; /* next digit */
102
103 d2 = q + 2 * d2;
104 if ((d2 != 0) || (d3 != 0)) {
105 q = (d2 * 0xd) >> 7;
106 d2 = d2 - 10 * q;
107 *buf++ = (char)d2 + '0'; /* next digit */
108
109 d3 = q + 4 * d3;
110 if (d3 != 0) {
111 q = (d3 * 0xcd) >> 11;
112 d3 = d3 - 10 * q;
113 *buf++ = (char)d3 + '0'; /* next digit */
114 if (q != 0) {
115 *buf++ = (char)q + '0'; /* most sign. digit */
116 }
117 }
118 }
119 }
120 return buf;
121}
这是这个函数的调用关系图:

◆ xwvsnpf_put_dec_full()

static char * xwvsnpf_put_dec_full ( char *  buf,
unsigned int  q 
)
inlinestatic

在文件 xwspf.c124 行定义.

125{
126 unsigned int d3, d2, d1, d0;
127
128 d1 = (q >> 4) & 0xf;
129 d2 = (q >> 8) & 0xf;
130 d3 = (q >> 12);
131
132 d0 = 6 * (d3 + d2 + d1) + (q & 0xf);
133 q = (d0 * 0xcd) >> 11;
134 d0 = d0 - 10 * q;
135 *buf++ = (char)d0 + '0';
136
137 d1 = q + 9 * d3 + 5 * d2 + d1;
138 q = (d1 * 0xcd) >> 11;
139 d1 = d1 - 10 * q;
140 *buf++ = (char)d1 + '0';
141
142 d2 = q + 2 * d2;
143 q = (d2 * 0xd) >> 7;
144 d2 = d2 - 10 * q;
145 *buf++ = (char)d2 + '0';
146
147 d3 = q + 4 * d3;
148 q = (d3 * 0xcd) >> 11; /* - shorter code */
149 /* q = (d3 * 0x67) >> 10; - would also work */
150 d3 = d3 - 10 * q;
151 *buf++ = (char)d3 + '0';
152 *buf++ = (char)q + '0';
153
154 return buf;
155}
这是这个函数的调用关系图:

◆ xwvsnpf_put_dec()

static char * xwvsnpf_put_dec ( char *  buf,
unsigned long long  num 
)
inlinestatic

在文件 xwspf.c158 行定义.

159{
160 while (true) {
161 unsigned int rem;
162 if (num < 100000) {
163 return xwvsnpf_put_dec_trunc(buf, (unsigned int)num);
164 }
165 rem = xwdiv64((xwu64_t *)&num, 100000);
166 buf = xwvsnpf_put_dec_full(buf, rem);
167 }
168}
xwu32_t xwdiv64(xwu64_t *n, xwu32_t divisor)
64位除法运算
Definition div64.c:28
uint64_t xwu64_t
Definition type.h:303
static char * xwvsnpf_put_dec_trunc(char *buf, unsigned int q)
Definition xwspf.c:84
static char * xwvsnpf_put_dec_full(char *buf, unsigned int q)
Definition xwspf.c:124
函数调用图:
这是这个函数的调用关系图:

◆ xwvsnpf_format_number()

static char * xwvsnpf_format_number ( char *  buf,
char *  end,
xwu64_t  num,
struct xwvsnpf_format_spec  spec 
)
inlinestatic

< leading flag:0x

< Must be 32 == 0x20

< left justified

< pad with zero

< unsigned/signed long

< show plus

< space if plus

< pad with zero

< left justified

< left justified

< pad with zero

在文件 xwspf.c171 行定义.

174{
175 char tmp[66];
176 char sign;
177 char locase;
178 int need_pfx = ((spec.flags & XWVSNPF_F_SPECIAL) && spec.base != 10);
179 int i;
180 bool is_zero = num == 0LL;
181
182 locase = (char)(spec.flags & XWVSNPF_F_SMALL);
183 if (spec.flags & XWVSNPF_F_LEFT) {
184 spec.flags &= (xwu8_t)(~XWVSNPF_F_ZEROPAD);
185 }
186 sign = 0;
187 if (spec.flags & XWVSNPF_F_SIGN) {
188 if ((signed long long)num < 0) {
189 sign = '-';
190 num = (unsigned long long)(-(signed long long)num);
191 spec.field_width--;
192 } else if (spec.flags & XWVSNPF_F_PLUS) {
193 sign = '+';
194 spec.field_width--;
195 } else if (spec.flags & XWVSNPF_F_SPACE) {
196 sign = ' ';
197 spec.field_width--;
198 } else {}
199 }
200 if (need_pfx) {
201 if (16 == spec.base || 2 == spec.base) {
202 spec.field_width -= 2;
203 } else if (!is_zero) {
204 spec.field_width--;
205 } else {}
206 }
207
208 /* generate full string in tmp[], in reverse order */
209 i = 0;
210 if (num < spec.base) {
211 tmp[i++] = xwvsnpf_digits[num] | locase;
212 /* Generic code, for any base:
213 } else {
214 do {
215 tmp[i++] = (xwvsnpf_digits[xwdiv64(&num, base)] | locase);
216 } while (num != 0);
217 */
218 } else if (spec.base != 10) { /* 2, 8 or 16 */
219 int mask = spec.base - 1;
220 int shift = 3;
221
222 if (spec.base == 16) {
223 shift = 4;
224 } else if (spec.base == 2) {
225 shift = 1;
226 }
227 do {
228 tmp[i++] = (xwvsnpf_digits[((char)num) & mask] |
229 locase);
230 num >>= shift;
231 } while (num);
232 } else { /* base 10 */
233 i = xwvsnpf_put_dec(tmp, num) - tmp;
234 }
235
236 /* printing 100 using %2d gives "100", not "00" */
237 if (i > spec.precision) {
238 spec.precision = (xws16_t)i;
239 }
240 /* leading space padding */
241 spec.field_width -= spec.precision;
242 if (!(spec.flags & (XWVSNPF_F_ZEROPAD + XWVSNPF_F_LEFT))) {
243 while (--spec.field_width >= 0) {
244 if (buf < end) {
245 *buf = ' ';
246 }
247 buf++;
248 }
249 }
250 /* sign */
251 if (sign) {
252 if (buf < end) {
253 *buf = sign;
254 }
255 buf++;
256 }
257 /* "0x" / "0b" / "0" prefix */
258 if (need_pfx) {
259 if (spec.base == 16 || spec.base == 2 || !is_zero) {
260 if (buf < end) {
261 *buf = '0';
262 }
263 buf++;
264 }
265 if (spec.base == 16) {
266 if (buf < end) {
267 *buf = ('X' | locase);
268 }
269 buf++;
270 } else if (spec.base == 2) {
271 if (buf < end) {
272 *buf = ('B' | locase);
273 }
274 buf++;
275 }
276 }
277 /* zero or space padding */
278 if (!(spec.flags & XWVSNPF_F_LEFT)) {
279 char c = (spec.flags & XWVSNPF_F_ZEROPAD) ? '0' : ' ';
280 while (--spec.field_width >= 0) {
281 if (buf < end) {
282 *buf = c;
283 }
284 buf++;
285 }
286 }
287 /* hmm even more zero padding? */
288 while (i <= --spec.precision) {
289 if (buf < end) {
290 *buf = '0';
291 }
292 buf++;
293 }
294 /* actual xwvsnpf_digits of result */
295 while (--i >= 0) {
296 if (buf < end) {
297 *buf = tmp[i];
298 }
299 buf++;
300 }
301 /* trailing space padding */
302 while (--spec.field_width >= 0) {
303 if (buf < end) {
304 *buf = ' ';
305 }
306 buf++ ;
307 }
308
309 return buf;
310}
uint8_t xwu8_t
Definition type.h:194
int16_t xws16_t
Definition type.h:246
xws16_t precision
Definition xwspf.c:65
xws16_t field_width
Definition xwspf.c:64
#define XWVSNPF_F_PLUS
Definition xwspf.c:23
#define XWVSNPF_F_LEFT
Definition xwspf.c:25
#define XWVSNPF_F_SPACE
Definition xwspf.c:24
#define XWVSNPF_F_SPECIAL
Definition xwspf.c:27
#define XWVSNPF_F_SIGN
Definition xwspf.c:22
#define XWVSNPF_F_ZEROPAD
Definition xwspf.c:21
static const char xwvsnpf_digits[]
Definition xwspf.c:68
static char * xwvsnpf_put_dec(char *buf, unsigned long long num)
Definition xwspf.c:158
#define XWVSNPF_F_SMALL
Definition xwspf.c:26
函数调用图:
这是这个函数的调用关系图:

◆ xwvsnpf_format_move_right()

static void xwvsnpf_format_move_right ( char *  buf,
char *  end,
xwssz_t  len,
xwssz_t  spaces 
)
inlinestatic

在文件 xwspf.c313 行定义.

314{
315 xwssz_t size;
316
317 if (buf >= end) {
318 goto end;
319 }
320 size = (xwssz_t)((xwptr_t)end - (xwptr_t)buf);
321 if (size <= spaces) {
322 memset(buf, ' ', (xwsz_t)size);
323 goto end;
324 }
325 if (len > 0) {
326 if (len > size - spaces) {
327 len = size - spaces;
328 }
329 memmove(buf + spaces, buf, (xwsz_t)len);
330 }
331 memset(buf, ' ', (xwsz_t)spaces);
332end:
333 return;
334}
unsigned long xwsz_t
Definition type.h:339
signed long xwssz_t
Definition type.h:355
unsigned long xwptr_t
Definition type.h:375
这是这个函数的调用关系图:

◆ xwvsnpf_format_widen_string()

static char * xwvsnpf_format_widen_string ( char *  buf,
xwssz_t  n,
char *  end,
struct xwvsnpf_format_spec  spec 
)
inlinestatic

< left justified

在文件 xwspf.c337 行定义.

339{
340 xwssz_t spaces;
341
342 if (n >= (xwssz_t)spec.field_width) {
343 return buf;
344 }
345 spaces = (xwssz_t)spec.field_width - n;
346 if (0 == (spec.flags & XWVSNPF_F_LEFT)) {
347 xwvsnpf_format_move_right(buf - n, end, n, spaces);
348 return buf + spaces;
349 }
350 while (spaces > 0) {
351 spaces--;
352 if (buf < end) {
353 *buf = ' ';
354 }
355 buf++;
356 }
357 return buf;
358}
static void xwvsnpf_format_move_right(char *buf, char *end, xwssz_t len, xwssz_t spaces)
Definition xwspf.c:313
函数调用图:
这是这个函数的调用关系图:

◆ xwvsnpf_format_string_nocheck()

static char * xwvsnpf_format_string_nocheck ( char *  buf,
char *  end,
const char *  s,
struct xwvsnpf_format_spec  spec 
)
inlinestatic

在文件 xwspf.c361 行定义.

364{
365 xwssz_t len = 0;
366 xwssz_t limit = spec.precision;
367
368 while (limit) {
369 char c = *s;
370 s++;
371 if (0 == c) {
372 break;
373 }
374 if (buf < end) {
375 *buf = c;
376 }
377 buf++;
378 len++;
379 limit--;
380 }
381 return xwvsnpf_format_widen_string(buf, len, end, spec);
382}
static char * xwvsnpf_format_widen_string(char *buf, xwssz_t n, char *end, struct xwvsnpf_format_spec spec)
Definition xwspf.c:337
函数调用图:
这是这个函数的调用关系图:

◆ xwvsnpf_format_string()

static char * xwvsnpf_format_string ( char *  buf,
char *  end,
const char *  s,
struct xwvsnpf_format_spec  spec 
)
inlinestatic

在文件 xwspf.c385 行定义.

387{
388
389 if (NULL == s) {
390 s = xwvsnpf_nullstr;
391 if (spec.precision == -1) {
392 spec.precision = 2 * sizeof(void *);
393 }
394 }
395 return xwvsnpf_format_string_nocheck(buf, end, s, spec);
396}
#define NULL
Definition type.h:28
static char * xwvsnpf_format_string_nocheck(char *buf, char *end, const char *s, struct xwvsnpf_format_spec spec)
Definition xwspf.c:361
static const char xwvsnpf_nullstr[]
Definition xwspf.c:69
函数调用图:
这是这个函数的调用关系图:

◆ xwvsnpf_format_pointer()

static char * xwvsnpf_format_pointer ( const char *  fmt,
char *  buf,
char *  end,
void *  ptr,
struct xwvsnpf_format_spec  spec 
)
inlinestatic

< leading flag:0x

< Must be 32 == 0x20

< pad with zero

在文件 xwspf.c399 行定义.

401{
402 int default_width;
403
404 (void)fmt;
405 default_width = (int)(2 * sizeof(void *) +
406 (spec.flags & XWVSNPF_F_SPECIAL ? 2 : 0));
407 spec.flags |= XWVSNPF_F_SMALL;
408 if (spec.field_width == -1) {
409 spec.field_width = (xws16_t)default_width;
410 spec.flags |= XWVSNPF_F_ZEROPAD;
411 }
412 spec.base = 16;
413
414 return xwvsnpf_format_number(buf, end, (xwptr_t)ptr, spec);
415}
static char * xwvsnpf_format_number(char *buf, char *end, xwu64_t num, struct xwvsnpf_format_spec spec)
Definition xwspf.c:171
函数调用图:
这是这个函数的调用关系图:

◆ xwvsnpf_format_decode()

static int xwvsnpf_format_decode ( const char *  fmt,
struct xwvsnpf_format_spec spec 
)
inlinestatic

< left justified

< left justified

< show plus

< space if plus

< leading flag:0x

< pad with zero

< Must be 32 == 0x20

< Must be 32 == 0x20

< unsigned/signed long

< unsigned/signed long

< unsigned/signed long

< unsigned/signed long

< unsigned/signed long

在文件 xwspf.c717 行定义.

719{
720 const char * start = fmt;
721
722 /* we finished early by reading the field width */
723 if (spec->type == XWVSNPF_FT_WIDTH) {
724 if (spec->field_width < 0) {
725 spec->field_width = -spec->field_width;
726 spec->flags |= XWVSNPF_F_LEFT;
727 }
728 spec->type = XWVSNPF_FT_NONE;
729 goto precision;
730 }
731
732 /* we finished early by reading the precision */
733 if (spec->type == XWVSNPF_FT_PRECISION) {
734 if (spec->precision < 0) {
735 spec->precision = 0;
736 }
737 spec->type = XWVSNPF_FT_NONE;
738 goto qualifier;
739 }
740
741 /* By default */
742 spec->type = XWVSNPF_FT_NONE;
743 for (; *fmt ; fmt++) {
744 if ('%' == *fmt) {
745 break;
746 }
747 }
748
749 /* Return the current non-format string */
750 if ((fmt != start) || !(*fmt)) {
751 return fmt - start;
752 }
753
754 /* Process flags */
755 spec->flags = 0;
756 while (true) {
757 bool found = true;
758 fmt++;
759 switch (*fmt) {
760 case '-':
761 spec->flags |= XWVSNPF_F_LEFT;
762 break;
763 case '+':
764 spec->flags |= XWVSNPF_F_PLUS;
765 break;
766 case ' ':
767 spec->flags |= XWVSNPF_F_SPACE;
768 break;
769 case '#':
770 spec->flags |= XWVSNPF_F_SPECIAL;
771 break;
772 case '0':
773 spec->flags |= XWVSNPF_F_ZEROPAD;
774 break;
775 default:
776 found = false;
777 break;
778 }
779
780 if (!found) {
781 break;
782 }
783 }
784
785 /* get field width */
786 spec->field_width = -1;
787 if (isdigit((int)(*fmt))) {
789 } else if ('*' == *fmt) {
790 /* The next argument */
791 spec->type = XWVSNPF_FT_WIDTH;
792 fmt++;
793 return fmt - start;
794 } else {}
795
796precision:
797 /* get the precision */
798 spec->precision = -1;
799 if ('.' == (*fmt)) {
800 fmt++;
801 if (isdigit((int)(*fmt))) {
802 spec->precision = (xws16_t)xwvsnpf_skip_atoi(&fmt);
803 if (spec->precision < 0) {
804 spec->precision = 0;
805 }
806 } else if (*fmt == '*') {
807 /* it's the next argument */
809 fmt++;
810 return fmt - start;
811 } else {}
812 }
813
814qualifier:
815 /* get the conversion qualifier */
816 spec->qualifier = 0;
817 if (('h' == *fmt) || ('l' == *fmt) || ('L' == *fmt) ||
818 ('z' == *fmt) || ('Z' == *fmt) || ('t' == *fmt)) {
819 spec->qualifier = *fmt++;
820 if (spec->qualifier == *fmt) {
821 if ('l' == spec->qualifier) {
822 spec->qualifier = 'L';
823 fmt++;
824 } else if ('h' == spec->qualifier) {
825 spec->qualifier = 'H';
826 fmt++;
827 }
828 }
829 }
830
831 /* default base */
832 spec->base = 10;
833 switch (*fmt) {
834 case 'c':
835 spec->type = XWVSNPF_FT_CHAR;
836 fmt++;
837 return fmt - start;
838
839 case 's':
840 spec->type = XWVSNPF_FT_STR;
841 fmt++;
842 return fmt - start;
843
844 case 'p':
845 spec->type = XWVSNPF_FT_PTR;
846 return fmt - start;
847 /* skip alnum */
848
849 case '%':
851 fmt++;
852 return fmt - start;
853
854 case 'o':
855 spec->base = 8;
856 break;
857
858 case 'b':
859 spec->flags |= XWVSNPF_F_SMALL;
860 spec->base = 2;
861 break;
862
863 case 'B':
864 spec->base = 2;
865 break;
866
867 case 'x':
868 spec->flags |= XWVSNPF_F_SMALL;
869 spec->base = 16;
870 break;
871
872 case 'X':
873 spec->base = 16;
874 break;
875
876#if defined(XWLIBCFG_SPF_FLOAT) && (1U == XWLIBCFG_SPF_FLOAT)
877 case 'f':
878# if defined(XWLIBCFG_SPF_LONG_DOUBLE) && (1U == XWLIBCFG_SPF_LONG_DOUBLE)
879 if ('L' == spec->qualifier) {
880 spec->type = XWVSNPF_FT_LONG_DOUBLE;
881 } else {
882 spec->type = XWVSNPF_FT_FLOAT;
883 }
884# else
885 spec->type = XWVSNPF_FT_FLOAT;
886# endif
887 fmt++;
888 return fmt - start;
889
890 case 'e':
891 spec->flags |= XWVSNPF_F_SMALL;
892# if defined(XWLIBCFG_SPF_LONG_DOUBLE) && (1U == XWLIBCFG_SPF_LONG_DOUBLE)
893 if ('L' == spec->qualifier) {
894 spec->type = XWVSNPF_FT_LONG_DOUBLE_SCI;
895 } else {
896 spec->type = XWVSNPF_FT_FLOAT_SCI;
897 }
898# else
899 spec->type = XWVSNPF_FT_FLOAT_SCI;
900# endif
901 fmt++;
902 return fmt - start;
903
904 case 'E':
905# if defined(XWLIBCFG_SPF_LONG_DOUBLE) && (1U == XWLIBCFG_SPF_LONG_DOUBLE)
906 if ('L' == spec->qualifier) {
907 spec->type = XWVSNPF_FT_LONG_DOUBLE_SCI;
908 } else {
909 spec->type = XWVSNPF_FT_FLOAT_SCI;
910 }
911# else
912 spec->type = XWVSNPF_FT_FLOAT_SCI;
913# endif
914 fmt++;
915 return fmt - start;
916#endif /* XWLIBCFG_SPF_FLOAT */
917
918 case 'd':
919 case 'i':
920 spec->flags |= XWVSNPF_F_SIGN;
921 break;
922 case 'u':
923 break;
924
925 default:
926 spec->type = XWVSNPF_FT_INVALID;
927 return fmt - start;
928 }
929
930 if ('L' == spec->qualifier) {
932 } else if ('l' == spec->qualifier) {
933 if (spec->flags & XWVSNPF_F_SIGN) {
934 spec->type = XWVSNPF_FT_LONG;
935 } else {
936 spec->type = XWVSNPF_FT_ULONG;
937 }
938 } else if (('z' == spec->qualifier) || ('Z' == spec->qualifier)) {
939 spec->type = XWVSNPF_FT_XWSZ_T;
940 } else if ('t' == spec->qualifier) {
941 spec->type = XWVSNPF_FT_PTRDIFF;
942 } else if ('H' == spec->qualifier) {
943 if (spec->flags & XWVSNPF_F_SIGN) {
944 spec->type = XWVSNPF_FT_BYTE;
945 } else {
946 spec->type = XWVSNPF_FT_UBYTE;
947 }
948 } else if ('h' == spec->qualifier) {
949 if (spec->flags & XWVSNPF_F_SIGN) {
950 spec->type = XWVSNPF_FT_SHORT;
951 } else {
952 spec->type = XWVSNPF_FT_USHORT;
953 }
954 } else {
955 if (spec->flags & XWVSNPF_F_SIGN) {
956 spec->type = XWVSNPF_FT_INT;
957 } else {
958 spec->type = XWVSNPF_FT_UINT;
959 }
960 }
961 fmt++;
962 return fmt - start;
963}
xwu8_t qualifier
Definition xwspf.c:63
static int xwvsnpf_skip_atoi(const char **s)
Definition xwspf.c:72
函数调用图:
这是这个函数的调用关系图:

变量说明

◆ xwvsnpf_digits

const char xwvsnpf_digits[] = "0123456789ABCDEF"
static

在文件 xwspf.c68 行定义.

◆ xwvsnpf_nullstr

const char xwvsnpf_nullstr[] = "(null)"
static

在文件 xwspf.c69 行定义.