lib_vsprintf: Add %pV format support
test case: void test(const char *fmt, ...) { struct va_format vaf; va_list ap; va_start(ap, fmt); vaf.fmt = fmt; vaf.va = ≈ printf("func:%s, %pV, line:%d\n", __func__, &vaf, __LINE__); va_end(ap); } int main(int argc, FAR char *argv[]) { char str[] = "Hello Boy and Girl!"; int count = 10; test("%s %d", str, count); return 0; } >> test func:test, Hello Boy and Girl! 10, line:49 Signed-off-by: Jiuzhu Dong <dongjiuzhu1@xiaomi.com>
This commit is contained in:
parent
2438403f23
commit
dfb4b6e3d8
|
@ -104,6 +104,12 @@
|
||||||
|
|
||||||
typedef struct file_struct FILE;
|
typedef struct file_struct FILE;
|
||||||
|
|
||||||
|
struct va_format
|
||||||
|
{
|
||||||
|
FAR const char *fmt;
|
||||||
|
FAR va_list *va;
|
||||||
|
};
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Data
|
* Public Data
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
|
@ -117,6 +117,8 @@
|
||||||
# define fmt_char(fmt) (*(fmt)++)
|
# define fmt_char(fmt) (*(fmt)++)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define fmt_ungetc(fmt) ((fmt)--)
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Private Types
|
* Private Types
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
@ -459,6 +461,17 @@ static int vsprintf_internal(FAR struct lib_outstream_s *stream,
|
||||||
|
|
||||||
if (c == 'p')
|
if (c == 'p')
|
||||||
{
|
{
|
||||||
|
if (fmt_char(fmt) == 'V')
|
||||||
|
{
|
||||||
|
FAR struct va_format *vaf = va_arg(ap, void *);
|
||||||
|
vsprintf_internal(stream, NULL, 0, vaf->fmt, *vaf->va);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fmt_ungetc(fmt);
|
||||||
|
}
|
||||||
|
|
||||||
/* Determine size of pointer and set flags accordingly */
|
/* Determine size of pointer and set flags accordingly */
|
||||||
|
|
||||||
flags &= ~(FL_LONG | FL_REPD_TYPE);
|
flags &= ~(FL_LONG | FL_REPD_TYPE);
|
||||||
|
|
Loading…
Reference in New Issue