lib_libvsprintf.c:add option in Kconfig to control "%p*" special format specifier.

Signed-off-by: likun17 <likun17@xiaomi.com>
This commit is contained in:
likun17 2024-09-20 14:58:46 +08:00 committed by GUIDINGLI
parent 83914d5b29
commit 9de0465a8a
4 changed files with 44 additions and 19 deletions

View file

@ -55,30 +55,38 @@ do \
void vwarn(FAR const char *fmt, va_list ap)
{
#ifdef CONFIG_LIBC_PRINT_EXTENSION
int error = get_errno();
struct va_format vaf;
#ifdef va_copy
# ifdef va_copy
va_list copy;
va_copy(copy, ap);
vaf.fmt = fmt;
vaf.va = &copy;
#else
# else
vaf.fmt = fmt;
vaf.va = &ap;
#endif
# endif
#ifdef CONFIG_FILE_STREAM
# ifdef CONFIG_FILE_STREAM
fprintf(stderr, "%d: %pV: %s\n", _SCHED_GETTID(), &vaf, strerror(error));
#else
# else
dprintf(STDERR_FILENO, "%d: %pV: %s\n", _SCHED_GETTID(),
&vaf, strerror(error));
#endif
# endif
#ifdef va_copy
# ifdef va_copy
va_end(copy);
# endif
#else
# ifdef CONFIG_FILE_STREAM
vfprintf(stderr, fmt, ap);
# else
vdprintf(STDERR_FILENO, fmt, ap);
# endif
#endif
}
@ -88,28 +96,36 @@ void vwarn(FAR const char *fmt, va_list ap)
void vwarnx(FAR const char *fmt, va_list ap)
{
#ifdef CONFIG_LIBC_PRINT_EXTENSION
struct va_format vaf;
#ifdef va_copy
# ifdef va_copy
va_list copy;
va_copy(copy, ap);
vaf.fmt = fmt;
vaf.va = &copy;
#else
# else
vaf.fmt = fmt;
vaf.va = &ap;
#endif
# endif
#ifdef CONFIG_FILE_STREAM
# ifdef CONFIG_FILE_STREAM
fprintf(stderr, "%d: %pV\n", _SCHED_GETTID(), &vaf);
#else
# else
dprintf(STDERR_FILENO, "%d: %pV\n", _SCHED_GETTID(), &vaf);
#endif
# endif
#ifdef va_copy
# ifdef va_copy
va_end(copy);
# endif
#else
# ifdef CONFIG_FILE_STREAM
vfprintf(stderr, fmt, ap);
# else
vdprintf(STDERR_FILENO, fmt, ap);
# endif
#endif
}

View file

@ -106,4 +106,10 @@ config LIBC_SCANSET
---help---
Add scanset support to sscanf().
config LIBC_PRINT_EXTENSION
bool
default n
---help---
Enables vsprintf supports using "%p*" to print.
endmenu #Standard C I/O

View file

@ -1119,6 +1119,7 @@ str_lpad:
break;
case 'p':
#ifdef CONFIG_LIBC_PRINT_EXTENSION
c = fmt_char(fmt);
switch (c)
{
@ -1133,22 +1134,22 @@ str_lpad:
case 'V':
{
FAR struct va_format *vaf = (FAR void *)(uintptr_t)x;
#ifdef va_copy
# ifdef va_copy
va_list copy;
va_copy(copy, *vaf->va);
lib_vsprintf(stream, vaf->fmt, copy);
va_end(copy);
#else
# else
lib_vsprintf(stream, vaf->fmt, *vaf->va);
#endif
# endif
continue;
}
case 'S':
case 's':
{
#ifdef CONFIG_ALLSYMS
# ifdef CONFIG_ALLSYMS
FAR const struct symtab_s *symbol;
FAR void *addr = (FAR void *)(uintptr_t)x;
size_t symbolsize;
@ -1173,7 +1174,7 @@ str_lpad:
continue;
}
#endif
# endif
break;
}
@ -1181,6 +1182,7 @@ str_lpad:
fmt_ungetc(fmt);
break;
}
#endif
flags |= FL_ALT;

View file

@ -5,6 +5,7 @@
config ALLSYMS
bool "Load all symbols for debugging"
select LIBC_PRINT_EXTENSION
default n
---help---
Say Y here to let the nuttx print out symbolic crash information and